生鲜网站制作,企业建设网站的目的( ),机械加工网瓦房北方机床附件厂,网站制作联盟一、死锁
死锁#xff1a;一组阻塞的进程#xff08;两个或多个#xff09;#xff0c;持有一种资源#xff0c;等待获取另一个进程所占有的资源#xff0c;而导致谁都无法执行。
可重复使用的资源#xff1a;
在一个时间只能一个进程使用#xff0c;且不能被删除。…一、死锁
死锁一组阻塞的进程两个或多个持有一种资源等待获取另一个进程所占有的资源而导致谁都无法执行。
可重复使用的资源
在一个时间只能一个进程使用且不能被删除。OS避免杀死拥有资源的进程进程使用资源后要释放其他进程可重用有物理资源cpu I/O通道主和副存储器也有抽象的资源设备和数据结构如文件数据库和信号量如果每个进程拥有一个资源并请求其他资源可能导致死锁
资源分配图 死锁的必要条件
互斥任何时刻只能有一个进程使用一个资源实例持有并等待进程保持至少一个资源并正在等待获取其他进程持有的资源无抢占一个资源只能被进程自愿释放循环等待形成闭环
二、死锁处理方法
1、死锁预防dead-lock prevention
打破死锁出现的条件 确保系统永远不会进入死锁状态
互斥互斥的共享资源封装成可同时访问。占用非共享资源 会增加不确定性 不推荐占用并等待保证当一个进程请求资源时不持有任何其他的资源all or nothing 需要进程请求并分配其所有资源。资源利用率低可能饥饿无抢占允许抢占占有某些资源的进程。如进程请求不能立即分配的资源则释放已占有资源只在能够同时获得所有需要资源时才执行分配操作循环等待对所有资源类型进行排序并要求每个进程按照资源的顺序进行申请会出现资源利用不够
2、死锁避免 deadlock avoidance
当进程运行过程中根据申请资源的情况判断会不会死锁如果会就不给资源。
最简单有效就是要求每个进程声明它需要的每个类型资源的最大数目资源在分配中根据最大数目限定提供与分配的资源数目死锁避免算法要动态检查资源的分配状态来避免环形等待。 环形等待不一定会死锁。分为安全状态不安全状态 3、死锁检测和恢复Deadlock Detection Recovery
在检测到运行系统进入死锁状态后进行恢复 4、由应用程序处理死锁
通常操作系统忽略死锁大多数操作系统包括UNIX的做法
三、银行家算法 1、有多个资源实例 每个进程必须能最大限度地利用资源 找到理想执行时序找到就认为是安全的
类比银行家——操作系统资金——资源客户——申请资源的线程
2、银行家算法数据结构
n线程数量 m资源类型数量一个线程可能需要多种资源Max 总需求量n*m矩阵 max[i, j]k 进程Pi最多需要资源类型Rj的k个实例Available 剩余空闲量长度为m的向量如果available[j]k 则有k个类型Rj的资源实例可用Allocation 已分配量n*m矩阵 allocation[I, j]k 进程Pi已经分配了资源类型Rj的k个实例Need 未来需要量 n*m矩阵 need[i, j]k 进程Pi可能需要资源类型Rj的k个实例Max[i, j]need[I,j]allocation[i,j]
3、安全状态判断 四、进程通信概念
1、进程通信 IPC: inter process communication
进程通信是进程进行通信和同步的机制IPC facility 提供2个操作 send(message)、receive (message)进程P和Q想通信需要 在它们之间建立通信链路 通过send/receive交换消息通信链路的实现 物理例如共享内存硬件总线)、 逻辑如逻辑属性
2、直接通信
为了实现直接通信要有发送和接收的ID 进程必须正确地命名对方
send( P, message) - 发送信息到进程P receive( P, message) - 接收进程P的信息通信链路的属性 自动建立链路 一条链路对应一对通信进程 每对进程之间只有一个链接存在 链接可以是单向的但通常为双向的
2、间接通信
为了实现间接通信要发送到共享区发送方和接收方都不关注具体的另一方是谁
每个消息队列都有一个唯一的ID只有共享了相同消息队列的进程进程才能通信
通信链路的属性只有共享了相同消息队列的进程才建立链路链接可以与许多进程相关联链接可以是单向或双向通信流程 Ⅰ、建立一个新的消息队列 Ⅱ、通过消息队列发送和接收消息 Ⅲ、销毁消息队列 基本通信操作 send(A, message) – 发送消息到队列A receive(A, message) - 从队列A接受消息
3、阻塞与非阻塞通信
进程通信可划分为阻塞同步和非阻塞异步
阻塞通信阻塞发送、阻塞接收非阻塞通信非阻塞发送、非阻塞接收
4、通信链路缓冲
队列的消息被附加到链路的3种方式
0容量—0 messages 发送方必须等待接收方 有限容量—n messages 的有限长度发送方在队列满的时候要等待 无限容量—理想状况不用等
六、信号和管道
1、信号Signal
定义信号是进程间的软件中断通知和处理机制如SIGKILL,SIGSTOP等
信号的接收处理
捕获 catch : 指定信号处理函数被调用忽略 ignore: 依靠操作系统的默认操作 如进程终止、进程挂起屏蔽 mask:禁止进程接收和处理信号可能是暂时的当处理同样类型的信号
不足不能传输要交换的任何数据
优点效率很高异步。一般处理完后会回到被打断的进程。 2、管道
管道是进程间基于内存文件的通信机制。子进程从父进程继承包括文件描述符等的资源。进程不知道另一端可能从键盘、文件、程序读取可能写入终端、文件、程序。
缺省文件描述符0 stdin, 1 stdout, 2 stderr
与管道相关的系统调用
读管道read(fd,buffer,nbytes) 如scanf()是基于它实现的写管道write(fd,buffer,nbytes) 如printf()是基于它实现的创建管道pipe(rgfd) rgfd是2个文件描述符组成的数组。rgfd[0]是读文件描述符rgfd[1]是写文件描述符
管道示例
UNIX想灵活组合小程序一个的输出是另一个的输入用竖线|来表示把ls的输出stdout重定向通过一个类似buffer的管道作为stdin传输给more。More以为是从i/o给它的实际是ls给它的。进程不关心。 七、消息队列和共享内存
1、消息队列
管道必须有父进程数据是字节流没有数据结构。消息队列可以多个不相干的进程来传递数据而且message作为一个字节序列存储message quenues是消息数组。是一个有意义的结构化。 按FIFO/FILO管理
消息队列是由操作系统维护的以字节序列为基本单位的间接通信机制。每个消息是一个字节序列相同标识的消息组成按先进先出顺序组成一个消息队列。
消息队列的系统调用
msgget(key,flags)获取消息队列标识msgsnd(QID,buf,size,flags)发送消息msgrcv(QID,buf,size,type,flags)接收消息msgctl(...)消息队列控制
2、共享内存
共享内存是把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制。
每个进程都有私有内存地址空间每个进程的内存地址空间需明确设置共享内存段
同一进程中的线程总是共享相同的内存地址空间
优点快速、方便地共享数据
缺点必须用额外的同步机制来协调数据访问
共享内存是最快的方法一个进程写另一个进程立即可见没有系统调用干预没有数据复制。 共享内存系统调用
shmget(key,size,flags)创建共享段shmat(shmid,*shmaddr,flags)把共享段映射到进程地址空间shmdt(*shmaddr)取消共享段到进程地址空间的映射shmctl(...)共享段控制
需要信号量等机制协调共享内存的访问冲突。