0%

操作系统结构及其进程调度

大学里面学过的操作系统相关知识都已经忘的差不多了,为了巩固知识,最近重新回顾了一下操作系统的知识。今天整理下操作系统结构和进程调度相关知识。

操作系统结构

操作系统主要有以下结构:

1
2
3
1. 整体式结构
2. 层次式结构
3. 微内核结构

整体式结构

整体式结构是以模块为基础的结构,每个模块实现不同的功能,并且模块之间可以相互调用,通过操作系统接口为外部应用程序提供功能服务。

整体式结构

层次式结构

TCP/IP协议栈的设计就使用了层次结构的思想,不同层之间实现不同的协议,提供不同的功能。

层次式结构

设计操作系统时,也可以使用层次结构的设计思想。

层次式结构2

上图中,最底层提供了最基础的功能,每一层服务都会依赖其下一层提供的功能。

微内核结构

这种结构中操作系统由微内核和核外服务器组成。

其中微内核只提供操作系统最基本、最核心的功能,包括与硬件的交互、客户端和服务器间的通信等。

核外服务器提供操作系统的服务功能,处理应用程序的请求,它由若干服务器和进程共同组成。

CPU的态

就是CPU的工作状态,描述了进程能够操作资源和指令的权限。

CPU的态主要有内核态和用户态两种。

处于内核态的进程能够访问所有资源和指令;处于用户态的进程对资源的访问和指令操作会受到限制,仅能访问部分资源。

当进程执行不同的功能时,会进入不同的工作状态,例如当程序需要操作内存分配资源时,用户态不能满足条件,进程就会由用户态切换至内核态,分配完成后,又会从内核态切换为用户态。

操作系统进程调度

当多个进程在CPU中运行时,CPU有一套调度算法来决定下一时刻执行哪个进程,从而保证每个进程都有可能被调度,保证进程的顺利执行。下面介绍进程调度的几种策略。

进程调度目标

首先,进程调度的目的是为了保证进程的顺利执行,同时尽可能达到以下目标:

1
2
3
4
5
6
7
1. 响应速度尽可能快
2. 进程处理的时间尽可能短
3. 系统吞吐量尽可能大
4. 资源利用率尽可能高
5. 对所有进程公平
6. 避免饥饿
7. 避免死锁

对于不同的调度策略,它们所达到的目标是不同的。

进程调度时还有两个可量化指标:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1. 周转时间/平均周转时间
2. 带权周转时间/带权平均周转时间

周转时间:
进程周转时间是进程从交给计算机到最终执行完成所花费的时间,进程周转时间表明了进程在系统中停留时间的长短。其计算公式如下:
t = tc -ts
t: 表示进程周转时间
tc: 进程完成的时间
ts: 进程提交的时间

平均周转时间:
t = (t1 + t2 + .. + tn) / n
平均周转时间越短,意味着这些进程在系统内停留的时间越短,因而系统吞吐量也就越大,资源利用率也越高。

带权周转时间:
带权周转时间表示进程在系统中停留的相对时间,其计算公式如下:
w = t/tr
t: 进程周转时间
tr: 进程在CPU上的运行时间

平均带权周转时间:
w = (w1 + w2 + .. + wn) / n

进程调度算法

常用的进程调度算法有下面这些:

1
2
3
4
5
6
7
1. 先来先服务调度
2. 短作业优先调度
3. 响应比高者优先调度
4. 优先数调度算法
5. 循环轮转调度算法
6. 可变时间片轮转调度算法
7. 多重时间片循环调度算法

下面介绍其中的几个调度算法。

先来先服务调度:

1
2
3
按照进程进入CPU的先后顺序来调度,先进入的进程优先执行。

不足:仅仅考虑了进程的等待时间而没有考虑进程的执行时间,如果一个进程执行时间很长,则会阻塞下面执行时间较短的那些进程,不利于执行时间短的进程。

短作业优先调度:

1
2
3
选取运行时间短的进程优先执行。

不足:仅仅考虑了进程的执行时间而没有考虑进程的等待时间,不利于执行时间长的进程,对于执行时间长的进程,可能一直不会被执行。

响应比高者优先算法:

1
2
3
4
5
6
响应比是进程的响应时间和运行时间的比值:
响应比 = (响应时间/运行时间) = (等待时间 + 运行时间)/运行时间 = 1 + 等待时间/运行时间

特点:
若进程等待时间相同, 则运行时间越短的进程响应比越高,越容易被执行,此时有利于执行时间短的进程。
若进程的运行时间相同,则等待时间越长,响应比越高,越容易被执行,此时有利于长时间等待的进程。

循环轮转调度算法:

1
2
3
4
这个就是 Round-Robin 算法,在 Nginx 的负载均衡中也有用到。

该调度算法是把所有进程放入队列中,然后按照先进先出的顺序依次执行队列中的进程。执行进程时,会以时间片q为单位执行,即每个进程执行时长为q,执行完再把进程放入队尾,去执行下一个进程。
该算法保证了每个进程执行相同的时间和等待相同的时间,但是需要考虑时间片q的大小和进程队列的数量。