操作系统学习心得1

上完了一个学期的操作系统课程,写点心得体会。不是总结,因为各种总结已经很多了,我就写点自己的心得。将来打算写很多,有啥心得都会写下来,这是第一篇。近期会再写一篇计算机网络的心得,另外放假后打算继续看《深入理解计算机系统》(刚看两章),打算写一些笔记,如果有小伙伴想一起看的话咱们可以相互督促一下。

我写文章的语气比较啰嗦,总是有很多“我觉得”、“我认为”,所以这篇文章我尝试大幅省略这些话,但是意思是不变的。

如果读者觉得我总结的内容有任何问题,或者产生了任何想法,都请随时交流!这也是我写文章的初衷。


咱们身边能见到的操作系统很多,比如 Windows、Android 等。他们主要分为两个大派系,就是 Windows 派和 Unix 派。源于 Unix 的操作系统叫“类 Unix 操作系统”或是“*nix”,比如 Linux、Android、iOS、macOS 这些。比如,当我学习 Linux 下的指令时,不少指令都可以在 Macbook 的 Terminal 里进行测试,而且运行结果差别往往不大,说明 macOS 的内核跟 Linux 的内核是想通的。

还有一些操作系统,比如 Solari,FreeBSD,这些是基于 Unix 的操作系统。另外就是 Windows,大家耳熟能详的操作系统。


《计算机科学概论》,Nell Dale & John Lewis,一书第十章“操作系统”有一个本章目标:

学完本章之后,你应该能够:

  • 描述操作系统的两个主要责任。
  • 定义内存和进程管理。
  • 解释分时操作是如何创建虚拟机假象的。
  • 解释逻辑地址和物理地址之间的关系。
  • 比较内存管理方法。
  • 区别固定分区法和固定分区法。
  • 定义和应用分区选择算法。
  • 解释请求分页是如何创建虚拟机假象的。
  • 解释进程生存周期的各个阶段和过渡。
  • 解释各种 CPU 调度算法的处理。

大家可以和自己的知识对照一下。

操作系统是硬件和软件的中间层,操作系统下边是计算机软/硬件具体的工作,即《计算机组成原理》课程的内容,操作系统上层是应用的层面。操作系统调度并管理硬件设备,创造抽象层,提供给上层应用使用,比如,各类系统调用。

操作系统的核心功能是进程管理和内存管理,再加上文件系统和设备管理,就构成了最小操作系统。操作系统两个主要责任,一是管理硬件资源,二是提供交互界面。

操作系统这门课中,一个贯穿的思想是抽象与分层,以及分层带来的不同角度的视角。比如内存管理、文件系统、设备管理,核心的方法都是抽象,并产生不同角度不同的视角。以内存管理为例,如果从硬件的角度来观察,就只能看到分页机制;而从用户角度来看,能看到分段机制,而分页机制对用户来说就是透明的。这种不同视角有不同图像的感觉,在很多其他知识,比如计算机系统结构里也有体现。

关于操作系统的目的,除了刚才提到的对硬件设备进行管理和抽象、提供交互界面等课本上提到的功能,我自己还有一个理解,就是操作系统的一个目的是,将各种不同各样的东西,用一套方法,进行“标准化”,以尽可能高效地利用计算能力。毕竟计算机的本质就是使用计算能力解决问题。比如,如果有某种计算机,专门用作实时系统,或者作为批处理系统只处理大作业,那可能不需要复杂的进程调度算法,但来自现实世界的计算需求是未知的,既有可能算π的一百万位,又有可能要打游戏,所以通过更加复杂的进程调度算法,来适应这种需求的未知性,将规模不同的需求标准化为一些尽可能高效地使用计算能力的格式。

操作系统还有一项任务就是提供并行利用计算资源的能力,更准确来说应该是并发。我对并行和并发的区别理解如下:并行是真正的同时进行,比如多个CPU核心,它们相互之间的关系就是并行。而并发是一种对并行的模拟,本质上还是串行的,比如RR进程调度算法,可以实现进程间的并发。计算机诞生之初是用来计算数学问题,批处理的模式就可以了,但是随着计算机通途的发展,对并行性提出了更高的要求,所以实时性在计算机上被实现,具体也是通过操作系统。

“在分时系统中,每个用户都有自己的虚拟机。”这里虚拟机的意思是指,操作系统通过分时系统,将一套物理设备虚拟成许多虚拟的设备,提供给每一位用户使用。同样的,我们也可以说,“通过进程调度算法,每个进程都有自己的虚拟机。”因为,每个进程都有自己的上下文环境,比如 CPU 寄存器的值,但是 CPU 只有一个,进程却有那么多,所以每个进程都有自己的“虚拟机”。具体到咱们学的知识里,就是进程(线程)通过 CPU 调度算法切换上下文(比如切换PCB)。

另外,我对“多道程序设计”这个概念之前理解有误,这个概念应该是指“在主存中同时驻留多个程序的技术”,而不是关于 CPU 并行的技术。

CPU 调度算法里有一个“SJN”,即最短作业优先算法。这个算法就跟换页算法中的 OPT 算法一样,是无法精确实现的。当然可以部分实现,比如通过各种方法对程序的运行时间进行估算,但是总是无法精确得知程序的运行时间。理论上,SJN 可以被证明是最佳的,有最短的平均周转时间。这让我想到了“停机问题”,预知未来总是很难,所以不如用更完善的方法去应对,对吧?


在大学里有两门课我学的是很开心的,分别是计算机组成原理和操作系统,虽然从考试的角度来看,也许不尽人意,但我有一种求知欲得到了满足的快乐感,就是终于能明白计算机从头到脚大概是个什么脉络了。计算机组成原理里,下至电路逻辑门,上至CPU指令;而在操作系统里,下至CPU指令,上至应用层(系统调用),串起来了。我还记得小时候家里有台286,我特别喜欢往机箱里塞东西。后来我把家里的台式机外壳拆了,就是想看看机箱里究竟有什么东西。当我看到机箱里那么空空如也的时候,还有些失望,因为一直以为机箱里满满当当的。后来,我试图用钢锯锯开卡西欧计算器芯片外的黑胶,就是想看看“芯片”的里面又是什么东西。如今,虽然称不上对细节有多么的了解,但终于是对计算机这个事物能有了一个整体的感触了。

想想也很惭愧,专业课还是学的太不踏实,包括这门操作系统,其实有很多东西还是没搞明白呢,写这些文字就是随口瞎扯。

我觉得我很幸运,因为我学计算机,并不是仅仅把它当做是谋生的手段,或是在无意识中被推动着走,而是我能在对这个专业的学习中感到些许快乐。我觉得这真的很好。往者不可谏,来者犹可追,希望自己还是踏踏实实点。

心情不太好。有时候会被问要不要出国、要不要读研,我觉得对于像我这样数学这么渣的人,有什么可出国的,有什么可读研的,就工作得了。大学上了快两年半了,我想我从今天开始也终于放下了一些心中的包袱。上大学也是一个探索自己的过程,怎么说呢,扬长避短吧。