进程协作
进程之间不共享内存资源
进程之间通信三种方式:共享存储、信息传递、管道通信
共享存储
基于共享数据结构的通信方式
- 共享数据结构是操作系统提供
- 可以传递少量数据,效率低
基于共享存储区通信方式
- 进程向操作系统申请一块内存
- 由进程决定数据的形式和方式
- 可以传递大量数据,效率高
消息传递
- 消息传递方式中,发送消息和接收消息由操作系统提供的原语完成
- 在点对点的消息传递方式中,进程各自维护一个消息缓冲队列,发送的消息放在队列中
- 点对点的方式,消息中有进程ID,消息类型和长度,消息主体
- 广播信箱的消息传递方式中,进程发送和接收消息都是通过信息信箱
- 广播信箱的好处是一个进程要对多个进程发送消息,把消息发送到信箱,让进程自己来获取
管道通信
- 管道是一块固定大小的缓冲区,存在的形式是一个pipe文件
- 在同一时段,只能有一个进程往管道写,一个进程从管道读,属于半双工
- 以先进先出的方式传递信息
- 通过write和read函数进行读写
- 管道通信规则:未满不读,已满不写,为空不写,已空不读,读后删除
进程同步
- 广义进程同步是指多个进程间有相互制约关系,是他们按照预期方式执行
- 狭义进程同步是指进程间互相合作,比如管道通信
- 狭义进程互斥是指进程排他性的访问共享资源
进程互斥
- 多个进程的共享资源叫做临界区
- 有一个进程进入临界区后,临界区加锁,其他进程无法进入
- 进入临界区失败的进程会进入阻塞状态
- 从临界区出来的进程会释放锁,并且唤醒阻塞状态的进程
临界区访问原则
- 临界区空闲,允许一个进程进入
- 临界区已有进程,其他进程等待
- 处于等待的进程,等待时间有限
- 等待时让出cpu执行权
进程互斥的实现
软件实现
- 软件实现存在四种方法:单标记法,双标记法先检查,双标记后检查,皮特森算法
- 皮特森算法满足临界区访问原则,缺点是循环语句那里会出现忙等待
单标记法
双标记法先执行
双标记法后检查
皮特森算法
硬件实现
中断屏蔽方法
- 使用关中断和开中断方式
- 适用于单核处理机
- 关中断时间长影响效率
- 只适用于内核进程
TS指令方法
- TS指令全称为:Test-And-Set,是一个原语
- 流程是先读取锁标志,如果为false表示没有上锁,则设置为true,并且将旧值返回,这一系列操作是原子性的
Swap指令(EXCHANGE,XCHG指令)
- 交替两个变量的值,这两个变量一个代表锁的旧值,一个代表新值
- 交替是原子操作
信号量机制
- 信号量是指可用资源数量(共享资源数量)
- 信号量机制是通过进程等待和唤醒等待线程操作完成的
- 记录型信号量定义中有剩余资源数和进程等待队列
- 释放资源时,signal原语会执行多次,直到等待队列中进程都被唤醒