学习《操作系统导论》04

抽象:地址空间

早期操作系统

早期的操作系统定位更像是一个函数库,尤其是对内存这块其实几乎是没有什么抽象的,一块物理内存空间中,实际上就是简单的两块:OS+程序。

多道程序和分时共享

在计算机还未普及的年代,每台计算机价格极其昂贵,动辄都是上百万美金,所以这时候对计算机的利用效率就成了大家一致的追求。

这个阶段初期,出现了多道程序机制,这个机制简单来说就是:计算机可以同时运行多个程序,但是并不是说这些程序同时运行,而是许多程序都是处于准备状态,当一个进程在运行时,进入了IO阻塞状态,就直接调度其他进程接着执行,目的就是为了提高CPU的利用效率。如此循环往复,确保计算机能够一直不停的处于工作状态。

后来随着计算机的发展,首先从程序员行业来说,就带来了一个不得不考虑的问题:计算机资源昂贵,所以那时的程序员并不是像现在这样,哪怕写了很简单的几行代码就可以直接上机运行了,那时候都需要排期,因此每次在轮到的时候,大家都会把这段时间以来留存下来的代码一并提交上,然后根据具体的运行情况,再进行调整改进,以期待下次继续排到自己。

这个循环过程周期长,并且很不方便,所以此时大家更希望的是:对于我提交的程序能尽快执行,可以及时得到反馈。因此出现了分时共享系统。

这里的分时共享,实际上也是一种交替执行的策略,在早期阶段,计算机内存不多,所以此时的分时系统在某一时段内运行某个进程的时候,这个进程会占用所有的内存空间;然后经过一个时间周期后,切换到另一个进程上,此时需要将上一个进程的现场信息进行保存,因此可能会将其存到磁盘上。然后所有的进程都如此反复操作。

此时它存在的最大问题就是:效率太低了,因为涉及到进程切换,此时会有一些堆、栈、初始化变量等等信息需要进行转换,尤其这些数据还是在磁盘上,这就导致效率进一步降低。

这里初步的调整可以考虑将这些现场信息存到内存中,而非磁盘上,随着内存的发展,内存空间现在变得越来越大了,因此这种情况可以得到一定的改善,但是还是不得不面对一个事实:内存始终都是优先的,而且内存的造价也远非磁盘可比的。

同时因为内存的发展,所以现在内存中会同时驻留很多进程,这种情况下就带来了另一个考虑:保护。因为多个进程的数据都驻留在内存中,操作系统就需要确保这些数据有很好的隔离性,A进程在运行的时候不会访问到B进程的内存数据。

地址空间

接下来简单介绍了一下地址空间,处于简单考虑,这里书中只给出了三种内存空间:

  • 代码

从上到下,代码实际上就是存放指令的地方,堆就是在程序中动态管理的内存区域,一般比如C程序中的malloc或者Java中的new操作都是在这个区域内,他的增长方向是正向的,而栈位于地址空间的另一端,它的增长方向恰恰和堆是相反的,因此它被放在了地址空间的另一端。

目标

接着介绍了虚拟内存的三个目标:

  • 透明:所谓透明就是确保内存的实际物理情况对进程本身保持透明,每个进程在运行的时候都感觉到自己在使用一大片内存区域,在它的视野内看不到其他情况。
  • 效率:引入虚拟内存的另一个目标就是为了提高效率问题,这个效率既包括空间效率,也包括时间效率。空间效率就是在尽可能小的空间上做更多的事情,而时间效率就是确保程序不会运行得太慢。
  • 保护:前面也介绍到了数据隔离的问题,虚拟户内存也是为了确保进程不会收到干扰,每个进程只能看到本进程的相关信息,不会偷窥到其他进程的情况,这样某个进程出现问题时,其他进程可以不受影响继续运行。

补充:
在C程序中,如果我们打印指针,会得到一串十六进制的数据,这个我们一般叫它地址信息,但是这里的地址实际上是虚拟地址,在所有用户级的程序中,我们能看到的关于地址的数据实际上都是虚拟地址,实际的物理地址只有操作系统和硬件本身知道。

posted @ 2023-05-13 20:38  StillLoving  阅读(30)  评论(0)    收藏  举报