3.进程之间是怎么协作的?
进程间的协作:进程通信,进程同步
3.1 进程通信
概念:进程通信即进程间的信息交换
进程是资源分配的基本单位,各进程内存空间彼此独立
一个进程不能随意访问其它进程的地址空间
特点:
共享存储(Shared-Memory)
消息传递(Message-Passing)
管道通信(Pipe)
3.1.1 进程通信:共享存储(Shared-Memory)
基于共享数据结构的通信方式
多个进程共用某个数据结构(OS提供并控制)
由用户(程序员)负责同步处理
低级通信:可以传递少量数据,效率低
基于共享存储区的通信方式
多个进程共用内存中的一块存储区域
由进程控制数据的形式和方式方式
高级通信:可以传递大量数据,效率高
3.1.2 进程通信:消息传递(Message-Passing)
直接通信:点到点发送
发送和接收时指明双方进程的ID
每个进程维护一个消息缓冲队列
间接通信:广播信箱
以信箱为媒介,作为中间实体
发进程将消息发送到信箱,收进程从信箱读取
可以广播,容易建立双向通信链
3.1.3 进程通信:管道通信(Pipe)
管道
用于连接读/写进程的共享文件,pipe文件
本质是内存中固定大小的缓冲区
半双工通信
同一时段只能单向通信,双工通信需要两个管道
以先进先出(FIFO)方式组织数据传输
通过系统调用read()/write()函数进行读写操作
3.2 进程同步
协调进程间的相互制约关系,使它们按照预期的方式执行的过程
前提
进程是并发执行的,进程间存在着相互制约关系
并发的进程对系统共享资源进行竞争
进程通信,过程中相互发送的信号称为消息或事件
两种相互制约形式
间接相互制约关系(互斥):进程排他性地访问共享资源
直接相互制约关系(同步):进程间的合作,比如管道通信
3.2.1 进程同步:互斥的访问临界资源
访问过程
进入区:尝试进入临界区,成功则加锁(lock)
临界区:访问共享资源
退出区:解锁(unlock),唤醒其它阻塞进程
剩余区:其它代码
访问原则
空闲让进:临界区空闲,允许一个进程进入
忙则等待:临界区已有进程,其它进程等待(阻塞状态)
有限等待:处于等待的进程,等待时间有限
让权等待:等待时应让出CPU执行权,防止“忙等待”
软件实现方法
单标志法:违背“空闲让进”
双标志法先检查:违背“忙则等待”
双标志法后检查:
违背“空闲让进”、“有限等待”
皮特森算法(Peterson’s Algorithm)
违背“让权等待”,会发生“忙等”
硬件实现方法
中断屏蔽方法:关中断/开中断
禁止一切中断,CPU执行完临界区之前不会切换
关中断可能会被滥用
关中断时间长影响效率
不适用于多处理机,无法防止其它处理机调度其它进程访问临界区
只适用于内核进程(该指令运行在内核态)
硬件实现方法
中断屏蔽方法:关中断/开中断
Test-And-Set(TS指令/TSL指令)
读出标志并设置为true,返回旧值,原子操作
也被称作TSL指令( Test-And-Set-Lock )
违背“让权等待”,会发生忙等Swap指令( EXCHANGE,XCHG指令)
交换两个变量的值,原子操作
违背“让权等待”
信号量(Semaphore)机制
PV操作:
P操作:wait原语,进程等待
V操作:signal原语,唤醒等待进程
整型信号量:违背“让权等待”,会发生忙等记录型信号量:进程进入阻塞状态,不会忙等
3.2.2 进程同步:管程(Monitor,监视器)
“管理进程”,即用于实现进程同步的工具。是由代表共享资源的数据结构和一组过程(进行PV操作的函数)组成的管理程序(封装)。
管程的组成
管程名称
局部于管程内部的共享数据结构
对该数据结构操作的一组过程(函数)
管程内共享数据的初始化语句
管程的基本特性
是一个模块化的基本程序单位,可以单独编译
是一种抽象数据类型,包含数据和操作
信息掩蔽,共享数据只能被管程内的过程访问
条件变量/条件对象
进入管程的进程可能由于条件不满足而阻塞
此时进程应释放管程以便其它进程调用管程
进程被阻塞的条件(原因)有多个,移入不同的条件队列
进程被移入条件队列后,应释放管程
3.2.3 进程同步:经典同步问题
生产者-消费者问题
读者写者问题
哲学家进餐问题
吸烟者问题
生产者-消费者问题
一组生产者进程和一组消费者进程
它们共享大小为n的缓冲区
未满可放,非空可读,否则阻塞
每次只允许一个生产者/消费者放/读,// 整型信号量,表示可用资源数 int S = 1; // wait原语,相当于进入区 void wait(int S) { // 资源不够,循环等待 while (S <= 0); S = S - 1; } // signal原语,相当于退出区 void signal(int S) { S = S + 1; }
读者-写者问题
读者进程和写者两组并发进程
它们共享同一个文件
要求:
允许多个读者同时读
只允许一个写者写
任一写者完成前,不可读写
写者操作前,已有读者写者退出
哲学家进餐问题
5名哲学家,每2人间有一根筷子
每2根筷子间有一碗米饭
哲学家要么思考,要么进餐
要求:
拿起左右两根筷子才能进餐
一根一根地拿起,若其中任一筷子在他人手上,等待
进餐完成后,放下筷子,继续思考
吸烟者问题
三个抽烟者进程,一个供应者进程
抽烟者需要三种材料卷烟:烟草、纸和胶水
三个抽烟者分别拥有烟草、纸、胶水
要求:
供应者无限提供三种材料,但每次只提供两种
拥有第三种材料的抽烟者卷烟成功并抽掉
抽烟成功者给供应者发信号:已完成
供应者收到完成信号后再提供两种材料放到桌子上