操作系统之进程同步

本文详细探讨了操作系统中进程同步的问题,重点介绍了基于共享内存的协作进程如何避免竞争条件。文章通过生产者-消费者问题展示了临界区的概念,并讨论了Peterson算法、TestAndSet指令以及信号量作为同步手段的优缺点。还提到了自旋锁、死锁以及经典同步问题如有限缓冲、读者写者问题和哲学家进餐问题的解决方案。最后,文章提及了管程作为更安全的进程同步工具。
摘要由CSDN通过智能技术生成

 进程同步
前面我们提到了协作进程,协作进程就是会影响其他进程,即会共享逻辑地址空间,即共享内存系统,对于这种情况,很有可能会同时访问同一变量导致出错。还有一个是独立进程,是不会影响的进程。消息传递的协作进程不会导致进程同步问题。

所以我们这章讨论的是基于共享内存的协作进程。


竞争条件:多个进程并发访问同一数据切数据的结果与执行进程先后有关。
临界区:临界区只能允许一个进程执行。
进程分为进入区,临界区,退出区,剩余区。进入区需要有表示请求进入临界区的代码,退出区要有表示退出临界区的代码。
临界区问题:有空则进,无空则等,有限等待。

在操作系统内,执行内核代码也会遇到临界区问题。
在执行内核代码时,分为抢占内核和非抢占内核。
非抢占内核:在一个进程进入内核模式后,不允许另一个进程也进入。 因此不会导致竞争条件。

抢占内核因为允许在内核中执行的进程被抢占,所以会发生数据不一致。

对于SMP结构更难控制,因为进程在不同处理器上。

Peterson算法:用于处理临界区问题。 Peterson算法的宗旨是“谦让”,因为一开始都先把机会留给另一个人。
do
{
 flag[i]=true;
 turn=j;
 while(flag[j]&&turn==j);
 ...
 flag[i]=false;
}while(TRUE);

flag表示想要进入临界区,turn是能进入临界区。

前面讲的是通过软件进行同步,后面开始讲硬件同步。
对于单处理器,在修改共享变量时需要禁止中断出现,从而实现了非抢占内核。

对于多处理器,采用前面通知禁止中断则不可行,因为需要将禁止中断发送给全部的处理器,速度慢。因此需要一个机器指令,能够原子地执行。
原子地:不可中断。

书上直接讲TestAndSet的例子显得太突然,不好上手,所以查了下资料,逐步讲起。

do{

    while(turn!=i);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值