# 《现代操作系统》

***

### 操作系统在一台电脑中在哪个层次上工作？

一台完整的电脑有很多的分层方式。在其中一种分层方式中，我们将一台电脑分成硬件和软件。软件部分包含**用户态**和**内核态**。操作系统就工作在内核态中，其他的用户接口程序以及我们日常所使用的软件都在用户态中。

### 用户态和内核态的区别是什么？

简单理解，在内核态模式中操作系统具有对所有硬件的完全访问权，可以执行所有指令。权限高的地方需要严格保护。而更一般的，我们常使用的软件都不能在内核态中运行，另外使用了用户态，具有非常有限的权限。如果一般软件要使用系统服务，它必须执行一个**陷阱**或**系统调用**指令，将控制转移到内核态的操作系统执行。

### 操作系统的基本功能包括哪些？

功能一是为用户程序提供**抽象**。我们程序员日常写代码的过程中，如果想要打开某个**文件**，只需要一行代码就可以实现。然而这行代码隐藏了很多事情。我们想要打开文件，本质上是我们想要和硬盘做交互，想从硬盘上读取一些数据出来。

然而直接与硬件交互是一件痛苦的事情，在硬件之上，首先有**驱动软件**与硬件交互，这个软件提供了读写硬盘块的接口。在这个层面上，操作系统再提供一种抽象：**文件**。使用这个抽象，我们就能使用高级语言读写文件，而不用处理硬件中那些复杂的细节。简单来说，就是通过抽象的方式将丑陋接口变成美丽接口。

> 好的抽象可以把一个几乎不可能管理的任务划分成两个可以管理的部分：第一部分是有关抽象的定义和实现，第二个部分是随时使用这些抽象解决问题。

操作系统的第二个功能是管理资源，包括处理器，存储器，时钟，磁盘，鼠标，网络，打印机等设备，或者说在互相竞争的程序之间分配这些资源。分配的方式可以简单分为时间上和空间上复用。将CPU轮流分配给多个程序是时间上复用；为若干个程序分割内存是空间上复用。

具体来说，系统提供的最几个最主要的功能是进程与线程，虚拟内存管理以及文件系统。这也会是我们学习的主线。

### 什么是设备驱动程序？

尽管当今硬件接口有相应标准做统一，但是实际上每类设备控制器都是不同的，操作系统在安装的时候并不可能知道将来要使用哪些附加的硬件，需要额外的软件进行控制，因此需要设备驱动程序，设备驱动程序一般是由控制器厂家提供的， 一般会有多个版本对应支持多个操作系统。例如一台扫描仪会配有用于Windows，Linux，OS X的驱动。

### 什么是POSIX以及Win32API？

基于UNIX和基于Windows都有多个不同版本的操作系统，甚至我们都使用过多个Windows系统，像Windows XP 以及Windows 10。**Win32API**表示所有Windows版本都支持的接口，提供了Windows版本的兼容性。对应的，**POSIX**规定了基于UNIX的系统都必须实现的系统调用，有些系统调用比较常见，比如`open`，`waitpid`，`kill`等等。

### 什么是shell？

我们可能已经习惯了在Windows系统中对于一些图标操作，基于图标的被称为**图形用户界面**（GUI），而基于文本的被称为**shell**，这两者本质上都是用户与操作系统交互的程序。

### 我经常会看到一些结尾`.dll`的文件，它们是干什么用的？

除了在计算机初启时所装载的核心操作系统外，其他部件可以按照需要载入， 比如I/O设备驱动和文件系统。 在UNIX中它们被称为**共享库**，在Windows中它们被叫做**动态链接库**。Windows中这些文件以`.dll`结尾，你可以在`C:\Windows\system32`找到它们。

### 我之前在学习Java的过程中，时常听见JVM这个名词，这是什么？

在Sun公司发明Java语言的时候，同时也发明了称为**JVM**的**虚拟机**，Java编译器为JVM生成代码，这些代码可以由一个软件JVM解释器执行。这种方式的优点在于经过编译的JVM代码可以通过网络传送到任何一个有JVM解释器的计算机上，直接执行不用再次编译。

### 等等，什么又是虚拟机？

我的电脑是Windows系统，然而我又想体验一下Linux系统，并且我不想安装双系统，这时我会考虑**虚拟机管理程序**，比如VMWare Workstation，并且在虚拟机管理程序上安装Linux。 注意在这个情景下，虚拟机管理程序本质是一个软件，但是它为安装在它身上的Linux提供了一种“幻象”，模拟了整套硬件，让Linux认为它直接在与硬件做交互。

### 进程与线程？

***

所有的现代计算机经常会在同一时间做很多事，是需要一种方法去模拟并控制这种并发

严格来说一个CPU在某一个瞬间只能运行一个进程，而在1秒钟内可以运行多个进程，在来回切换的过程中就会产生并行的错觉，有时人们把这种情形称为伪并行

一个进程就是一个正在执行程序的实例，包括程序计数器，寄存器和变量的当前值。 当程序不在运行的时候，它仅仅只是存放在硬盘里的一些数据，当程序运行起来，我们就这把它称为一个进程，如果一个程序运行两遍，那就算两个进程。

### 程序与进程的区别是什么？

比如有一位好厨艺的父亲正在为他的女儿烘制生日蛋糕，他有食谱，厨房里有所需的原料。

* 其中，我们把父亲比作是CPU
* 做蛋糕的食谱就是程序（代码与算法）
* 做蛋糕的各种原料就是输入数据
* 进程是父亲阅读食谱，取来各种原料，以及制作蛋糕等一系列动作的总和

现在假设父亲的儿子哭着跑进了厨房，他的头被一个蜜蜂蜇了，父亲记录下他照着食谱做到哪儿了，然后拿出一本急救手册，按照其中的指示处理蛰伤。

* 其中，记录下照着食谱做到哪儿代表着保存进程的当前状态，
* 从做蛋糕到实施医疗救治，表示着从进程切换到另外一个更高优先级的进程，
* 急救手册就是另外一个进程的程序


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://qmmms.gitbook.io/note/operating_system/xian-dai-cao-zuo-xi-tong.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
