弄懂“进程”(下):进程的控制、同步和通信
进程控制
是进程管理的主要功能,负责创建和终止进程、进程执行过程中的状态转换。
由操作系统内核通过原语实现。
1.OS内核
常驻内存的、紧靠硬件的软件层次,运行在系统态(又称管态、内核态),以免遭到用户程序的破坏。
主要包括:一些与硬件紧密相关的模块(如中断处理程序),各种常用设备的驱动程序,运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作)。
2.原语
由若干条指令组成,用来执行某个特定操作。
其执行具有原子性,即执行过程中不允许被中断。
常驻内存,且在系统态下执行。
3.进程的创建
创建子进程的进程被称为父进程,子进程又可以创建子进程,形成进程图。
进程创建原语完成,其主要任务是创建PCB。
具体过程:从PCB集合申请空闲的PCB,然后为新进程分配内存等资源,再根据父进程提供的参数和分配到的资源情况对PCB进行初始化,然后将新进程插入就绪队列。
4.进程的终止
发生在进程完成任务或遇到异常情况和外界干预需要结束时。
进程终止原语完成,实质是回收PCB。
具体过程:找到待终止进程的PCB,终止执行,设置重新调度标志,终止其一切子孙进程,释放全部资源,移出队列,回收PCB。
5.进程的阻塞和唤醒
当正在执行的进程需要等待某种事件的完成或本身无新工作可做:
执行状态+阻塞原语=阻塞状态
当阻塞进程等待的事情完成了:
阻塞状态+唤醒原语=就绪状态
6.进程的挂起与**
活动阻塞状态+挂起原语=静止阻塞状态
活动就绪状态/执行状态+挂起原语=静止就绪状态
静止阻塞状态+**原语=活动阻塞状态
静止就绪状态+**原语=活动就绪状态
进程同步
和进程并发要区分开,进程同步是指对多个相关进程在执行次序上进行协调。
使得系统中诸进程可以按照一定的规则(或者时序),共享资源或相互合作,从而使得程序的进程具有可再现性。
用来实现同步的机制被称作同步机制。
1.进程间的两种相互制约关系
间接:两个进程之间要共享相同的资源,一个正在占用,另一个则处于阻塞状态,只有等前者释放后者才被唤醒。
直接:两个进程有合作,比如D等着C向缓冲里面放数据,缓冲里没数据,D就阻塞着,缓冲已经满了,C就阻塞。
2.临界资源和临界区
临界资源:一次只允许被一个进程使用的资源。如打印机、共享变量。
临界区:访问临界资源的那段代码。
要想互斥地使用临界资源,就要保证进程互斥地进入临界区。
措施:临界区前面加一段代码,称为进入区,可用来检查对应资源是否正在被其他进程访问,相应地,临界区后面有一段退出区,用来将临界区从正被访问的标识恢复为未被访问的标识。
3.同步机制遵循的4条规则
空闲让进。当临界资源空闲就要允许请求进入临界区使用临界资源的进程进入。
忙则等待。和上一条相对。
有限等待。避免“死等”,任何请求进入临界区的进程要在有限时间内进入。
让权等待。避免“忙等(白等)”,不能进入临界区的进程要立即释放CPU。
4.信号量机制
是一种同步机制,发展历程:整型信号量->记录型信号量->信号量集。
整型信号量
是非负的、共享的整数,用来表示一类临界资源的数目。
只在三种情况下改变:初始化,P操作,V操作。
P操作即wait
wait(S){
while(S<=0);
S--;
}
只要S小于0,wait操作就会不断地测试,不符合让权等待原则。
V操作即signal,表示释放资源
signal(S){
S++;
}
记录型信号量
除了有整型表示资源量,还有一个进程链表指针,连接所有等待该类资源的进程。
符合让权等待原则,主要是因为有block原语,当资源量小于0的时候,调用这个原语自我阻塞,将PCB插入信号量等待队列中。
应用
1.实现前驱关系
要是有Pi->Pj,即进程Pi是Pj的直接前驱,Pj必须在Pi完成后才能进行
可以设置初值为0的公共信号量S,在Pi后面加Signal(S),在Pj前面加wait(S)。
2.实现多个进程互斥地访问某临界资源
设置初值为1的互斥信号量mutex,在每个进程的临界区前后分别加wait(mutex)和signal(mutex)。
5.经典进程同步问题
生产者-消费者
哲学家进餐
读者-写者
进程通信
根据信息量多寡和通信效率高低将进程通信分为低级和高级。
前面提到的互斥进制和共享存储器系统属于低级通信。
1.共享存储器系统
通过读写共享存储区来交换数据。
2.管道通信
管道指连接了两个进程的共享文件。管道是临界资源。必须采用互斥机制。
3.消息传递系统
数据交换以格式化的消息为单位。
分为直接和间接两类。
所谓直接,就是源进程直接把消息发送给目的进程。
所谓间接,就是在收发进程间引入了信箱,这样通信可以是非实时的。
4.C/S系统
分为套接字、远程过程调用、远程方法调用。
5.消息缓冲队列通信机制
媒介:内存中公用的消息缓冲区
对应第三小节中的直接通信
最重要的数据结构是消息缓冲区,可以描述为
struct message_buffer{
int sender;//发送进程的标识符
int size;//消息长度
char *text;//消息正文
struct message_buffer *next;//指向下一消息缓冲区的指针
}
PCB中需要加入一下数据项
mq:消息缓冲队列队首指针
mutex:消息缓冲队列的互斥信号量
sm:消息缓冲队列的资源信号量
OS会提供发送原语send和接收原语receive。
参考: 《计算机操作系统(第四版)--学习指导与题解》 梁红兵 汤小丹 汤子瀛
推荐阅读
-
弄懂“进程”(下):进程的控制、同步和通信
-
Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
-
Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
-
python的multiprocessing多进程通信的pipe和queue介绍
-
python的multiprocessing多进程通信的pipe和queue介绍_PHP教程
-
python的multiprocessing多进程通信的pipe和queue介绍
-
Linux下查看进程和线程的方法
-
Linux下查看进程打开的文件句柄数和如何修改方法
-
Linux下进程管理工具Supervisor的安装配置和基本使用
-
linux使用共享内存通信的进程同步退出问题