1.7 操作系统管理硬件
可以把操作系统看成是应用程序和硬件之间插入的一层软件。如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/77674de5888547c01b7d6d0a149169e2.png)
所有应用程序对硬件的操作尝试都必须通过操作系统。
操作系统有两个基本功能:
防止硬件被失控的应用程序滥用;
在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。
操作系统通过下图所示的几个基本的抽象概念(进程、虚拟存储器和文件),实现这两个功能:
![](https://i-blog.csdnimg.cn/blog_migrate/49e9f9826bae0150846b45a70efe0bb6.png)
文件是对I/O设备的抽象表示,虚拟存储器是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
1.7.1 进程
进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
我们称之为并发运行,实际上是说一个进程的指令和另一个进程的指令是交错执行的。
操作系统实现这种交错执行的机制称为上下文切换(context switching)。
操作系统保存进程运行所需的所有状态信息。
在任何一个时刻,系统上都只有一个进程正在运行。
当操作系统决定从当前进程转移控制权到某个新进程时,它就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权转移到新进程。新进程就会从它上次停止的地方开始。
示例hello运行的基本场景,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/bd38a1a7e44a5861e9e52f718ffefe0d.png)
在我们的示例场景中有两个同时运行的进程:shell进程和hello进程。
最开始,只有shell进程在运行,等待命令行上的输入。
当我们让它运行hello程序时,shell通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将控制权传递给操作系统。
操作系统保存shell进程的上下文,创建一个新的hello进程及其上下文,然后将控制权传给新的hello进程。
在hello进程终止后,操作系统恢复shell进程的上下文,并将控制权传回给它,它会继续等待下一命令行输入。
1.7.2 线程
一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
1.7.3 虚拟存储器
每个进程看到的存储器都是一致的,称之为虚拟地址空间。
Linux进程的虚拟地址空间,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/2737c0aa6e1b8a92681f3b793679ee19.png)
在Linux中, 最上面的四分之一的地址空间是预留给操作系统中的代码和数据的,这对所有进程都一样。
底部的四分之三的地址空间用来存放用户进程定义的代码和数据。
请注意,图中的地址是从下往上增大的。
每个进程看到的虚拟地址空间由大量准确定义的区(area) 构成,每个区都有专门的功能。
- 程序代码和数据。
代码是从同一固定地址开始,紧接着的是和C全局变量相对应的数据区。
代码和数据区是由可执行目标文件直接初始化的,在我们的示例中就是可执行文件hello。
- 堆。
代码和数据区后紧随着的是运行时堆。
代码和数据区是在进程一旦开始运行时就被指定了大小的,与此不同,作为调用像malloc和free这样的C标准库函数的结果,堆可以在运行时动态地扩展和收缩。
- 共享库。
在地址空间的中间附近是一块用来存放像C标准库和数学库这样共享库的代码和数翻据的区域。
- 栈。
位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。特别地,每次调用一个函数时,栈就会增长。每次从函数返回时,栈就会收缩。
- 内核虚拟存储器。
内核是操作系统总是驻留在存储器中的部分。
地址空间顶部的四分之一部是为内核预留的。应用程序不允许读写这个区域的内容或者直接调用内核代码定义的函数。
虚拟存储器的运作,基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
1.7.4 文件
文件只不过就是字节序列。
系统中的所有输入输出都是通过使用称为Unix I/O的一小组系统函数调用读写文件来实现的。
1.8 利用网络系统和其他系统通信
当系统从主存拷贝一串字符到网络适配器时,数据流经过网络到达另一台机器。
相似地,系统可以读取从其他机器发送来的数据,并把数据拷贝到自己的主存。
从一台主机拷贝信息到另外一台主机已经成为计算机系统最重要的用途之一。
在远端运行hello程序包括如下图所示的五个基本步骤:
![](https://i-blog.csdnimg.cn/blog_migrate/9331d2869f4b068a0b196583b7c3636d.png)
参考
《深入理解计算机系统》 —— 1 计算机系统漫游