《计算机操作系统》——进程同步、进程互斥(软硬件实现办法)

进程同步

  如何解决进程运行顺序不确定的异步问题,就是“进程同步”所讨论的内容
  同步也称为直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。

进程互斥

  对临界资源的访问,必须互斥地进行
  互斥也称为间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

  • 对临界资源的互斥访问,逻辑上可以分为四部分
do{
    entry section;    //进入区
    critical section; //临界区
    exit section;     //退出区
    remainder section;//剩余区
}while(true)

进入区:负责检查是否可以进入临界区,若可进入,则应设置政治访问临界资源的标致,以阻止其他进程同时进入临界区
临界区:访问临界资源的那段代码
退出区:负责解除正在访问临界资源的标致
剩余区:做其他处理

  • 进程互斥原则:

空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
有限等待:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)。
让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

进程互斥的软件实现方法

请添加图片描述

单标志法

算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予
请添加图片描述
  turn的初值为0,即开始时只允许0号进程进入临界区,若p1先上处理机运行,则会一直卡在⑤。知道p1的时间片用完,发生调度,切换回p0处理机上运行。p0可以顺利进入②,正常访问临界区,此时若切换回p1,依然会卡在⑤,只有p0访问完临界资源后再退出区将turn改为1,p1才能进入临界区。
  违背空闲让进原则。若此时允许进入临界区的进程是p0,而p0一直不访问临界资源,此时虽然临界区空闲,但也不允许p1访问。

双标志先检查法

算法思想:每个进程单独标记各进程想进入临界区的意愿,每个进程在进入临界区之前先检查当前是否有别的进程想进入临界区,如果没有,就把自身对应的标致设置为true,之后开始访问临界区。
请添加图片描述
  违反忙则等待原则。进入区的检查和上锁两个处理不是一气呵成的,又因为进程执行具有异步性,若上述例子按照①⑤②⑥③⑦…的顺序执行,p0和p1会同时访问临界区。

双标志后检查法

算法思想:双标志先检查法的改版,先“检查”后“上锁”
请添加图片描述
  违背了空闲让进和有限等待原则。若上述例子按照①⑤②⑥的顺序执行,p0和p1都无法进入临界区,会因各个进程都长期无法访问临界资源而产生饥饿现象

Peterson算法

算法思想:双标志后检查法中,两个进程都想着进入临界区,但是谁都不让谁,最后都无法进入,但如果让进程尝试主动让对方先使用临界区,就可以解决这个问题。
请添加图片描述
  未遵循让权等待原则。会发生“忙等”现象

总结

请添加图片描述

进程互斥的硬件实现方法

请添加图片描述

中断屏蔽方法

  是实现互斥的最简单的方法之一。利用“开/关中断指令实现”进程开始访问临界区到结束访问为止都不允许被中断,也就不会发生进程切换,也不可能发生两个同时访问临界区的情况。

  • 优点:简单、高效
  • 缺点:1.不适用于多处理机;
       2.只适用于操作系统内核进程,不适用于用户进程;
       3.关中断时间过长会影响系统效率,限制了处理器交叉执行程序的能力。

Test-And-Set指令

  简称TS指令(或TSL),该指令是用硬件实现的,执行的过程中不允许被中断,只能一气呵成。

  • 优点:1.实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;
       2.适用于多处理机环境。

  • 缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用CPU并循环执行TS指令,从而导致“忙等”。

请添加图片描述
  相比软件实现方法,TS指令把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作。

Swap指令

  又称Exchange指令,或简称XCHG指令。Swap指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。

  • 优点:1.实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;
       2.适用于多处理机环境。

  • 缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用CPU并循环执行TS指令,从而导致“忙等”。
    请添加图片描述

总结

请添加图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,进程调度算法是操作系统中非常重要的一部分。常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)、时间片轮转(RR)等。下面是这些算法的 Python 实现: 1. 先来先服务(FCFS): ```python def FCFS(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 2. 短作业优先(SJF): ```python def SJF(processes): processes = sorted(processes, key=lambda x: x['burst_time']) waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 3. 高响应比优先(HRRN): ```python def HRRN(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for i, process in enumerate(processes): if i == 0: completion_time = process['burst_time'] else: response_ratio_list = [] for j in range(i): response_ratio = (completion_time - processes[j]['arrival_time'] + processes[j]['burst_time']) / processes[j]['burst_time'] response_ratio_list.append(response_ratio) max_response_ratio_index = response_ratio_list.index(max(response_ratio_list)) selected_process = processes.pop(max_response_ratio_index) completion_time += selected_process['burst_time'] turn_around_time += completion_time - selected_process['arrival_time'] waiting_time += turn_around_time - selected_process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 4. 时间片轮转(RR): ```python def RR(processes, time_slice): waiting_time = 0 turn_around_time = 0 completion_time = 0 while processes: for i in range(len(processes)): if processes[i]['burst_time'] > time_slice: completion_time += time_slice processes[i]['burst_time'] -= time_slice else: completion_time += processes[i]['burst_time'] turn_around_time += completion_time - processes[i]['arrival_time'] waiting_time += turn_around_time - processes[i]['burst_time'] processes.pop(i) break return waiting_time / len(processes), turn_around_time / len(processes) ``` 这里的 `processes` 是一个列表,其中每个元素是一个字典,表示一个进程的信息,如下所示: ```python processes = [ {'name': 'P1', 'arrival_time': 0, 'burst_time': 8}, {'name': 'P2', 'arrival_time': 1, 'burst_time': 4}, {'name': 'P3', 'arrival_time': 2, 'burst_time': 9}, ... ] ``` 在这个列表中,每个进程有一个名称、到达时间和执行时间。你可以根据自己的需要修改这些信息,来测试这些进程调度算法的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值