一、进程同步
基本概念:进程之间的资源共享和合作;
进程之间存在着两种形式的相互制约关系:
- 间接相互制约:进程之间需要互斥访问同一种资源
- 直接相互制约:进程之间存在合作关系,eg:A完成后B才能执行
二、临界区
不管是软件资源还是硬件资源,多个进程之间都必须互斥访问。
访问临界资源的代码段称为临界区,进入临界区之前对需要访问的资源进行检测查看是否能够访问的代码段称为进入区,临界区之后是退出区,恢复资源可访问的标识。其他代码段称为剩余区
同步机制应遵循的规则:(1)空闲让进;(2)忙则等待;(3)有限等待(避免陷入死等);(4)让权等待(当进程访问不到需要的临界资源时,释放处理机)
三、信号量机制
1.整形信号量:表示资源数目,仅能通过原子操作访问wait()和signal() 又称为P,V操作;
wait()操作申请资源信号量减一,signal()操作释放资源信号量加一;
eg:wait(s) : while s<=0 do no-op;
wait(s)//申请信号量s
while s<=0 do no-op;//若s<=0(即申请不到资源),则一直测试直到申请到资源
//do no-op 表示当条件满足时一直测试,直到条件不满足才执行接下来的语句;
//违背让权等待原则
2.记录型信号量:定义整形变量表示资源数量的同时定义进程链表指针链接等待的进程
eg:type semaphore=record //定义记录型信号量
value: integer ; //某个整数,表示该资源的数量
L: list of process; //等待的进程队列
end (注意end后面没有分号!)
//相应的PV操作:
procedure wait(s)
var s:semaphore; //s是记录型信号量
begin
s.value:=s.value-1; //假设可以分配到资源,资源数-1
if s.value<0 then block(s.L); //若假设分配后资源数<0,表示已没有可分配的资源,调用block阻塞自己,同时该进程放入等待的L队列中
procedure signal(s) //释放资源
var s:semapahore;
begin
s.value:s.value+1; //释放资源,可申请的资源数+1
if s.value<=0 then wakeup(s.L); //资源数+1后仍<0表示等待队列中还有进程,调用wakeup唤醒
end
3.AND信号量:一个进程需要同时申请多个资源时,若逐一申请容易造成死锁问题(不同进程占据着各自所需的资源导致所有进程都不能正常运行)。AND机制是将进程需要的资源一次性分配给进程,若其中任何资源申请不到,则进程的不到任何所需的资源,AND机制是在wait操作的基础上加上AND记为是swait,定义如下:
swait(S1,S2,......Sn)
if S1>1 and S2>1 and.....and Sn>1 then
........
end
4.信号量集:有时进程对同一个资源不仅需要访问一次,进行多次的wait操作十分低效。信号量集在swait的基础上实验同一资源的多个申请,定义如下:s为信号量,t为下限值,d为需求量
swait(S1,T1,D1,...Sn,Tn,Dn)
if Si>=Ti and ... and Sn>Tn then //资源数大于下限要求可以进行分配
......
Si=Si-Di; //根据不同需求进行分配
end
四、信号量的应用
1.实现资源的互斥访问
2.实现程序语句之间的前趋关系
五、管程
管程由四部分组成:(1)管程名称
(2)管程内部共享的数据结构说明
(3)对数据进行操作的过程
(4) 对数据设置初值的语句
管程中不仅包含数据(信号量)还包含对数据的处理语句
管程的特征:
- 模块化:管程是一个基本程序单位,可以单独编译
- 抽象数据类型:不仅有数据,还有对数据的处理
- 信息遮掩:管程中的数据只能被管程中的过程访问
- 管程是操作系统中的资源管理模块,供进程调用,不会随着进程的撤销而撤销
六、进程通信
低级通信:一般只传递几个字节的信息。
高级通信:大批量数据传递,可分为:共享存储管理系统、消息传递系统、管道通信系统三种方式
- 共享存储管理系统:可分为共享数据结构和共享存储区两种,前者用于传递少量数据,后者用于传递大量数据。
- 消息传递系统:分为直接通信和间接通信,直接通信是通过OS提供的发送指令将数据直接发送给目标进程;间接通信是发送的消息暂存进程共享的数据结构中作为中转
- 管道通信系统:共享文件的方式,连接一个写进程和一个读进程。写进程向文件中写入数据,读进程从文件中获取数据。
七、线程
线程是比进程更小的可独立运行的基本单位。
引入线程是为了减少程序并发时的时空开销,使操作系统具有更好的并发性。
线程的特征:
- 线程不独立拥有资源(进程才是资源分配的基本单位)
- 是可以独立调度的基本单位
- 是可以独立运行的基本单位
- 动态性、并发性、异步性、独立性
线程是进程的一个实体,一个进程中可建立多个线程共享进程拥有的全部资源。
多个线程之间并发执行,进程中所有线程执行完毕代表进程执行完毕。
线程也有就绪、执行、阻塞三个基本状态,而没有挂起状态。
1.内核级线程:由内核的内部需求进行创建和撤销,用于执行指定的函数;
2.用户级线程:由应用软件利用线程库来控制,调度在软件内部执行
多线程os中的进程:
- 在多线程os中,进程仍是资源分配的基本单位
- 一个进程对应多个线程
- 进程不是一个可执行的实体,而把线程作为独立运行的基本单位
八、线程间的同步和通信
1.互斥锁(mutex)
互斥锁有两种状态:开锁和关锁;
当一个线程需要读\写一个共享数据时,线程首先将该数据段的mutex设置为关锁状态,若已经处于关锁则试图访问该数据段的线程将被阻塞。
2.条件变量和信号量机制
条件变量:在创建一个互斥锁时联系一个条件变量。互斥锁的目的是保证对临界区的互斥使用,而条件变量则用于线程的长期等待,直至等待的资源都得到分配;
信号量机制:与进程相同