Skip to content

Commit 7c61e0b

Browse files
committed
Upload Chapter0
1 parent b3fef1f commit 7c61e0b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+2388
-109
lines changed
+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
什么是操作系统
2+
================================================
3+
4+
.. toctree::
5+
:hidden:
6+
:maxdepth: 5
7+
8+
站在一万米的代码空间维度看
9+
----------------------------------
10+
11+
现在的操作系统是一个复杂的系统软件,比如Linux操作系统达到了千万行的C源代码量级。在学习操作系统的初期,我们没有必要去分析了解这样一个规模的软件。但这样的软件也是有其特有的一些特征。如果我们站在一万米的高空来看操作系统,可以发现操作系统这个软件干的事主要有两件:一是向下管理计算机硬件和各种外设,而是向上给应用软件提供各种服务帮助。这样描述还太简单了一些,我们可对其进一步描述:操作系统是一个可以管理CPU、内存和各种外设,并管理和服务应用软件的软件。为了完成这些工作,操作系统需要知道如何与硬件打交道,如何更好地面向应用软件做好服务,这就有一系列操作系统相关的理论,抽象,设计等来支持如何做和做得好的需求。
12+
13+
14+
站在计算机发展的百年时间尺度看
15+
----------------------------------
16+
17+
虽然电子计算机的出现距今才仅仅七十年左右,但计算机技术和操作系统已经发生了巨大的变化。从计算机发展的短暂的历史角度看,操作系统也是从无到有地逐步发展起来的。操作系统主要完成对硬件控制和对应用程序的服务所必需的功能,操作系统的历史与计算机的发展史密不可分。操作系统的内涵和功能随着历史的发展也在一直变化,改进中,在今天,在二十一世纪初期的大众眼中,操作系统就是他们的手机/终端上的软件系统,包括各种应用程序集合。在用户的眼里,如果一个操作系统没有图形界面、网络浏览器,那它就称为一个操作系统了。
18+
19+
其实,操作系统的内涵和外延随着历史的发展,也一直在变化,并没有类似于“1+1=2”这样的明确定义。参考生物的进化史,我们也给操作系统的进化历史做一个简单的概述,从中可以看到操作系统在各个时间段上包含什么,具有什么样的特征。但无论操作系统的内在实现和具体目标如何变化,其管理计算机硬件,给应用提供服务的功能需求没有变化。
20+
21+
三叶虫时代
22+
~~~~~~~~~~~~~~
23+
24+
电子计算机在1946年最开始出现的时候是没有操作系统(Operating System)的,只有操作员(Operator)。启动,扳开关,装卡片/纸带等比较辛苦的工作都是计算机操作员或者用户自己完成。操作员/用户带着记录有程序和数据的卡片\(punch card\)或打孔纸带去操作机器。装好卡片/纸带后,启动卡片/纸带阅读器,让计算机把程序和数据读入计算机机的内存中后,计算机就开始工作,并把结果也输出到卡片/纸带或显示屏上,最后程序停止。
25+
26+
由于人的操作效率太低,计算机的机时宝贵,所以就引入监控程序(Monitor)辅助完成输入,输出,加载,运行程序等工作,这是现代操作系统的起源。一般情况下,计算机每次只能执行一个任务,CPU大部分时间都在等待人的缓慢操作。这个“手工操作”过程一直持续到20世纪50年代。
27+
28+
.. note::
29+
30+
可以在 :ref:`本书第一章 <link-chapter1>` 看到初级的操作系统其实就是一个给应用提供各种服务(比如输出字符串)的库,方便了单一应用程序的开发与运行。
31+
32+
恐龙时代
33+
~~~~~~~~~~~~~~
34+
35+
在20世纪50年代~60年代,计算机发展到大型机阶段,而所对应的早期操作系统非常多样化,专用化,生产商生产出针对各自硬件的专用操作系统,大部分用汇编语言编写,这导致操作系统的进化比较缓慢,但进化再持续,从“手工操作”进化到了“批处理”阶段和“多道程序”阶段。在1964年,IBM公司开发了面向System/360系列机器的统一可兼容的操作系统——OS/360。OS/360是一种批处理操作系统。为了能充分地利用计算机系统,应尽量使该系统连续运行,减少空闲时间,所以批处理操作系统把一批作业(古老的术语,可理解为现在的程序)以脱机方式输入到磁带上,并使这批作业能一个接一个地连续处理:1)将磁带上的一个作业装入内存;2)并把运行控制权交给该作业;3)当该作业处理完成后,把控制权交还给操作系统;4)重复1-3的步骤。
36+
37+
批处理操作系统分为单道批处理系统和多道批处理系统。单道批处理操作系统只能管理内存中的一个(道)作业,无法充分利用计算机系统中的所有资源,致使系统整体性能较差。多道批处理操作系统能管理内存中的多个(道)作业,可比较充分地利用计算机系统中的所有资源,提升系统整体性能。
38+
39+
多道批处理操作系统为此采用了多道程序设计技术,就是指允许同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
40+
41+
虽然批处理操作系统提高了系统的执行效率,但其缺点是人机交互性差。如果程序员的代码出现错误,必须重新编码,上传内存,再执行。这需要花费以小时和天为单位的时间开销,使得程序员修改和调试程序很不方便。
42+
43+
.. note::
44+
45+
可以在 :ref:`本书第二章 <link-chapter2>` 看到单道批处理操作系统的设计实现,以及支持一个一个地执行应用程序的运行过程。而在 `本书第三章 <https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter3/index.html>`_ 的前三节可以看到多道批处理操作系统的设计实现,以及支持应用程序主动放弃CPU以提高系统整体执行效率的过程。
46+
47+
爬行动物时代
48+
~~~~~~~~~~~~~~
49+
50+
20世纪60年代末,提高人机交互方式的分时操作系统越来越展露头角。分时是指多个用户和多个程序以很小的时间间隔来共享使用同一台计算机上的CPU和其他硬件/软件资源。1964年由贝尔实验室、麻省理工学院及美国通用电气公司所共同参与研发目标远大的MULTICS\(MULTiplexed Information and Computing System\)操作系统,MULTICS是一套安装在大型主机上多人多任务的操作系统。 MULTICS以兼容分时系统(CTSS)做基础,建置在美国通用电力公司的大型机GE-645,目标是连接1000部终端机,支持300的用户同时上线。因MULTICS项目的工作进度过于缓慢,1969年AT&T的 Bell 实验室从MULTICS 研发中撤出。但贝尔实验室的两位软件工程师 Thompson 与 Ritchie借鉴了一些重要的Multics理念,以C语言为基础,发展出UNIX操作操作系统。UNIX操作系统的早期版本是完全免费的,可以轻易获得并随意修改,所以它得到了广泛的接受。后来,它成为开发小型机操作系统的起点。由于早期的广泛应用,它已经成为的分时操作系统的典范。
51+
52+
.. note::
53+
54+
可以在 :ref:`本书第三章 <link-chapter3>` 的第四节可以看到分时操作系统的设计实现,以及操作系统可强制让应用程序被动放弃CPU以提高系统整体执行效率的过程。并且UNIX还有虚存、文件、进程等当前操作系统的关键特性,这些内容也在本书的第四章~第七章中有详细的设计描述。
55+
56+
哺乳动物时代
57+
~~~~~~~~~~~~~~
58+
59+
20世纪70年代,微型处理器的发展使计算机的应用普及至中小企及个人爱好者,推动了个人计算机\(Personal Computer\)的发展,也进一步推动了面向个人使用的操作系统的出现。其代表是由微软公司中在20世纪80年代为个人计算机开发的DOS/Windows操作系统,其特点是简单易用,特别是基于Windows操作系统的GUI界面,极大地简化了一般用户使用计算机的难度,使得计算机得到了快速的普及。这里需要注意的是,第一个带GUI界面的个人计算机原型起源于伟大却又让人扼腕叹息的施乐帕洛阿图研究中心PARC(Palo Alto Research Center),PARC研发出的带有图标、弹出式菜单和重叠窗口的GUI(Graphical User Interface),可利用鼠标的点击动作来进行操控,这是当今我们所使用的GUI系统的基础。支持便捷的图形交互界面也成为从20世纪70年代~21世纪初的操作系统的主要特征之一。
60+
61+
.. note::
62+
63+
目前支持GUI交互接口的操作系统设计实现在本书中还没有对应的章节。但其操作系统的内核其实与分时操作系统的设计实现思路基本是一致的。如果在本书设计的简单分时操作系统的基础上,添加一个图形外设的驱动和一个简单的GUI窗口系统,也许是一个有趣的实验内容。
64+
65+
智人时代
66+
~~~~~~~~~~~~~~
67+
68+
21世纪以来,Internt和移动互联网的迅猛发展,使得在服务器领域和个人终端的应用与需求大增。iOS和Android操作系统是21世纪个人终端操作系统的代表,Linux在巨型机到数据中心服务器操作系统中占据了统治地位。以Android系统为例,Android操作系统是一个包括Linux操作系统内核、基于Java的中间件、用户界面和关键应用软件的移动设备软件栈集合。这里介绍一下广泛用在服务器领域和个人终端中的操作系统内核--Linux操作系统内核。1991年8 月,芬兰学生 Linus Torvalds\(林纳斯·托瓦兹\)在 comp.os.minix 新闻组贴上了以下这段话: 
69+
70+
71+
"你好,所有使用 minix 的人 -我正在为 386 ( 486 ) AT 做一个免费的操作系统 ( 只是为了爱好 )...″
72+
73+
74+
而他所说的"爱好″成为了大家都知道的 Linux操作系统内核。这个时代的操作系统的特征是联网,发挥网络的吞吐量和低延迟是这个时代的网络操作系统追求的目标。 
75+
76+
.. note::
77+
78+
目前支持联网的操作系统设计实现在本书中还没有对应的章节。但其操作系统的内核其实与分时操作系统的设计实现思路基本是一致的。如果在本书设计的简单分时操作系统的基础上,添加一个网卡外设的驱动和一个简单的网络协议栈,也许是另一个有趣的实验内容。
79+
80+
神人时代
81+
~~~~~~~~~~~~~~
82+
83+
当前,大数据、人工智能、机器学习、高速移动互联网络、AR/VR对操作系统等系统软件带来了新的挑战。如何有效支持和利用这些技术是未来操作系统的方向。
84+
85+
在2020年,我们看到了华为逐步推出的鸿蒙系统;小米也推出了物联网软件平台小米Vela;阿里推出了AliOS Thing;腾讯推出了Tencent OS;苹果公司接连推出A14、M1等基于ARM的CPU,逐步开始淘汰X86CPU;微软推出Windows 10 IoT,Google推出Fuchsia OS,也都在做着各种云、边、端的技术调整和创新。
86+
87+
大家好像都意识到,不仅仅是人工智能和机器学习,下一个具有分布式特征的操作系统的新突破即将到来,并试图通过这种具有分布式特征的操作系统带来的连贯用户体验,打通从数据中心、服务器、桌面、移动端、边缘设备等的整个AI+IoT(Internet of Things)的生态。也许这个时代的未来操作系统与之前的操作系统相比,其最大的不同是跳出了单个设备节点,而是通过高速的无线网络从多种维度来管理多个设备,形成分布式操作系统。
88+
89+
.. note::
90+
91+
目前支持AIoT的操作系统设计实现在本书中还没有对应的章节,不过我们的同学也设计了
92+
`zCore操作系统 <https://github.com/rcore-os/zCore>`_ ,
93+
欢迎看完本书的同学能够尝试参与或独立设计面向未来的操作系统。
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
操作系统的接口
2+
================================================
3+
4+
.. toctree::
5+
:hidden:
6+
:maxdepth: 5
7+
8+
操作系统的接口
9+
----------------------------------
10+
11+
读者可站在使用操作系统的角度来看操作系统,这样会比较容易对操作系统有个初步的进一步了解。操作系统内核是一个需要提供各种服务的软件,其服务对象是应用程序,而用户(这里可以理解为一般使用计算机的人)是通过应用程序的服务间接获得操作系统的服务的),所以操作系统内核藏在一般用户看不到的地方。但应用程序需要访问操作系统,获得操作系统的服务,这就需要通过操作系统的接口才能完成。如果把操作系统看成是一个函数库,那么其接口就是函数名称和它的参数。但操作系统不是简单的一个函数库,它的接口需要考虑安全因素,使得应用软件不能直接读写操作系统内部函数的地址地址空间,为此,操作系统设计了一个安全可靠的接口,我们称为系统调用接口(System Call Interface),应用程序可以通过系统调用接口请求获得操作系统的服务,但不能直接调用操作系统的函数和全局变量;操作系统提供完服务后,返回应用程序继续执行。
12+
13+
对于实际操作系统而言,具有大量的服务接口,比如目前Linux有三百个系统调用接口。下面列出了一些相对比较重要的操作系统接口:
14+
15+
* 进程(即程序运行过程)管理:复制创建进程--fork、退出进程--exit、执行进程--exec ...
16+
* 同步互斥的并发控制:信号量--semaphore、管程--monitor、条件变量--condition variable ...
17+
* 进程间通信:管道--pipe、信号--signal、事件--event ...
18+
* 虚存管理:内存空间映射--mmap、改变数据段地址空间大小--sbrk、共享内存--shared mem ...
19+
* 文件I/O操作:读--read、写--write、打开--open、关闭--close ...
20+
* 外设I/O操作:外设包括键盘、显示器、串口、磁盘、时钟 ...,但接口是直接采用了文件I/O操作的系统调用接口
21+
22+
.. note::
23+
24+
上述表述在某种程度上说明了操作系统对计算机硬件重要组成的抽象和虚拟化:
25+
26+
* 文件(File)是外设的一种抽象和虚拟化。特别对于存储外设而言,文件是持久存储的抽象。
27+
* 地址空间(Address Space)是对内存的抽象和虚拟化。
28+
* 进程(Process)是对计算机资源的抽象和虚拟化。而其中最核心的部分是对CPU的抽象与虚拟化。
29+
30+
有了这些接口,简单的应用程序就不用考虑底层硬件细节,可以在操作系统的服务支持和管理下简洁地完成其应用功能了。在现阶段,也许大家对进程、文件、地址空间等抽象概念还不了解,在接下来的章节会对这些概念有进一步的介绍。
31+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
操作系统抽象
2+
================================================
3+
4+
.. toctree::
5+
:hidden:
6+
:maxdepth: 5
7+
8+
9+
接下来读者可站在操作系统实现的角度来看操作系统。操作系统为了能够更好地管理计算机系统并对应用程序提供便捷的服务,在操作系统的发展过程中,计算机科学家提出了如下四个抽象概念,奠定了操作系统内核设计与实现的基础。操作系统原理中的其他基本概念基本上都基于上述这四个操作系统抽象。
10+
11+
.. note::
12+
13+
在本书中,下面的抽象表示将以有形的数据结构和实际的执行行在后续各章实现的操作系统内核中进行展示。
14+
15+
进程(Process)
16+
----------------------------------
17+
18+
进程是一个正在运行的程序。在计算机系统中,我们可以“同时”运行多个程序,这个“同时”,其实是操作系统给用户造成的一个“幻觉”。大家知道,处理器是计算机系统中的硬件资源。为了提高处理器的利用率,操作系统采用了多道程序技术。如果一个程序因某个事件而不能运行下去时,就把处理器占用权转交给另一个可运行程序。为了刻画多道程序的并发执行的过程,就要引入进程的概念。从操作系统原理上看,一个进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。操作系统中的进程管理需要协调多道程序之间的关系,解决对处理器分配调度策略、分配实施和回收等问题,从而使得处理器资源得到最充分的利用。
19+
20+
地址空间(Address Space)
21+
----------------------------------
22+
23+
地址空间是对物理内存的虚拟化和抽象,也称虚存(Virtual Memory)。它就是操作系统通过处理器中的MMU硬件的支持而给应用程序和用户提供一个大的(超过计算机中的内存条容量)、一致的(连续的地址空间)、私有的(其他应用程序无法破坏)的存储空间。这需要操作系统将内存和硬盘结合起来管理,为用户提供一个容量比实际内存大得多的虚拟存储器,并且需要操作系统为应用程序分配内存空间,使用户存放在内存中的程序和数据彼此隔离、互不侵扰。操作系统中的虚存管理与处理器的MMU密切相关。
24+
25+
文件(File)
26+
----------------------------------
27+
28+
文件主要是对持久存储的抽象。具体而言,文件可理解为存放在持久存储介质(比如硬盘、光盘、U盘等)上,方便应用程序和用户读写的数据。当处理器需要访问文件中的数据时,可通过操作系统把它们装入内存。放在硬盘上的程序也是一种文件。文件管理的任务是有效地支持文件的存储、检索和修改等操作。从一个更高的层次上看,文件就是对外设的一种统一抽象,并通过基本的读写操作来完成对外设的访问。
29+
30+
异常控制流(exceptional control flow)
31+
--------------------------------------
32+
33+
首先,处理器的控制流(flow of control 或 control flow)是指处理器中程序计数器的控制转移序列。最简单的一种控制流是一个“平滑的”序列,其中每个要执行的指令地址在内存中都是相邻的。如果前一条指令和后一条指令位于两个完全不同的位置,比如,前一条指令还在应用程序的代码段中,后一条指令就跑到操作系统的代码段中去了,这就是一种控制流的“突变”。简单地说,异常控制流是处理器在执行过程中的突变,即通过硬件和操作系统的协同工作来响应处理器状态中的特殊变化。比如当应用程序正在执行时,产生了时钟外设中断,导致操作系统打断当前应用程序的执行,转而去处理时钟外设中断,处理完毕后,再回到应用程序被打断的地方继续执行。在操作系统中,需要处理三类异常控制流:外设中断(Device Interrupt)、陷入(Trap)和异常(Exception,也称Fault Interrupt)。外设中断由外部设备引起的外部I/O事件如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。异常是在处理器执行指令期间检测到不正常的或非法的内部事件(如除零错、地址访问越界)。陷入是在程序中使用请求操作系统服务的系统调用而引发的有意事件。在后面的叙述中,如果没有特别指出,我们将用简称中断、陷入、异常来区分这三种异常控制流。

0 commit comments

Comments
 (0)