操作系统学习笔记(3. 同步,通信,死锁)

本文详细介绍了操作系统中的进程同步和互斥,包括进程同步的四个方法(如单标志法、双标志先检查等)和进程互斥的硬件实现(如中断屏蔽、TestAndSet指令)。重点讲解了信号量机制,包括整型和记录型信号量,并通过哲学家吃面、生产者消费者问题和读者-写者问题阐述了同步与互斥的应用。此外,讨论了死锁的概念、必要条件、处理策略,特别是银行家算法在避免死锁中的应用。
摘要由CSDN通过智能技术生成

个人用书:操作系统教程 第五版 费翔林
学习视频: 王道计算机考研 操作系统.

进程同步,进程互斥

进程同步

回顾:进程有异步性,每个进程会以独立的,不可预知的速度推进。

同步,也称直接制约关系,完了完成任务建立的两个或者多个进程,需要在某些位置上协调他们的工作次序而产生的制约关系。

进程互斥

互斥,并发的进程不可避免的需要使用临界资源(一个时间段只能一个进程使用)。

对临界资源的访问分为四个部分

do	
{
	entry section;     //进入区,检查资源是否可以进入临界区,若可以进入,设置正在访问临界区资源标志。
	critical section;  //临界区,访问临界资源的代码。
	exit section;      //退出区,解除正在访问临界区标志。
	remainder section; //剩余区,其他处理。
} while (1)

!!临界区是进程中访问临界资源的代码段,进入区和退出区是负责实现互斥的代码段。

原则:

  1. 空闲让进。临界区空闲时,可以允许一个请求进图临界区的进程进入。
  2. 忙则等待。已经有进程进入,其他进程等待。
  3. 有限等待。保证有限时间进程进入临界区(不会饥饿)。
  4. 让权等待。进程不能进入临界区,则应该释放处理机。

进程互斥的软件实现方法(这四个方法都不满足 让权等待)

单标志法

算法思想:两个进程在访问完临界区后把临界区的权限给另一个进程。每一个进程进入临界区的权限只能另一个进程赋予。

int turn = 0; //turn 表示当前允许进入临界区的进程号

P0:                   P1:
while (turn != 0)      while(turn = 1)
critical section;      critical section;
turn = 1;              turn = 0;
remainder section;     remainder section;

turn初始值0,表示只能进程0号进入。只有进程0访问完后,将turn改变,P1才能开始访问。(P0时间片用完之后会进入P1,但是因为while条件不满足,P1死循环会一直到时间片用完,P1时间片过程中,资源一直是空闲的)

主要问题:违反了 空闲让进 原则。

双标志先检查

算法思想:设置布尔数组flag[],用各个元素标记进程想进入临界区的意愿。

bool flag[2];
flag[0] = false;
flag[1] = false; 

P0:                  P1:
while(flag[1])        while(flag[0])     //检查
flag[0] = true;       flag[1] = true;    //上锁
critical section;     critical section;
flag[0] = false;      flag[1] = false;
remainder section;    remainder section;

当P0已经使用,那么P1需要循环等待。

如果进程是并发的,在P0没有设置flag的时候执行了P1的判断,则会同时进入临界区。

主要问题:违反了 忙则等待 原则。检查和上锁不能一气呵成。

双标志后检查

算法思想:将先检查的上锁放到检查前面。

bool flag[2];
flag[0] = false;
flag[1] = false; 

flag[0] = true;       flag[1] = true;    //上锁
P0:                  P1:
while(flag[1])        while(flag[0])     //检查
critical section;     critical section;
flag[0] = false;      flag[1] = false;
remainder section;    remainder section;

如果进程是并发的。

主要问题:违法了 空闲让进 和 有限等待 原则。

Peterson算法

算法思想:如果双方都想进入临界区,则产尝试谦让。

bool flag[2]; //初始值是false
int turn = 0;

P0:
flag[0] = ture;
turn = 1;
while(flag[1] && turn == 1); //注意这里的分号,满足条件的话,这是一个while死循环
critical section;
flag[0] = false;
remainder section;

P1:
flag[1] = ture;
turn = 0;
while(flag[0] && turn == 0);
critical section;
flag[0] = false;
remainder section;

最后谦让的让出资源。

进程互斥的硬件实现方法

中断屏蔽

利用“开/关中断指令”实现。(与第二章原语思想相同)
有点:简单,高效
缺点:不适用于多处理机。开关中断只能内核态进行&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值