Introduction to Operating System
前言
操作系统是配置在计算机硬件上的第一层软件,是位于计算机硬件和应用之间的一层软件。其主要作用是管理好这些设备(CPU,内存,终端,磁盘,文件等),提高它们的利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口,方便用户使用。可以说操作系统已经成为现代计算机系统、多处理系统、计算机网络中都必须配置的系统软件。本系列博客不仅会讲解操作系统的理论知识,而且会结合代码深入理解操作系统的底层实现。
一、操作系统的作用与功能
1. 用户与计算机硬件之间的接口(Interface)
一个计算机系统包括四个组成部分:硬件(CPU,内存),操作系统,应用程序和用户。而操作系统正处于用户与计算机硬件系统之间,用户可以通过操作系统来使用计算机系统。或者说,用户可以通过操作系统方便地,灵活地操作和使用计算机硬件和运行自己的程序。在这个意义上来说,操作系统为用户操作计算机硬件提供了一个接口,而操作系统是如何调用计算机硬件的用户是不知道的。用户利用操作系统与计算机硬件进行交互的方式主要有命令行方式和图形界面方式等。 我们以命令行方式为例来看看用户是如何通过代码调用计算机硬件的。下面是一个编写好的C语言代码,文件名为’output’:
#include<stdio.h>
int main(int argc, char * argv[])
{
printf("%s\n", argv[1]);
}
这段程序会在命令行接收一个字符串并打印出来。经过编译之后我们在命令行找到当前文件,并敲入命令(我们要显示的字符串),命令行就会执行我们的程序,即在屏幕上显示出刚才输入的字符串。那么问题来了,为什么的字符串会被显示在终端上呢?或者说,printf函数背后的工作原理是什么呢?
Shell
在解释其背后的工作原理之前,我们先来了解一下什么是‘Shell’。我们知道真正能够操控计算机硬件的只有操作系统内核,而命令行和图形界面只是假设在用户和操作系统内核之间的一座桥梁。在Linux操作系统中,Shell就是进入操作系统内核之前的最后一道门。Shell的本质就是一个应用程序,它连接了用户和Linux内核,让用户更加高效、安全地使用Linux内核。虽然Shell也是一种应用程序,但它和微信等程序还是有区别的,即Shell再开机后会立马启动,并呈现在用户面前;用户通过Shell来使用Linux,否则用户将没有办法使用Linux系统。
回到刚次命令行的例子,事实上,当我们输入完字符串之后,就会执行Shell程序,如下所示:
int main(int argc, char * argv[])
{
char cmd[20];
while(1){
scanf("%s", cmd);
if(!fork()){
exec(cmd);
}else:
wait();
}
}
也就是说,在系统启动到最后会执行Shell程序,Shell程序就会执行scanf()函数接收用户输入,之后就会通过fork()和exec()函数进入操作系统的内核去申请CPU资源来执行printf()里面的代码,将字符串打印到终端上。
以上就是用户通过命令行对计算机硬件进行简单操作的一个例子。我们不难发现,无论是利用操作系统调用CPU资源,还是接收字符串输入,我们都离不开函数的调用。而这些函数就是操作系统内核暴露出来的接口,Shell通过调用这些函数接口,来使用操作系统的内核,在操作系统中,再进行硬件的调用;而我们除了使用函数,没有第二种方法去调用操作系统今儿使用计算机硬件。类似地,图形化界面的背后也是程序中一个又一个的函数调用。
系统调用 (System Call)
综上,操作系统作为用户与计算机硬件之间的接口的方式就是提供了一些重要的函数,用户可以通过这些函数进入操作系统内核进而使用硬件,至于操作系统是如何调用硬件的,这些信息用户是不知道的,这也体现了接口的性质。接口表现为函数调用,而这些函数是有操作系统提供的,因此又称为系统调用(System Call)。
2. 计算机系统资源的管理者(Resource Manager)
在一个计算机系统中,通常含有多种硬件和软件资源。这些资源主要包括四来:处理机、存储器、I/O设备以及文件。相应的,操作系统的主要功能也就是对这四类资源进行有效的管理。而操作系统的资源管理功能我们将在后面的章节中详细地进行讲解。
3. 对计算机硬件资源的功能进行扩充 (Virtual Machine)
对于一台完全无软件的计算机系统(裸机),也就是说用户必须通过硬件接口(物理接口)才能使用计算机,这是有一定难度的。为了方便用户使用I/O设备,人们在裸机上覆盖一层I/O设备管理软件,由它来实现对I/O设备操作的细节,并且向上将I/O设备抽象为一组数据结构以及一组I/O操作命令(read和write指令),这样用户就可以利用这些数据结构及操作命令来进行数据的输入或输出,而无需关心硬件是如何具体实现I/O的。我们通常把覆盖了上述软件的机器称为扩充机器或虚拟机。它向用户提供了一个对硬件操作的抽象模型。用户可以利用该模型提供的接口使用计算机,无需了解物理接口的实现细节。 也就是说,I/O设备管理软件实现了对计算机硬件操作的第一个层次的抽象。事实上,我们不仅可以在底层对一个硬件资源进行抽象,还可以在高层对该资源底层已抽象的模型再次进行抽象,成为更高层的抽象模型。随着抽象层次的提高,抽象接口所提供的功能就越强,而用户使用起来也越来越方便。
二、操作系统的发展历史 (History of OS)
1. 未配备操作系统的计算机系统
(1). 人工操作计算机
早期的计算机(从上个世纪四十年代开始到50年代中期)是不具备操作系统的,对计算机的全部操作都有人工直接和硬件进行交互。最开始的操作方式是用户通过设置转换开关灯装置来对计算机进行操作,后来用户可以通过将事先已经已穿好孔的纸带或卡片装入到纸带输入机中再启动它们将纸带上的程序和数据输入计算机,然后启动计算机运行。
人机矛盾
早期的人工操作方式导致用户独占计算机,即一台计算机的全部资源由用户所独占,其他用户无法使用;此外,CPU需要等待用户进行装带子和卸带子等操作,造成了CPU资源的浪费。由此可见,人工操作方式严重降低了计算机资源的利用率,这就是人机矛盾。
(2).脱机输入输出方式(Off-Line I/O)
为了解决人机矛盾,以及CPU和I/O设备之间速度不匹配的问题,20世纪50年代末期出现了脱机技术。该技术的工作过程如下: 用户事先将装有程序和数据的纸带装入纸带输入机,在一台外围机的作用下将纸带上的数据输入到磁带上,当CPU需要这些程序和数据时,再将它们从磁带上高速地调入内存。由于数据的输入和输出都是在外围机的控制下完成的,而不是直接和CPU进行交互,因此被称为脱机方式。
2. 单道批处理系统(Simple Batch Processing System)
单道批处理系统是最早应用在计算机上的操作系统,主要是为了解决人机矛盾和CPU与I/O设备速度不匹配的问题。单道批处理系统的工作原理如下: 首先,将一批作业的程序和数据以脱机方式输入到磁盘上,并在系统中配上监督程序,监督程序将磁带上的第一个作业装入内存,并把运行控制权交给改作业;CPU每次只能处理一个作业,当该作业处理完成时,控制权又交还给了监督程序,在由监督程序调入下一个作业到内存中,重复以上步骤,直至所有的作业都处理完。单道批处理系统有以下缺点:
[
1
]
[1]
[1] 系统资源得不到充分利用:每逢程序在运行中发出I/)请求后,CPU便处于等待状态;
[
2
]
[2]
[2] 内存的浪费:为了使计算机能够运行不同容量的作业,通常都给计算机配备较大容量的内存,但是实际情况只有不到
20
20
20%的作业需要大容量内存,因此对于剩下的
80
80
80%左右的作业必然存在内存浪费现象。
3. 多道批处理系统(Multiprogrammed Batch Processing System)
在该系统中,用户现将作业存放在外存上,并形成一个队列,称为‘后备队列’。然后由作业调度程序按照一定的算法,从后备队列中选择若干个程序调入内存,使他们共享CPU和系统中的资源。由于在同一时刻内存中存在若干个任务,因此这些程序便可以交替执行,使CPU保持在忙碌状态,同时也提高了内存和I/O设备的利用率。 但是多道批处理系统也有不足之处,比如,任务的平均周转时间较长,用户不能与自己的作业进行实时交互,对于作业进行修改和调试非常不方便。此外,由于引入了多任务,那么如何有效地管理计算机硬件和软件资源便成了必须要处理的问题。
4. 分时系统(Time Sharing System)
为了提高资源利用率和系统吞吐量,计算机从单道批处理系统演变到了多道批处理系统。但是即使是多道批处理系统,用户依然无法和计算机进行实时交互;此外由于当时计算机主机较为昂贵,一台计算机最好还能够同时提供给多个用户使用。为了解决上述主要的需求,分时系统诞生了。
分时系统允许一台主机上连接多个配有显示器和键盘的终端,而且多个用户可以同时通过自己的终端与计算机进行交互,实现了共享资源。由于分时系统较为复杂,接下来我们将从两个方面讲解它的工作原理:
(1). 及时接收命令或数据
为了及时接受多个用户的命令或数据,我们需要在系统中配置一个多路卡,多路卡允许主机以很快的速度周期性的扫描各个终端,从每个终端处停留很短的时间来接收数据,从而实现分时多路复用的功能。此外,为了使从终端上输入的数据按顺序被读取,还需要为每个终端配备一个缓冲区。
(2). 及时处理命令或数据
为了让每个用户都能够对自己的任务进行处理,我们需要将所有任务都放到内存中,并切这些任务能够频繁的获得CPU资源,可见,原来的批处理运行方式无法满足上述需求,我们对次进行改进:
[
1
]
[1]
[1] 所有任务直接进入内存而不用先存储在磁盘上。
[
2
]
[2]
[2] 采用轮转运行的方式,系统规定每个作业每次只能运行一个时间片(time slicing),然后就暂停该作业的运行,转到下一个作业。
5. 实时系统(Real-Time Operating System)
实时系统是指系统能够及时响应外部事物的请求,在规定的时间内完成对这些事件的处理,并控制所有实时任务协调一致地运行。一般实时系统用于一些专业化的场景,如空中交通管制,工业控制等。
总结
本节主要介绍了操作系统的两大功能,一是对计算机资源进行更加规范化的管理,二是对计算机硬件资源进行抽象扩展,为用户提供访问硬件的接口;此外我们还介绍了操作系统的主要发展历史,了解到了批操作系统有着较高的资源利用率和任务吞吐量的特点,其中多道批处理系统更是为后来计算机操作系统的多进程概念奠定了基础;而分时系统的出现开创了人机交互的先河,其利用的时间片方法也被后来操作系统的设计所沿用。
|