首页 > 分享 > 计算机操作系统(八)——并发程序设计

计算机操作系统(八)——并发程序设计

计算机操作系统(八)——并发程序设计

最新推荐文章于 2023-05-09 16:03:33 发布

wnma3mz 于 2018-09-07 08:37:46 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

并发程序设计 顺序程序设计 进程的并发执行 处理器利用率计算 并发程序设计 把一个具体问题求解设计成若干个可同时执行的程序模块的方法 特性: 无关与交往的并发进程 与时间有关的错误 进程互斥与进程同步 互斥与临界区 PV操作与进程互斥 问题 信号量的构思 管程概念的提出 霍尔管程的实现方法 进程通信的概念 基于流的进程通信 远程过程调用RPC 死锁的产生 定义 死锁:每一个进程都在等待被另一个进程所占有的、不能抢占的资源 产生 解决办法 产生死锁因素: 三个方面解决死锁问题 死锁检测后的解决办法

并发程序设计

顺序程序设计

程序是实现算法的操作(指令)序列 每个程序在处理器上执行是严格有序的,称为程序执行的内部顺序性 程序设计的一般习惯是顺序程序设计
把一个具体问题的求解过程设计成一个程序或者若干严格顺序执行的程序序列,称为程序执行的外部顺序性 特性:
程序执行的顺序性:程序指令执行是严格按序的 计算环境的封闭性:程序运行时如同独占受操作系统保护的资源 计算结果的确定性:程序执行结果与执行速度和执行时段无关 计算过程的可再见性:程序对相同数据集的执行轨迹是确定的

进程的并发执行

多道程序设计让多个程序同时进入内存去竞争处理器以获得运行机会 OS允许计算机系统在一个时间段内存在多个正在运行的进程,即允许多个进程并发执行 OS保证按照“顺序程序设计”方法编程的程序在并发执行时不受影响,如同独占计算机 这些按照顺序程序设计思想编程的进程在OS中并发执行属于无关的并发进程

处理器利用率计算

顺序程序设计:input(78s)、process(52s)、output(20s),52/(78+52+20)=35% 并发程序设计:时间同上,while(1){input,send}; while(1){receive,process,send}; while(1){receive,output},(52*n)/(78*n+52+20)=67%,n趋近于无穷大

并发程序设计

把一个具体问题求解设计成若干个可同时执行的程序模块的方法 特性: 并发性:多个进程在多道程序系统中并发执行或者在多处理器系统中并行执行:提高了计算效率 共享性:多个进程共享软件资源 交往性:多个进程并发执行时存在制约:增加了程序设计的难度 无关与交往的并发进程 无关:一组并发进程分别在不同变量集合上运行,一个进程的执行与其他并发进程的进展无关 交往:一组并发进程共享某些变量,一个进程的执行可能影响其他并发进程的结果 与时间有关的错误 对于一组交往的并发进程,执行的相对速度无法相互控制 如果程序设计不当,可能出现各种“与时间有关的”错误 表现一:结果错误;表现二:永远等待 进程互斥与进程同步 交互的并发进程在执行时必须进行制约,才能保证得到合理的结果 进程互斥:并发进程之间因相互争夺独占性资源而产生的竞争制约关系 进程同步:并发进程之间为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系 互斥与临界区 临界资源:互斥共享变量所代表的资源,即一次只能被一个进程使用的资源

临界区:并发进程中与互斥共享变量相关的程序段

确定临界资源 share 确定临界区 region do 两个进程的临界区有相同的临界资源,就是相关的临界区,必须互斥进入 两个临界区不相关,进入就没有限制 临界区管理的三个要求
一次至多允许一个进程停留在相关的临界区内 一个进程不能无限止地停留在临界区内 一个进程不能无限止地等待进入临界区

临界区管理

同时进入临界区

process P1 begin while inside2 do [ ]; inside1 := true; 临界区; inside1 := false; end; process P2 begin while inside1 do [ ]; inside2 := true; 临界区; inside2 := false; end;123456789101112131415

同时等待进入临界区

process P1 begin inside1 := true; while inside2 do [ ]; 临界区; inside1 := false; end; process P2 begin inside2 := true; while inside1 do [ ]; 临界区; inside2 := false; end;123456789101112131415 解决思路
c
// 测试锁
TS(x) {
if (x==false) {x=true;return true;
} else return false;
}
Boolean lock;
lock=false; // 临界区可用
process Pi {
Boolean pi;
repeat pi=TS(lock) until pi; // 循环请求锁
临界区
lock=false; // 解锁
}
// 交换锁
swap(a, b){temp=a;a=b;b=temp;}
Boolean lock;
lock=false; // 临界区可用
process Pi {
Boolean pi;
pi=true;
repeat swap(lock, pi) until !pi; // 循环建立锁
临界区;
lock=false; // 解锁
}
实现临界区管理的硬件设施
TS和swap指令均是忙式等待,效率低 简单的解决办法是在进出临界区时开关中断,这样临界区执行就不会中断了,执行就有原子性。关中断;临界区;开中断 操作系统原语就采用这种实现思路 但是,临界区的指令长度应该是短小精悍,这样才能保证系统效率 不建议用户程序使用,滥用是可怕的! 多个并发进程访问临界资源时,存在竞争制约关系。如果两个进程同时停留在相关的临界区内就会出现与时间相关的错误

PV操作与进程互斥

问题 TS或swap指令管理临界区,采用忙式轮询,效率低 关开中断管理临界区,不便交给用户程序使用 信号量的构思 一种可动态定义的软件资源:信号量
核心数据结构:等待进程队列 信号量声明:资源报到,建立队列 申请资源的原语:若申请不到,调用进程入队等待 归还资源的原语:若队列中有等待进程,需释放 信号量撤销:资源注销,撤销队列

记录型信号量:一种带数值的软资源

typedef struct semaphore { int value; // 信号量值 struct pcb *list; // 信号量等待进程队列指针 }1234 每个信号量建立一个等待进程队列 每个信号量相关一个整数值
正值表示资源可复用次数 0值表示无资源且无进程等待 负值表示等待队列中进程个数 P、V操作原语
c
procedure P(semaphore:s) {
s -= 1; // 信号量-1
if (s<0) W(s); // 若信号量小于0,则调用进程被置成等待信号量s的状态
}
procedure V(semaphore:s) {
s += 1; // 信号量+1
if (s<=0) R(s); // 若信号量小于等于0,则释放一个等待信号量s的进程
}
PV操作解决进程互斥问题框架
c
semaphore s;
s=1;
begin
process Pi {
......
P(s);
临界区;
V(s);
......
}
end;

PV操作解决进程同步问题

进程同步:并发进程为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系 一个进程的执行等待来自于其他进程的消息 解决的基本思路:
定义一个信号量:其数值代表可用消息数 等待消息进程:执行

相关知识

计算机操作系统(八)——并发程序设计
2024年,ICPC比赛、CCPC比赛、CCF
计算机操作系统
计算机协议有哪些
一家宠物医院通过计算机应用程序把每次宠物就诊的账单提供给客户。需要在操作系统的帮
[附源码]JAVA计算机毕业设计宠物爱心驿站(源码+开题)
Java计算机毕业设计云养宠物系统(开题+源码+论文)
高并发之——死锁,死锁的四个必要条件以及处理策略
基于计算机虚拟宠物的个性化服务系统及其方法
java+vue计算机毕设宠物领养平台【源码+开题+论文+程序】

网址: 计算机操作系统(八)——并发程序设计 https://m.mcbbbk.com/newsview277584.html

所属分类:萌宠日常
上一篇: 由于争夺资源引起的战争
下一篇: 高并发update的 死锁产生原