操作系统(2.4)--进程的描述与控制

简介: 进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

四、进程同步

进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。


1.基本概念

1.1两种形式的制约关系

在多道程序环境下,对于同处于一个系统中的多个进程,它们之间可能存在着以下两种形式的制约关系:

1)间接相互制约关系

多个程序在并发执行时,由于共享系统资源,如CPU、I/O 设备等,致使在这些并发执行的程序之间形成相互制约的关系。像打印机、磁带机这样的临界资源。


为了保证这些进程能有序地运行,对于系统中的这类资源,必须由系统实施统一分配,即用户在要使用之前,应先提出申请,而不允许用户进程直接使用。

2)直接相互制约关系

进程间的直接制约关系就是源于它们之间的相互合作。


例如,有两个相互合作的进程一输入进程 A和计算进程B,它们之间共享一个缓冲区。进程A通过缓冲向进程B提供数据。进程B从缓冲中取出数据,并对数据进行处理。但如果该缓冲空时,计算进程因不能获得所需数据而被阻塞。一旦进程 A把数据输入缓冲区后便将进程B唤醒;反之,当缓冲区已满时,进程A因不能再向缓冲区投放数据而被阻塞,当进程B将缓冲区数据取走后便可唤醒A。


1.2临界资源

限定进程只能互斥地访问的资源叫临界资源(指一次仅允许一个进程使用的资源)。


1.3临界区

人们把在每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。一个访问临界资源的循环进程描述如下:


一定有四个区,顺序不变。


repeat
entry section//进入区
critical section;//临界区
exit section//退出区
remainder section;//剩余区
until false;

1.4同步机制应遵循的规则

所有同步机制都应遵循下述四条准则:


(1)空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。

(2)忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。

(3)有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。

(4)让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。

2.硬件同步机制

2.1关中断

关中断是实现互斥的最简单的方法之一。


进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程切换。由此,保证了对锁的测试和关锁操作的连续性和完整性,有效地保证了互斥。


关中断的方法存在许多缺点:


①滥用关中断权力可能导致严重后果;


②关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力


③关中断方法也不适用于多CPU系统,因为在一个 处理器上关中断并不能防止进程在其它处理器上执行相同的临界段代码。


2.2利用Test-and-Set指令实现互斥

借助一条硬件指令———“测试并建立”


int TS(int *flag) // flag表示锁
{                 // flag=0为打开;为1为锁定
int temp;
temp=*flag;
*flag=1;//将锁锁定
return temp;//将锁的值作为函数值
};//函数值即为锁的当前状态值
while TS(lock) skip;//设锁是lock,
临界区;
lock=0;

2.3利用交换指令swap实现互斥

对换指令,在Intel 80x86中又被称为XCHG指令,用于交换两个字的内容。


wait(S){
while (S<=0);
S--;
signal(S)
S++;

3.信号量机制

3.1整型信号量

整型信号量定义为一一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作wait(S)和signal(S)来访问。这两个操作一直被分别称为P、V操作。

wait(S){
while (S<=0);
S--;
signal(S)
S++;


3.2记录型信号量

记录型信号量机制是一种不存在“忙等”现象的进程同步机制。采取了“让权等待”的策略后出现多个进程等待访问同一临界资源的情况。


在信号量机制中,引入两个数据结构:


整型变量value:用于表示资源数目;进程链表指针list:用于链接所有等待进程。


typedef struct {
int value; 
struct process_control_block *list;
}semaphore;
相应地,wait(S)和 signal(S)操作可描述如下:
wait(semaphore *S) {
S->value--;
if (S->value < 0) block(S->list);
}
signal(semaphore *S) {
S->value++;
if (S->value<=0) wakeup(S->list);
}

4.信号量的应用

信号量S值的物理含义:


当S≥0时,表示某类可用资源的数目,或者说表示可以执行P操作而不会被阻塞的进程的数目;当S<0时,其绝对值表示信号量S的阻塞队列中的进程数,即系统中因请求该类资源而被阻塞的进程的数目,亦即被信号灯挡住的进程数目,这些进程需要别的进程发出相应的信号灯来唤醒。另外,S的值只能由P、V操作来改变。


用P、V操作原语实现进程的互斥

(1)分析清楚题目涉及的临界资源,临界区。

(2)设置信号量(包括信号量的个数和初值及其物理含义),有几个临界资源设置几个互斥信号量,互斥信号量的初值为1。

(3)给出进程相应程序的算法描述或流程控制,并把P、V操作加到临界区上下位置。


用P、V操作原语实现进程的同步

(1)分析清楚题目涉及的进程间的制约关系。

(2)设置信号量(包括信号量的个数和初值及其物理含义),合作进程间需要收发几条消息相应就设置几个信号量。同步信号量的初值一般为0,表示得到合作进程的消息后才能向前推进。

(3)给出进程相应程序的算法描述或流程控制,并把P、V操作加到程序的适当处。

目录
相关文章
|
21天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
46 1
|
25天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
23天前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
22天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
23天前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
23天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
24天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
27天前
|
算法 Linux 调度
深入浅出操作系统的进程管理
本文通过浅显易懂的语言,向读者介绍了操作系统中一个核心概念——进程管理。我们将从进程的定义出发,逐步深入到进程的创建、调度、同步以及终止等关键环节,并穿插代码示例来直观展示进程管理的实现。文章旨在帮助初学者构建起对操作系统进程管理机制的初步认识,同时为有一定基础的读者提供温故知新的契机。
|
26天前
|
消息中间件 算法 调度
深入理解操作系统之进程管理
本文旨在通过深入浅出的方式,带领读者探索操作系统中的核心概念——进程管理。我们将从进程的定义和重要性出发,逐步解析进程状态、进程调度、以及进程同步与通信等关键知识点。文章将结合具体代码示例,帮助读者构建起对进程管理机制的全面认识,并在实践中加深理解。
|
28天前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。