操作系统-哲学原理(进程原理篇)
2020-02-15 本文已影响0人
Jassi
$4 进程管理
- 进程=程序+执行
- 执行在cpu上运行指令
- 进程 可以看成是对cpu的虚拟
- 为什么要多道编程,一个一个执行不行么? 主要是出于效率的考虑,当有多个程序的时候, 如果其中有些程序IO占了很长时间, 一个一个执行就会造成CPU的空闲,是很浪费的, 所以多道编程 有利于提高CPU的使用效率, 当然不是并行量越多越好, 因为调度本身就消耗资源
- 进程调度 即内存管理 程序要执行首先是先加载到内存中, 不同的程序分配不同的内存空间块,由于寄存器同一时间只能执行1条指令, 多个程序需要并行处理的话 就需要有个管理者(cpu)调度他们,即管理内存
- 进程的状态: 执行(在CPU上被运行指令) 阻塞(IO) 就绪(活生生的被暂停执行)
- 进程的生命周期: 创建和消亡, 创建工作是由操作系统完成的, 不同的操作系统 创建进程的方式不同,win是系统调用完成的, unix是fork自身
- 进程管理: 操作系统内核空间中维护 进程表, 一般记录进程的如下信息(寄存器 计数器 状态字 优先级 栈指针 进程id 信号 创建时间 当前持有的句柄等)
- 创建进程的步骤
- 分配进程控制块
- 初始化机器的寄存器
- 初始化页表
- 将程序代码读入内存
- 将处理器的状态设为‘用户态’
- 跳到程序的起始地址(设置程序计数器) 这是一条内核态的指令完成的
$5 进程调度
调度算法的衡量指标
效率(平均执行时间)、 公平、吞吐量、时序
进程使用CPU的方式分类
- 计算 远> io(时序)
-计算 远< io(响应速度)
-计算 约等于 io(时序+响应速度)
调度算法
- 先进先执行FCFS
- 分时间片
- 最短时间优先STCF
- 优先级
- 混合(优先级 + 分片)
- 彩票算法
- 实时调度:保证时序(算法举例:最早截止时间优先-动态的、最短周期优先-静态的一旦调度列表定了 就不再接受新的进程进来了)
优先级倒挂-优先级继承
- 忙等(循环等待)与阻塞等待
- 高优先级因为等待低优先级资源而等待
- 高优先级因为循环等待
$6 进程间通信
- 为什么要通信
父子进程有通信的需求、无相关进程也有通信的需求,不同主机间的进程有通信的需求 - 管道:
- 概述:开辟一片空间 一方负责写 一方负责读,点对点 只有linux系统实现了通道, 本质就是一个线性字节数组
- 管道是由系统调用创建的
- 无记名管道:适用于相关进程间通信, popen() 和pipe()
- 记名管道: 适用于无相关进程间通信(如两个不同进程中的进程),可以跨主机, 需要提供 主机名/管道、管道名;一个进程创建一个记名管道之后 另外一个进程可以通过open()方法
- 套接字:
- 概述:应用非常广泛 各种系统中都有实现, 网络请求中很典型, 服务端会创建socket并监听链接, 一旦有客户端的链接请求 就会创建一个与该客户端点对点通信的client_socket;为了client可以连接服务端的套接字, 服务端的套接字一般是绑在某个公共主机上的一个众所周知的端口上;服务端监听有限个连接,超过的链接会被拒绝
- 特点: 点对点 可靠 双向, 不一定有序 成本高
- 信号:
- 概述:提供不可靠的连接,一方发送信号(内核中特定的数据结构)到目标进程 并发起中断, 目标进程所在os收到中断请求后 就会去特定内核结构中找到信号接收方 并通知, 收到通知的进程 对信号进行处理
- 特点: 不可靠 成本低
- 信号量
- 概述:一个标示程序是否可以继续推进的整数 0、1
- 共享内存:
概述:两个进程 共同拥有一片内存空间 二者都有读写的权限;
特点: 适用于大量数据通信 不能跨主机 - 消息队列:
特点: 一头写 一头读, 多对多