操作系统
操作系统是管理计算机硬件和软件资源的程序,是系统软件
操作系统功能
- 进程和线程管理
- 存储管理
- 文件管理
- 设备管理
- 网络管理
- 安全管理
用户态和内核态
- 用户态运行的进程可以直接读取用户程序的数据,权限较低
- 内核态运行的进程几乎可以访问计算机的任何资源,拥有非常高的权限
用户态转为内核态需要向操作系统发起系统调用请求,操作系统接收到进程的系统调用请求后,就会从用户态切换为内核态,执行相应的系统调用,并将结果返回给进程,最后从内核态切换为用户态,进入内核态需要付出较大的开销(需要进行一系列的上下文切换和权限检查)
同时具有用户态和内核态主要是为了保证计算机系统的安全性、稳定性和性能
用户态–>内核态的三种方式
- 系统调用
- 中断
- 异常
进程间通信的方式
-
匿名管道
用于父子进程或兄弟进程之间的通信
-
有名管道
以磁盘的文件的方式存在,实现本机任意两个进程间的通信。遵循
先进先出
-
信号
-
消息队列
-
信号量
是一个计数器,用于多线程对共享数据的访问
-
共享内存
使得多个进程可以访问同一块内存空间,需要依赖某种同步操作,如互斥锁和信号量等。
-
套接字socket
用于客户端和服务器之间的通信
进程的调度算法
-
先来先服务(FCFS)
从就绪队列里选择最先进入队列的进程为之分配资源
-
短作业优先(SJF)
从就绪队列里选择一个估计运行时间最短的进程为之分配资源
-
时间片轮转(RR)
每个进程被分配一个时间段,称为它的时间片,即允许运行的时间
-
多级反馈队列(MFQ)
根据先来先服务原则给就绪队列排序,为就绪队列赋予不同的优先级数,不同的时间片,按照优先级抢占CPU,既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。
-
优先级调度
每个进程分配优先级,优先级高的进程先运行,具有相同优先级的进程以 FCFS 方式执行
死锁
多个进程在运行过程中,由于竞争资源或彼此通信而造成的阻塞现象
死锁的四个必要条件
- 互斥
- 占有并等待
- 非抢占
- 循环等待
预防死锁
-
静态分配策略
破坏
占有并等待
条件,一个进程在执行前就获得到它所需要的的全部资源 -
层次分配策略
破坏
循环等待
条件,将资源分为不同等级的层次,进程在申请高层次的资源时必须先申请低层次的资源,在释放低层次的资源时必须先释放高层次的资源,在申请同一层资源中的另一资源时需要释放已得到的该层资源
避免死锁
银行家算法:
当一个进程申请使用资源的时候,银行家算法通过先 试探 分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。
检测死锁
解除死锁
- 立即结束所有进程,重启操作系统
- 撤销涉及死锁的所有进程,解除死锁后继续运行
- 逐个撤销设计死锁的进程,回收期资源直至死锁解除
- 抢占资源
虚拟内存
虚拟内存逻辑上存在,作为进程访问主存的物理桥梁并简化内存管理
虚拟内存作用
-
隔离进程
进程通过自己私有的虚拟内存访问主存,一个进程中的代码无法改变其他进程或操作系统使用的物理内存。
-
提升物理内存利用率
操作系统只需要将进程当前正在使用的部分数据或指令载入主存。
-
简化内存管理
-
多个进程共享物理内存
-
提高内存使用安全性
地址翻译/地址转换:操作系统通过CPU中的MMU(内存管理单元)将虚拟地址转换为物理地址
分段机制
连续的物理内存、每段大小不等
分段机制下的虚拟地址的组成:
- 段号
- 段内偏移量
具体的地址翻译过程如下:
- MMU 首先解析得到虚拟地址中的段号;
- 通过段号去该应用程序的段表中取出对应的段信息(找到对应的段表项);
- 从段信息中取出该段的起始地址(物理地址)加上虚拟地址中的段内偏移量得到最终的物理地址。
分页机制
连续等长的的物理页
分页机制下的虚拟地址的组成
- 页号
- 页内偏移量 :物理页的起始地址+页内偏移量=物理内存地址
具体的地址翻译过程如下:
- MMU解析得到虚拟地址中的虚拟页号
- 通过虚拟页号去虚拟程序的页表中找出对应的物理页号(找到页表项)
- 用物理页号对应的起始地址加上虚拟地址中的页内偏移量得到物理内存地址
TLB转址旁路缓存
属于MMU(内存管理单元)内部的单元,本质上是一块高速缓存。
使用了TLB的翻译流程:
- 用虚拟内存的页号作为key去TLB中查询
- 若查到了对应的物理页,就不用去查页表了(TLB命中)
- 若查不到对应的物理页,需要去查物理内存中页表,同时将页表中的该映射表项添加到TLB中(TLB未命中)
- TLB填满后,又要登记新页,就按照一定的淘汰策略淘汰掉快表中的一页。
常见页面置换算法
- 先进先出页面置换算法(FIFO)
- 最近最久未使用页面置换算法(LRU)
- 最少使用页面置换算法(LFU)
- 时钟页面置换算法 :逐出的页面是最近未使用的
提高文件系统性能的方式
- 优化硬件
- 选择合适的文件系统类型
- 运用缓存
- 避免磁盘过度使用
- 对磁盘进行合适的分区
常见的磁盘调度算法
-
先来先服务算法
- 未考虑磁头移动路径和方向,平均寻道时间较长
- 容易出现饥饿问题,后面的磁盘请求要很长时间才得到服务
-
最短寻道时间优先算法
-
能最小化寻道时间
-
易出现饥饿问题:远离磁头的请求长时间得不到服务
-
-
扫描算法(电梯算法):如果磁头从一个方向刚扫描完,请求才到的话。这个请求就需要等到磁头从相反方向过来之后才能得到处理。
-
循环扫描算法 :只往一个方向扫描,并且只按照一个方向扫描,直到到达磁盘边界,然后回到磁盘起点,重新开始循环。
-
边扫描边观察算法:边扫描边观察这个方向还有没有磁盘请求,没有就可以立刻调转磁头方向
-
均衡循环扫描算法:磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。