操作系统系列笔记(六) - 死锁和进程通信

死锁和进程通信

死锁

死锁: 是由于竞争资源或者通信关系, 两个或更多线程在执行中出现, 永远相互等待只能由其他进程引发的事件
进程访问资源的流程: 先申请空闲资源->进程占用资源->释放资源从占用变成空闲
资源分为两类
可重用资源: 资源不能被删除且在任何时刻只能有一个进程使用, 进程释放后, 其他进程可重用, 可能出现死锁
消费资源: 资源可创建和销毁, 比如中断/信号/消息, 可能出现死锁
死锁的四个必要条件
互斥, 任何时刻只能有一个进程使用一个资源实例
持有并等待, 进程保持至少一个资源, 并正在等待获取其他进程持有的资源
非抢占, 资源只能在进程使用后自愿释放
循环等待

死锁处理方法

1 死锁预防, 确保系统永远不会进入死锁状态, 资源利用效率低
限制并发进程对资源的请求, 使系统任何时刻都不满足死锁的必要条件
互斥 -> 把互斥的共享资源封装成可同时访问
持有并等待 -> 请求资源时, 要求不能持有任何其他资源, 仅允许在开始执行时, 一次请求所有需要资源
非抢占 -> 如进程请求不能立即分配的资源, 则释放已占有资源, 只在能够同时获得所有需要资源时, 才执行分配
循环等待 -> 对资源排序, 要求进程按顺序请求资源
2 死锁避免, 利用额外的先验信息, 在分配资源时判断是否会出现死锁, 只允许不会出现死锁的进程请求资源
要求进程声明需要资源的最大数目, 限定提供与分配的资源数量, 确保满足进程的最大需求, 动态检查资源分配状态, 确保不会出现环形等待
银行家算法是一个死锁避免算法, 以银行借贷分配策略为基础, 判断并保证系统处于安全状态
3 死锁检测和恢复, 在检测到运行系统进入死锁状态后, 进行恢复
恢复方式: 进程终止, 资源抢占
大多数操作系统由应用进程处理死锁, 操作系统忽略死锁

进程通信 (IPC, Inter Process Communication)

进程通信是进程进行通信和同步的机制, IPC提供两个基本操作, 发送send和接收receive
进程通信流程: 在通信进程间建立通信链路 -> 通过send/receive交换信息
两种通信方式
间接通信: 依赖操作系统内核, 在进程和内核之间建立相应的机构比如消息队列, 每个消息队列都有唯一标识, 只有共享了相同消息队列的进程才能通信, 连接可以是单向或双向, 消息队列可以与多个进程相关联, 每对进程可以共享多个消息队列
通信流程: 创建一个新的消息队列 -> 通过消息队列发送和接受信息 -> 销毁消息队列
直接通信: 在两个进程之间建立一个通讯信道, 即共享信道, 两个进程必须同时存在, 进程必须正确的命名对方, 通信链路的属性, 自动建立链路, 一条链路恰好对应一对通信进程, 每对进程之间只有一个链接存在, 链接可以是单向但通常为双向
进程通信可划分为阻塞(同步)或非阻塞(异步)
通信链路缓冲: 0容量(发送方必须等待接收方), 有限容量(通信链路缓冲队列满时, 发送方必须等待), 无限容量(发送方不需要等待)

通信机制的具体实现

信号和管道是操作系统提供的两种简单的通信机制
信号(Signal): 是进程间的软件中断通知和处理机制, 信号的接受处理有捕获(执行进程指定的处理函数), 忽略(执行操作系统指定的缺省处理), 屏蔽(禁止进程接受和处理信号)
不足是传送的信息量小, 只有一个信号类型, 做为一种快速的相应机制
管道(Pipe): 进程间基于内存文件的通信机制, 依据子进程从父进程继承文件描述符, 进程不关心管道的另一端
管道相关的系统调用, 读管道(read), 写管道(write), 创建管道(pipe)
消息队列: 是由操作系统维护的以字节为基本单位的间接通信机制, 每个消息是一个字节序列, 消息先进先出
消息队列相关系统调用 获取消息队列标识(msgget), 发送消息(msgsnd), 接受消息(msgrcv), 消息队列控制(msgctl)
共享内存: 是把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制, 特点, 快速, 方便的共享数据, 不足, 必须用额外的同步机制来协调数据访问, 防止没写完就读
最快的方式, 一个进程写另一个进程立即可见, 没有系统调用干预, 没有数据复制
在进程里, 每个进程都有私有内存地址空间, 每个进程的内存地址空间需明确设置共享内存段, 在线程里, 同一进程中的线程总是共享相同的内存地址空间
共享内存系统调用, 创建共享段(shmget), 把共享段映射到进程地址空间(shmat), 取消映射(shmdt), 共享段控制(shmctl)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值