操作系统

前言

前言用>符号标注🖊

进程管理

进程

进程是资源分配的基本单位。

进程控制块(Process Control Block, PCB) 描述进程的基本信息和运行状态(代码和相关数据)。所谓创建进程和撤销进程,都是指对PCB的操作。

进程状态(五状态模型)

新建,就绪,运行,阻塞,退出

挂起态:进程交换到磁盘中等待操作系统唤醒回内存。

进程控制

执行模式

非特权态(用户态)

特权态(系统态、内核态、控制态)

进程创建

  1. 分配唯一进程标识符
  2. 分配空间
  3. 初始化PCB(可以从父进程处继承)
  4. 设置正确的连接
  5. 创建或扩充其他数据结构

进程派生:

父子进程之间的关系
关于资源:子进程得到的是除了代码段是与父进程共享的以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。(采用写时复制技术)

线程

线程

线程是独立调度的基本单位,进程调度的最小单位。一个线程可以有多个线程并发执行。

一个进程中可以有多个线程,它们共享进程资源。

线程分类

用户级线程

(系统不知道线程的存在)

内核级线程

(调度由系统内核解决)

并发性:同步和互斥

原子操作:外部对内部不可见,整个操作要么执行要么不执行

临界区:对临界资源进行访问的那段代码称为临界区

死锁:两个或以上的进程每个都在等待其他进程完成。

互斥:

同步:合理的并发进程需要按先后顺序执行。

竞争条件:

饥饿:一个可运行的进程在等待,缺被无期限的忽视不被调度。

信号量:

可重用资源:一次只能供一个进程使用,不会耗尽(设备、IO通道,内存外存,信号量)

可消耗资源:可以被生产和销毁的资源(中断、信号、消息等)

死锁的条件

三个必要条件:(可能性)

  1. 互斥:资源是互斥的
  2. 占有且等待:当进程正在等待其他进程时,还持有着已分配的资源。
  3. 不可抢占:不可抢占进程已占有的资源

一个充分条件:(存在性)

  1. 循环等待:存在一个封闭的进程链,每个进程都对下一个进程等待。

死锁检测和死锁恢复

死锁恢复

  • 利用抢占恢复
  • 利用回滚恢复
  • 通过杀死进程恢复

处理方法

死锁预防

破坏死锁的条件

死锁避免

进程启动拒绝

资源分配拒绝(银行家算法)

一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,算法要做的是判断对请求的满足是否会进入不安全状态,如果是,就拒绝请求;否则予以分配。

哲学家就餐问题

内存管理

页框:内存中一个固定长度的块

页:一个固定长度的数据块,存储在二级存储器中(如磁盘)。数据也可以临时复制到内存的页框中

段:一个变长的数据块,存储在二级存储器中。整个段可以临时复制到内存的一个可用区域内(分段),或者可以将一个段分成很多页,将每页单独复制到内存中。(分页和分段可以结合)

虚拟内存

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

分页系统地址映射

页面置换算法

最佳置换(OPT)

OPT, Optional

所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。

是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。

最近最少使用(LRU)

LRU, Least Recently Used

为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面时最近最久未访问的。

因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。

img

最近未使用

NRU, Not Recently Used

每个页面都有两个状态位:R 与 M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。可以将页面分成以下四类:

  • R=0,M=0
  • R=0,M=1
  • R=1,M=0
  • R=1,M=1

当发生缺页中断时,NRU 算法随机地从类编号最小的非空类中挑选一个页面将它换出。

NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。

先进先出(FIFO)

选择换出的页面是最先进入的页面。

该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。

时钟

Clock

分段

段页式

程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。

分页与分段的比较

  • 对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段。
  • 地址空间的维度:分页是一维地址空间,分段是二维的。
  • 大小是否可以改变:页的大小不可变,段的大小可以动态改变。
  • 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。

本文标题:操作系统

文章作者:Aaron.H

发布时间:2018年09月17日 - 13:09

最后更新:2018年09月17日 - 18:09

原始链接:https://uncleaaron.github.io/Blog/操作系统/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。