进程同步的基本概念
进程同步机制对相关进程在执行次序上进行协调,使并发的进程之间按一定规则共享资源,使程序的执行具有可再现性。
两种形式的制约关系
1.间接制约:进程间无关,但都要使用临界资源
2.直接制约:进程间协作,需要按照某些规则运行
临界资源
一次仅允许一个进程使用的资源称为临界资源。
临界区
每个进程访问临界资源的那段代码(对于进程本身而言)
同步机制应遵守的规则
1.空闲让进:临界资源 为空闲状态时,允许一个进程进入自己的临界区
2.忙则等待:临界资源被访问时,使其他试图进入临界区的进程等待
3.有限等待:保证等待的进程在有限时间内能进入临界区,避免死锁
4.让权等待:进程无法进入临界区时释放处理机
硬件同步机制
1.关中断
2.利用硬件指令Test-and-Set
3.利用对换指令Swap
(非侧重)
信号量机制
整型信号量
一个用于表示资源数目的整型量S,除初始化外还有P,V操作(wait,signal操作)
P操作(申请资源)
wait(S){
while(S<=0); //在资源数目不大于0时阻塞
S--; //不阻塞,则占据1单位的资源,S数目减一
}
V操作(释放资源)
signal(S){
S++; //使用完毕后释放资源,S数目加一
}
未遵循让权等待原则,使进程处于“忙等”状态。
记录型信号量
在整型信号量基础上增加了一个进程链表指针,用于连接所有等待的进程
typedef struct{
int value; //资源数目
struct process_control_block *list; //链表指针
}semaphore;
P操作
wait(semaphore *S){
S.value--;
if(S.value<0)
block(S.list);
}
V操作
signal(semaphore *s){
S.value++;
if(SS.value<=0)
wakeup(S.list);
}
s.value初值表示系统中某类资源的数目
P(wait)操作,表示进程请求一个单位的资源,value-=1
当s.value<0时表示该类资源已经分配完毕,进程调用block进行自我阻塞,放弃处理机并插入到信号量列表s.list中(让权等待)
s.value为负数时表示信号量链表中阻塞的进程数目
V(wait)操作,表示进程释放一个单位的资源,value+=1
若value+=1后仍为负,表示仍有进行需要该资源(value+=1仅是资源的记录加一,并未将资源实际分配),调用wakeup将阻塞队列中的第一个进程唤醒。
AND型信号量
进程需要多个资源时,一次性分配给其全部所需资源,使用完毕后将资源全部释放,使用AND信号量避免死锁。
P操作
Swait(S1,S2....Sn)
V操作
Ssignal(S1,S2....Sn)
信号量集
对AND型信号量进行扩充,一次分配一定数量的各种资源(而不是一个),进程对某资源的需求为d,该资源的分配下限为t(S>t时才可分配)
P操作
Swait(S1,t1,d1,S2,t2,d2....Sn,tn,dn)
V操作
Ssignal(S1,t1,d1,S2,t2,d2....Sn,tn,dn)
信号量的应用
实现进程互斥
经典问题
1.生产者消费者问题
2.哲学家进餐问题
3.读者写者问题
详见下章
线程
概念引入
进程的属性
1.可拥有资源的独立单位
2.独立调度和分派的基本单位
进程拥有资源,在创建、撤销、切换中,系统时空开销较大,所以为了减少开销,将第二个属性独立出来产生线程,作为调度和分派的基本属性。
进程与线程的比较
1.调度的基本单位
进程开销大,线程开销小
同一进程下线程的切换不会引起进程的切换
不同进程下线程的切换,进程也会切换
2.并发性
一个进程下的多个线程可以并发,多个进程下的多个线程也可以并发。
更加有效的 提高系统资源利用率和系统吞吐量。
3.拥有资源
线程除拥有自己 的少量资源意外还拥有,还允许多个线程共享该进程的所有资源。
4.独立性
同一进程下的不同线程之间独立性低(一般为了合作,提高并发性)
不同进程中的线程之间独立性高
5.系统开销
线程的开销比进程小很多
6.支持多处理机系统
多个线程可分配到多个处理机上并行执行。
仅为个人学习整理归纳……