南大OS
并发程序设计
基础概念
顺序程序设计
简单有序
多道程序设计
依次执行,cpu利用率低
并发程序设计
OS调配进程执行次序,充分利用硬件资源
并行性:逻辑上并发->多核cpu物理上并行
共享性:共享软件资源
交往性:进程间需要有序执行
并发进程的制约关系
结果错误:卖票问题
永远等待:消费生产问题
互斥:进程争夺独占性资源
同步:进程之间有先后逻辑
临界区
基本概念
临界资源:共享的变量
临界区:有关临界资源的程序段
三个关键点:
只能容许一个进程计入临界区
一个进程不能永远停留在临界区
一个进程不能永远等待进入临界区
死锁:不合理的临界区嵌套使用,规定先申请低级的在申请高级
的资源
临界区管理
尝试一:软件方式
用一块内存(锁变量)表示某进程是否进入临界区
在挂锁间中断就会死锁或同时进入
尝试二:硬件方式
以一条硬件指令实现锁
忙是等待,效率低
尝试三:操作系统原语
关中断,临界区,开中断:使得临界区具有原子性
临界区需要短小精悍,系统级别编程,不建议用户使用
PV:操作系统原语,不会被中断
信号量:逻辑上代表一个资源,正数资源个数,0没资源没等待,负数
等待个数
等待进程队列:申请不到资源是,进程进入队列等待,实际上信号量
就是一个等待进程队列
P:申请资源,是否入队
V:释放资源,有否出队
pv在路径上要匹配
互斥:
卖票问题:
用某个信号量代表这一种票,买卖时pv管理
同步:
生产者消费者:单个缓冲
生成-消费-生产的2个同步关系
两个信号量:产品0,缓冲区1
两个进程分别PV对方信号量
生产消费问题探究
一个生产者,一个消费者,一个缓冲区
一个, 一个, 多个:缓冲区信号量初始化为k
多个, 多个, 多个:需要额外2个信号来分别互斥生产者
和消费者
苹果橘子问题:扩展了的生产者消费者问题
管程
基本原理
pv操作程序设计分割了逻辑,不易于代码管理,实现难度大
管程将公共变量及其对其操作封装起来,进程不在直接操作临界
资源而是调用管程方法,且只能一个进程进入管程
管程基本形式:
管程变量:临界资源
多个互斥的方法:进程同时只能调用一个
信号量:能否申请进入管程过程的信号量
条件变量:和临界资源相关的信号量,用wait,signal管理
同步原语wait:阻塞进程自己
同步原语signal:让一个等待进程进入管程过程
后三部分对应了java:对象锁,wait,notify
霍尔管程
特点:使用signal释放一个等待进程时,霍尔管程让执行signal的
的进程进入高优先级等待
基于PV操做实现:
不要求wait,signal是原语级的,可以通过高级语言机制实现。因为
wait和signal执行时,一定时得到管程使用权的,也就保证了原子性
霍尔管程设计框架:
一个信号量来互斥进入管程
管程条件变量及wait,signal来控制同步
例子
哲学家问题:每个哲学家视为一个进程,每个盘子一个临界资源
框架:拿盘子,放盘子时管程方法需要用信号量互斥
盘子:临界资源,条件变量,5个条件变量
管程方法:
尝试吃:i能吃,置为吃态,signal i号盘子(让等待的i去吃)
拿盘子:尝试吃,没置为吃态,wait i号盘子(想吃没吃到让i等待)
放盘子:置为思考态,让周围人尝试吃
读者写者问题:每个读者写者视作一个进程
临界资源:读,写
计数:等待读,等待写,正在读,正在与等待写
管程方法:
开始读:有正在写,wait;没有正在读加1,继续释放
等待读(使读者连续释放)
结束读:正在读-1,释放等待写
开始写:正在与等待写+1,如果有正在读或正在写,wait
结束写:正在与等待写-1,优先释放等待写在释放等待读
进程通信
信号量:低级的,实现同步互斥
高级的:交换更多的信息,信件机制
直接通信:指明发送方和接受方,单对单生产者消费者
间接通信:信箱通信,一个共享缓冲区
基于流的通信:管道/套接字/多路转接器,不在受到长度限制
远程过程调用RPC/XDR:
客户机调用服务机上服务,服务机处理后返回给客户
XDR实现不同机器上数据的标准格式
死锁
产生:相互等待不可抢占资源
m个资源被n个进程共享,且要求占有k个资源。如果
m<n*(k-1)+1时,分配不当就会产生死锁。
产生的4个必要条件:死锁发生是必然4个都成立
互斥条件:资源独占性
占有和等待条件:进程占有资源后不会主动释放
不剥夺条件:进程不会抢夺其他进程资源
循环等待条件:存在一个循环等待链
防止:破坏任意条件
1:共享性资源,如打印机虚拟成spooling,不适合大多数
2:静态分配,不会发生占有一些等待另一些资源情况
3:剥夺式,只适合对处理器和主存,不适合大多数.
4:层次分配,先申请低级资源,先释放高级资源。
避免:银行家算法
检查分配资源后不会发生死锁,才分配
循环探测(循环)实现
检测:不加限制的分配资源,但是运行一个检测程序来检测死锁并处理
资源占用表:资源 -- 状态
进程等待表:进程 -- 等待资源
等待占用关系:检查两张表,如果出现i占有k,而j等待k
则说明ij有等待占用关系
死锁发生:存在ij,jk,kl, 。。。,xi的循环
warshall算法如果出现对角线>0就证明有死锁出现