操作系统-进程同步机制
同步机制准则
- 空闲让进:若临界资源处于空闲状态,则应允许一个进程进入临界区访问临界资源
- 忙则等待:若已有进程进入临界区访问临界资源,则其它需要访问临界资源的进程必须等待,以实现对临界资源的互斥访问
- 有限等待:对临界资源进行等待的进程应在有限的时间内可以进入临界区,以免进入死等状态
- 让权等待:若进程由于无法进入临界区而发生等待,则应立即释放处理器,以免陷入忙等(空循环)状态
信号量机制
1965年由荷兰学者提出,最常见的由三种信号量
整形信号量
将一个用于标识资源数量的整型数S作为信号量,该信号量只能通过两个标准的原子操作wait(s)和signal(s)来访问,这两个操作分别称为P、V(荷兰语Proberen表示尝试,Verhogen表示增加)操作,用法是:
- 当一个进程需要申请一个资源时。可调用wait(S)操作,即P操作,表示减一操作
- 当一个进程使用完一个资源后需要释放时,可调用signal(S)操作,即V操作 ,表示加一操作
在wait(S)操作时,只要没有可用资源,当前进程就会进入忙等状态,直至S>0时,才会对S进行减一操作,没有满足让权等待的同步机制准则
记录型信号量
使用记录型(结构体)数据结构作为信号量,解决了整形信号量中未遵循让权等待准则问题。
信号量结构体中有两个变量:整形信号value(为正时,表示资源数量,为负时的绝对值表示等待该资源的进程的数量);PCB的阻塞队列(由于缺少该资源而阻塞的进程组成的阻塞队列)
执行过程:
- P操作:信号量的value减一,当value小于0,将该线程插入信号量结构体内的阻塞队列中
- V操作:信号量的value加一,当value小于等与0,唤醒阻塞队列中的一个进程
AND型信号量
为了防止在请求资源较多时,产生死锁问题。
执行过程:
- P操作:若所有资源都可用的情况下,将所有需要的资源信号数量减一,如果有不可用的资源,将这个进程放入第一个不可用资源的阻塞队列中
- V操作:遍历每个资源,资源数量加一,如果这个资源有阻塞队列,则唤醒其中一个进程。
信号量集
AND型信号量,需要遍历多次执行PV操作,不仅低效,有产生死锁的风险。
- 信号量集Swait(S1,t1,d1……Sn,tn,dn)t表示资源分配的下限,当S小于t时,将不予分配,发生阻塞;d表示在允许分配的前提下,下一次分配S的资源数量(单位)
- 信号量集Ssignal(S1,d1……Sn,dn)表示一次释放d个S资源。
对于信号量集,需要注意以下几种特殊用法:
- Swait(S1,1,1……Sn,1,1):其实就是AND型信号量的操作
- Swait(S,1,1):其实就是记录型的操作
- Swait(S,1,0):当资源S的数量小于1时发生阻塞,否则直接允许通过,一般用作开关
管程机制
信号量机制要求每个要访问临界资源的进程都必须自备同步PV操作。这不仅使得PV操作大量分散在了进程之中,而且如果使用不当(没有成对出现)就会导致系统死锁。
管程定义
管程是一种面向对象思想的体现。由一组共享数据结构及对这些数据的一组操作构成
管程结构
管程由四部分构成:
- 管程名称:不同共享资源及不同的操作可以构成不同的管程,不同的管程对象具有不同的名称
- 共享数据结构:这些共享数据结构是局部于管程之中的,用于描述共享资源
- 一组操作:这组操作用于操作共享数据结构。进程访问共享资源,即共享数据结构,只能通过这组管程内的操作完成。对临界资源的互斥访问就是通过这组操作完成的
- 初始化代码:是对局部与管程的共享数据进行初始化的代码,只在管程对象被创建时执行一次
管程同步
管程由请求和释放共享资源的进程调用。通过管程机制可以实现进程间对共享资源(共享数据结构)的同步访问
- 当某进程通过管程访问临界资源时,管程便调用条件x(共享资源)的wait原语cwait(x),若条件x未能满足,便使该进程阻塞,并将其排在条件x的阻塞队列上。
- 当某进程通过管程访问完毕临界资源时,其同时会改变条件x,即调用条件x的signal原语csignal(x),从条件x阻塞队列中唤醒一个进程。
经典进程同步问题
生产者-消费者问题
生产者-消费者问题是经典的合作制约关系的进程同步问题
问题描述:生产者与消费者具有一个公共缓冲池,该缓冲池中包含n个缓冲区,每个缓冲区可以存放一个数据。只要缓冲池中存在空缓冲区,生产者就可以将数据写入缓冲池,一旦缓冲池满,生产者就要停止生产;只要缓冲池中存在满缓冲区,消费者就可以从缓冲池中取走一条数据,一旦缓冲池空,消费者就要停止消费。
哲学家进餐问题
哲学家进餐问题是经典的互斥制约关系的进程同步问题
问题描述:由五个哲学家在同一张圆桌上用餐和思考。圆桌上为每个人配发了一只碗,但仅在他们的每个空隙中配发了一只筷子,即共只有五只筷子可用。要求他们交替进行用餐与思考。平时大家都在思考,当某个哲学家饥饿时会试图去取左右两边离他最近的筷子,只有拿到两只筷子时才能进餐,否则只能继续思考。进餐完毕,放下筷子开始思考。
读者-写者问题
读者写者问题是互斥制约与合作制约双重关系的进程同步问题
问题描述:一个被多个进程共享的文件、记录或数据结构,允许进程对其执行读、写操作。其允许多个进程同时读取,但只要有一个进程在读,就不能有进程对其进行写操作。同样,只要有一个进程在写,其它进程的读、写操作都不允许。