第二章:
进程的定义。组成 组织方式 特征
进程是一种运行过程 强调动态
在线在计算机中 我们同一个进程要有程序段 存放要执行的程序 存放数据段 还有占用资源 进程描述 优先级 管理信息 这太繁琐了 所以pcb应运而生 把所有程序段和数据段之外的 进行 封装 这样一个进程就分为pcb 程序段 数据段 那么很多个程序要有很多个pcb 怎么控制呢 一,链接方式 用三个队列 1 执行状态的 2 就绪状态的3 阻塞状态的 索引方式也是同理
进程的特征 并发 独立 异步 动态
pcb进程存放的唯一标志 pcb 就是为了管理 pcb里要有pid
执行 就绪 堵塞是什么 怎么切换 进程就是程序的依次执行
就绪态到运行态 就是 就绪态就是什么都准备好了就等待处理了 运行态就是 行了 来干吧 干到一半发现不太行咋办 去阻塞态重新准备 所以说i 去阻塞态是自发的 准备好了1那你重新回到就绪态吧
进程控制;那么具体进程是什么呢
就是改变队列 和改变对应的pcb 如果队列改变了但是pcb没及时改变怎么办?答案是不会 因为采用了原语 原语在执行开始之前有一个命令 不允许被中断 这样就也可以改变pcb而不被打扰
创建中止 唤醒改变 这些都有对应的原语
进程通信:两个不同的进程想要互相访问内存区 这显然不行 因为如果你能随意访问我 那么你就会乱改我的信息
那么我们可以用三种通信方式
1:共享通信 建立一个共享缓存区 进行通信
2 管道通信 只能半双工 通信 一个方向 所以要创建两个
3.消息传递 有点类似计网 写出发送方接收方 1 直接传递 在队列里等着取 2.简介 放在缓存区了
线程 多线程
线程 你打开qq有不同的功能 这就是多个线程 因为直接去做一个不大现实 所以引用了线程 他是处理及 处理的最小单位 进程是处理及分配资源的最小单位
变化是 同一个进程切换不同线程 不用转换资源 开销小
还有用户级线程 内核级线程 这是从不同的是视角看 但是处理及只能处理内核级
比如说 你看到语音 文件发送 全球音乐是三个线程 有可能内核 把文件发送 语音看变成一个
有多对一一对一多对多 我们用多对多 一对一 每个用户线程对应一个内核线程 这样好处是清晰 坏处是浪费资源 多对一 多个线程用一个内核级别线程 这样有一个堵塞全都堵塞
处理机调度概念层次:
进程同步 进程互斥
进程同步是针对进程异步提出的 例如几个进程异步执行 一定要有几个有先后顺序 进程同步就是在这个基础上提出来的
进程互斥 就是针对临界区访问的原则 1忙则等待有人进厕所你不能去
2.闲则让进 不能不让去3优先等待你得保证都能去 让全等待 你等也别堵门
互斥的软件实现.单标志发:我使用完 指定一个人可以去
双标执法 :运用数组告诉你我想不想进去 代码如下:
危险是 在一处进行切换到5 两个都走 违反忙则等待
双标志后检查:
还是一样的问题 1 执行了 5在执行
违背空闲让进
oeterson 算法 谦让
谁最后谦让对方用
进程互斥的硬件算法:
中断屏蔽算法: 在访问时 关中断 指令
ts指令:有点类似 双标志 但是好处是 用硬件 一气呵成 不被打断
信号量机制: 刚才的几个软硬件的实现方法去本部都满足不了让权等待 就是你在排队的时候一直在循环 浪费资源 于是提出了这两个算法
首先运用了不能被打断的原语 wait he singal 或者叫pv
算法如下:
这个依然不满足让权等待
于是提出了这个
信号量机制实现进程互斥
上面的都是对资源数量的访问 那么互斥问题可以看成只有一个资源 只能一个访问 这跟之前的问题异曲同工
进程同步 如果明确规定 代码执行顺序有先后 我们就可以在先执行的代码后加上v操作释放 后执行的代码前加上p操作运行 当然要把资源设为0还可能是n 看你最后要怎样才能动
生产者消费者
分析她一共出了几个同步和互斥关系
一 你满了 我就不能填了 2.你空了 我就不能要了 异步 我们不能同事都访问一个管道
这就是全部的关系
所以我们涉及三个量 1.full=0 代表开始时候 没满 empty-n 代表没空 穆mutex=1
生产者生产一个产品 消耗一个空闲缓冲区 p(e) 放入缓冲区 增加一个产品 v(full) 生产者先消耗一个产品 p(full)缓存区去除v(e)异步操作在最里面才行 所以有
管程。为什么引入管程 因为之前的所有东西比较难理解 难书写 所以引入了管程 管程呢个就是方便实现进程同步和互斥的操作 他把西斜复杂的东西封装在一个函数里 只能允许一个进程调用 只有调有关城的函数才能访问缓冲区
在Java里 一般用synchonized来表示管程
死锁:
银行家算法 就是把所有的进程以矩阵的形式写出来 然后比较安全与否
看这是还剩多少 挑能满足的完成释放 然后再挑 跳不动了就是不安全
死锁检测:
画出这个环图:蓝色的是请求 卢瑟的是分配 可以看出p2请求但是没了 就思索了