OS ##并发程序设计

南大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就证明有死锁出现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值