进程同步和互斥
一、进程同步和互斥概念
二、进程互斥的软件实现方法
三、进程互斥的硬件实现方法
四、信号量机制
可以解决进程同步、互斥问题
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而实现进程互斥(进程对临界资源的单独访问),进程同步(进程对临界资源的访问顺序)问题
信号量听名字,好像是个跟信号、电气沾边的东西,其实信号量就是一个变量,用来表示系统资源数量,比如打印机的数量,也可以理解为操作系统层面的变量,每个进程共享
注意信号量可以是整型变量,也可以是个结构体变量
原语就是一种特殊的程序段,它的执行是一气呵成,不可被中断的,比如A用户先检查厕所没人,然后进去上锁,这两个步骤是连贯的;试想如果A用户先检查厕所没人,这个时候操作系统剥夺它的处理机资源,就绪队列B用户上处理机,也检查到厕所没人然后上厕所,后面再切换回A用户,A也上厕所,就会出现2个用户同时上1个厕所的尴尬局面(没有实现进程互斥)
整型信号量
用1个整数型变量作为信号量,数值表示某种资源
跟普通整型变量区别,就是信号量只能执行初始化,申请、释放3种操作
存在问题,还是没有满足让权等待原则
记录型信号量
//记录型信号量的定义
typedef struct{
int value;//剩余资源数量
Struct process *L;//等待进程链表
}semaphore;
//使用时申请资源,资源不够进入等待队列
void wait (semaphore S){
S.value--;//系统资源数减1
//如果当前没有系统资源,该进程进入等待队列
if(S.value <= 0){
block(S.L);
}
}
//使用完释放资源,顺便唤醒等待队列的第一个进程
void signal(semaphore S){
S.value++;//系统资源数加1
//如果还有进程在等待队列,唤醒
if(S.value <= 0){
wakeup(S.L);
}
}
记录型信号量可以用来实现进程同步、进程互斥