操作系统总结

1 概述

1.1 操作系统的基本特征

1.2 基本功能

1.3 系统调用

如果一个进程在用户态需要使用内核态的功能,就进行系统调用而陷入内核,由操作系统代为完成。

alt text

1.4 宏内核与微内核

宏内核

定义:将操作系统功能作为一个紧密结合的整体放到内核,由于各模块共享信息,因此有很好的性能表现。

微内核

定义:由于操作系统不断复杂,将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。

微内核架构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。

缺点:由于需要频繁地在用户态和内核态间进行切换,会有一定的性能损失。

alt text

1.5 中断分类

2 进程管理

2.1 进程与线程

进程

定义:资源分配的基本单位。

进程控制块(PCB, Program Control Block)用于描述进程的基本信息和运行状态。

alt text

线程

定义:独立调度的基本单位。

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

alt text

区别

2.2 进程状态的切换

alt text

需要注意的是:

2.3 进程调度算法

2.3.1 批处理系统

批处理系统中没有太多用户操作,其目标是保证吞吐量和周转时间。

2.3.2 交互式系统

交互式系统中有大量的用户交互操作,其目标是快速地对任务进行响应。

alt text

2.3.3 实时系统

实时系统要求一个请求在一个确定时间内能够得到响应。分为: 软实时:可以容忍一定时间的超时 硬实时:必须满足绝对的截止时间

## 2.4 进程同步

 typedef int semaphore;
 semaphore mutex = 1;
 void P1(){
   down(&mutex);
   // 临界区
   up(&mutex);
 }

 void P2(){
   down(&mutex);
   // 临界区
   up(&mutex);
 }

生产者-消费者问题的管程解法: 核心:引入条件变量及wait(), signal()来实现同步操作。

monitor ProducerComsumer
  condition full, empty;
  integer count := 0;
  condition c;

  procedure insert(item: integer):
  begin
    if count = N then wait(full);
    insert_item(item);
    count := count + 1;
    if count = 1 then signal(empty);
  end;

  procedure remove: integer:
  begin
    if count = 0 then wait(empty);
    remove = remove_item;
    count := count - 1;
    if count = N - 1 then signal(full);
  end

end monitor;

//生产者客户端
procedure producer
begin
  while true do
  begin
    item = produce_item;
    ProducerConsumer.insert(item);
  end
end

//消费者客户端
procedure consumer
begin
  while true do
  begin
    item = ProducerConsumer.remove;
    consume_item(item);
  end
end

2.5 经典同步问题

2.6 进程通信

用于进程间传输信息

进程同步:控制多个进程按一定顺序进行; 进程通信:进程间传输信息。

进程通信是手段,进程同步是目的。

进程通信的方法:

3 死锁

概念:一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件。

3.1 必要条件:

alt text

3.2 处理方法

3.2.1 鸵鸟策略

直接忽视死锁,什么也不做。

3.2.2 死锁检测与死锁恢复

不试图组织死锁,而是当检测到死锁发生时,采取措施进行恢复。

死锁检测方法:检测环路

死锁恢复方法:

3.2.3 死锁预防

在死锁发生前预防发生死锁。

3.2.4 死锁避免

在程序运行时避免发生死锁。

案例:银行家算法。

4 内存管理

4.1 虚拟内存

将物理内存扩充为更大的逻辑内存,从而让程序有更多的可用内存。

alt text

4.2 分页系统地址映射

内存管理单元(MMU)负责程序地址空间和物理内存的转换,MMU中的页表(Page Table)存储着页(程序地址空间)和页框间(物理内存空间)的映射。

alt text

4.3 页面置换算法

程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断而将该页调入内存。如果此时内存已满,则系统从内存中调出一个页面到磁盘对换区以腾出空间。

所选择的页面是最长时间内未被访问的页面。然而,实际使用中无法知道一个页面多长时间不再被访问。

维护一个链表,当页面被访问时,将页面移动至链表表头,这样就能保证链表表尾的页面是最近最久未使用的。

alt text

每个页面都有两个状态位: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)。

选择换出的页面是最先进入的页面,会导致常被访问的页面被换出,导致缺页率升高。

alt text

第二次机会算法采用链表移动页面,降低了效率。时钟使用环形链表连接页面,再使用一个指针指向最老的页面。

alt text

4.4 分段

分页技术的问题:随着内存空间的动态增长,不同页表的地址空间会相互覆盖。

alt text

解决方法:把每个表分成端,一个段构成一个独立的地址空间。

alt text

4.5 段页式

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

4.6 分页与分段对比

5 地址管理

5.1 磁盘结构

alt text

5.2 磁盘调度算法

影响磁盘块的读写效率因素有:

5.2.1 先来先服务 FCFS, First Come First Served

按照磁盘请求的顺序进行调度。

优点:公平、简单;

缺点:平均寻道时间可能较长;

5.2.2 最短寻道时间优先 SSTF, Shortest Seek Time First

优先调度与当前磁头所在磁道距离最近的磁道。

优点:平均寻道时间较短;

缺点:不公平,可能出现饥饿现象;

5.2.3 电梯算法 SCAN

按一个方向进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。解决了饥饿问题。

alt text

6 链接

6.1 编译系统

alt text

6.2 静态链接

输入:一组可重定位目标文件 输出:完全链接的可执行目标文件

过程:

alt text

6.3 目标文件

6.4 动态链接

静态库的问题:

共享库:

共享库的特点:

alt text