《 Operating System-There Easy Pieces 》这本书是一本非常好的操作系统教材,里面讲述了进程管理、内存管理、并发和文件系统的原理、历史。浅显易懂,是学习操作系统不可多得的好书。但是目前只有英文版,其实英文版词汇量也不算多,我这英语水平看着都不会太吃力。
但还是想翻译成中文,以便以后复习方便。可我最近发现已经有中文翻译版本的书出版在 卖了,而我目前只翻译了前10章。一下子没有了动力。
把书买了回来,先看看。前10章自己翻译(其实基本是谷歌翻译)的内容就在这里贴出来吧。
2.操作系统介绍
如果您正在攻读本科操作系统课程,那么您应该已经知道计算机程序运行时发生了什么。如果没有,这本书(和相应的课程)将很难。
- 所以你应该停止阅读这本书,或者跑到最近的书店,去学习消化必要的背景资料(Patt / Patel [PP03],特别是Bryant / O'Hallaron [BOH10]是非常好的书) 。
那么程序运行会发生什么?
好吧,正在运行的程序做了一件非常简单的事情:它执行指令。每秒数百万(有时甚至数十亿)次,处理器从存储器中取出指令,对其进行解码(即,确定这是哪条指令),并执行它(即,让该指令完成该做的事,比如两个数字相加,访问内存,检查条件,跳转到一个函数,等等)。完成此指令后,处理器继续执行下一条指令,依此类推直到程序最终完成。
因此,我们刚刚描述了冯诺依曼计算模型的基础知识。听起来很简单吧?但是在本课程中,我们将学习在程序运行的同时,还有很多其他的东西正在进行,其主要目标是使系统易于使用。
事实上,有一大堆软件负责使程序运行变得容易(甚至允许你看似同时运行多个程序),允许程序共享内存,使程序与设备交互,以及其他有趣的类似的东西。该软件主体称为操作系统(OS),因为它负责确保系统以易于使用的方式正确有效地运行。
操作系统执行此操作的主要方式是通过我们称为虚拟化的通用技术。也就是说,操作系统采用物理资源(例如处理器,内存或磁盘)并将其转换为更通用,功能强大且易于使用的虚拟形式。因此,我们有时将操作系统称为虚拟机。
当然,为了让用户告诉操作系统做什么从而利用虚拟机的功能(例如运行程序,分配内存或访问文件),操作系统还提供了一些接口(您可以调用的API)。事实上,典型的OS会导出几百个可供应用程序使用的系统调用。由于操作系统提供这些调用来运行程序,访问内存和设备以及其他相关操作,我们有时也会说操作系统为应用程序提供了标准库。
最后,因为虚拟化允许许多程序运行(从而共享了CPU),并且许多程序同时访问自己的指令和数据(从而共享内存),以及许多访问设备的程序(因此共享磁盘等等),OS有时被称为资源管理器。每个CPU,内存和磁盘都是系统的资源;因此,操作系统的角色是管理这些资源,有效或公平地执行,或者考虑到许多其他可能的目标。为了更好地理解操作系统的作用,让我们看看一些例子。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4 #include <assert.h>
5 #include "common.h"
6
7 int
8 main(int argc, char *argv[])
9 {
10 if (argc != 2) {
11 fprintf(stderr, "usage: cpu <string>\n");
12 exit(1);
13 }
14 char *str = argv[1];
15 while (1) {
16 Spin(1);
17 printf("%s\n", str);
18 }
19 return 0;
20 }
Figure 2.1: Simple Example: Code That Loops and Prints
2.1 虚拟CPU
图2.1描绘了我们的第一个程序。它没有做太多事情。实际上,它所做的只是调用Spin(),这是一个重复检查时间的函数,一旦运行一秒就会返回。 然后,它打印出用户在命令行上传入的字符串,并永远重复。 假设我们将此文件保存为cpu.c并决定在具有单个处理器的系统上编译和运行它。 以下是我们将看到的内容:
prompt> gcc -o cpu cpu.c -Wall
prompt> ./cpu "A"
A
A
A
A
ˆC
prompt>
运行过程比较无聊:系统开始运行程序,该程序反复检查直到第二个运行的时间。 一旦第二次过去,代码将打印用户传入的输入字符串(在本例中为字母“A”),然后继续。 注意程序将永远运行; 只有按“Control-c”(在基于UNIX的系统上将终止在前台运行的程序)我们才能暂停程序。
现在,让我们再跑一下这个程序,但这一次,让我们运行同一个程序的许多不同实例。 图2.2显示了这个稍微复杂的例子的结果。
prompt> ./cpu A & ; ./cpu B & ; ./cpu C & ; ./cpu D & [1] 7353
[2] 7354
[3] 7355