电子说
01操作系统都学些什么
操作系统的重要性当然不止于此。如果深入研究你就会发现,操作系统在整个计算机学科体系中处于一个十分关键的位置。计算机科学的学科方向多如牛毛,但总的来说可以分成两块,硬件一块,软件一块,这两大块都喜欢各玩各的,中间说是隔着次元壁也一点不夸张。
但都在一个体系内,总要想个办法来打破次元壁呀,这个重要的工作由谁来做呢?就是操作系统。所以从体系架构的角度看,操心系统是处在所有硬件的最上层,和所有软件的最下层,是一个“跨界”的角色。
操作系统很重要,那作为一门学科,难不难学呢?大家的态度走两个极端,一边的人觉得操作系统有什么可学的,不就是点鼠标划玻璃,太简单连小学的计算机课都不一定认真教,大学还专门设了专业课太夸张了。另一边的人又觉得操作系统太难,操作系统的玩家不是Linus这样的业界大神,就是微软、谷歌这样的行业大佬,萌新小本只好瑟瑟发抖。
这些观点对不对呢?
都有一些理解上的偏差。我们平时常说的“安装操作系统”,这里的“操作系统”,准确来说,应该叫“操作系统产品”,而操作系统这门课,主要内容讲的是操作系统的内核原理。
操作系统产品和操作系统内核二者的关系,有一点像计算机和CPU,没有它不行,光有它也不行。一款操作系统产品,首先肯定得有操作系统内核,但是光有内核是没法使用的,还得加上配套的周边功能。
虽然叫“周边配套”,但绝不是可有可无的意思,大部分我们所熟识操作系统功能,实际上都是属于“周边配套”,譬如说我们最最最熟悉的“桌面”,放着漂亮的壁纸,摆满各色各样的图标,是操作系统主要的用户交互界面,术语称为图形用户界面(GraphicalUserInterface,简称GUI)。
前面感觉自己“精通操作系统”的那位同学,其实精通的只是GUI的使用,而且很抱歉,GUI不在操作系统内核里面。
不过,话说回来,虽然专门有“操作系统内核”这样的术语,但并不意味着所谓的“内核”与“周边”之间,天然就存在一条清晰的界限。在操作系统里面,一直存在着宏内核和微内核两条路线的争论,争论的焦点,正是什么该划入“内核”,什么又该算作周边。
微内核的主张,顾名思义,就是最小化内核所需要提供的服务,只负责最基本的功能,把应用服务、驱动、GUI,甚至一些感觉上也挺基本的功能,譬如文件系统服务,都统统赶出内核。
这样做的好处是灵活方便,像是要提供新服务,那直接新增就可以了,不需要对内核进行额外的改动,但缺点也很突出,什么功能都赶出去了,真到用的时候还需要进行内核模式-用户模式的切换,模式切换会增加额外的开销,导致性能受损,因此就有人主张应该把常用的功能都接纳进来,这就是宏内核。
Windows早前采用的就是微内核架构,把GUI赶了出去,结果性能损失受不了,后来又重新请回来,一直到现在,GUI仍然是Windows内核的一部分。
02操作系统的核心内容
操作系统这门课主要研究的是操作系统内核,这名字不太平易近人,容易给人“难学懂”的感觉。确实,现在操作系统的功能越来越丰富,连带着操作系统内核也越来越复杂。有一本操作系统业内很有名的书,叫《WindowsInternals》,讲的是Windows操作系统的功能原理,从这本书就可以看出来操作系统的一个变化趋势。
《WindowsInternals》是跟着Windows推陈出新的,Windows不断更新,这本书也不断再版,一个肉眼可见的变化就是书越写越厚,现在最新版干脆把一本书分成了上下两卷,内容太多,光一块砖头已经不够装了。
这还只是Windows,现在是移动互联网时代,还有操作系统还有一半多的江山被iOS和Android这哥俩占着,而且都以一年一个版本的速度迭代,要学的知识岂不是漫无边际?
其实不用担心,操作系统确实在迅速发展,但最最核心的还是那些老兄弟。操作系统有一本非常经典的教材,只要你问就一定会有人推荐,叫《OperatingSystemConcept》,中文译为《操作系统概念》。因为这本书的封面画着恐龙,所以学界也称为“恐龙书”。
恐龙书不但介绍操作系统知识,还会引入“当前主流操作系统”作为研究案例。当然,恐龙书已经从第1版发展到了第9版,书里的“当前主流操作系统”也一换再换,默默地记录着操作系统的变化发展。
不过,我把几个版本比较了一下,最新版知识点增加了不少,还补充了一些新的内容,涵盖了iOS、Android等移动操作系统,但主要的知识结构并没有大幅调整,核心的研究对象和问题,仍然是早就登场的那几个。
具体是哪几个呢?就仨:进程、内存和存储。操作系统最重要的功能就是“管理”,具体来说是两项工作,资源的分配和资源的调度,那管理的核心对象是哪些呢?就是这仨,分别对应的硬件是CPU、内存和硬盘,想想就能知道,这仨同样是计算机里的三个扛把子部件。
我们说恐龙书经典,其中一个地方就体现在对操作系统知识体系的划分上面。恐龙书当然会重点照顾这三个核心对象,为它们一一设有单元,再加上必不可少的概论、大家现在都很关注的安全,以及前面提到的案例分析,就构成了恐龙书最新第9版的六大知识板块。
作为一名操作系统爱好者,我看过很多操作系统的书,有偏重原理的,有偏重实例的,也会有其它新的偏重,譬如会为网络,硬件架构、设备管理等等内容设置独立章节,但无论哪本书,进程、内存和存储(也有称为外存)始终是书里的三条主线。总而言之,学操作系统,首先都得紧紧抓住进程、内存和存储学懂学通。
03怎样学操作系统
既然进程、内存和存储是操作系统的三个核心对象,那具体应该怎么学呢?一句话回答:带着问题学。这里的“带着问题学”,和我们平时常说的有所不同,在操作系统里面,进程、内存和存储都有各自需要重点关注的问题。
就拿进程来说,进程是操作系统中相对比较抽象的概念,所以大多数操作系统的教材都会不吝笔墨,给进程下一堆的定义,试图只靠文字就解释清楚什么是进程。不过效果总不太好,大家不容易看懂,还容易看晕,毕竟“抽象”的意思就是说,你懂了马上心领神会,你不懂总感觉鸡同鸭讲。
我倒认为没必要在进程的定义上作过多纠结,关键是功用,开始只需要记住一点,进程对应的是CPU。计算机所谓的“计算”,指的就是CPU运算,那运算什么内容呢?这就是进程。
本来这个过程不算复杂,好像也没什么问题,但是后来人们搞出了“多进程”,一个CPU能“同时”运行多个进程。但这个“同时”不是真正的同时,用术语来说,是并发执行而不是并行执行,结果一下就复杂起来,问题也就随之而来了。
进程增多了,但CPU却只有一个,出现了多对一的竞态问题,这就是一切问题的起源。围绕着竞态问题,进程接着又衍生出了许多问题。
首先就是调度问题。对操作系统来说,调度是个大问题。书本肯定都会告诉你,进程有很多个状态,有些还画成了状态迁移图,各种线飞来飞去,看得眼花缭乱。感觉上很难,但我觉得,把握好了背后的逻辑,这些看似凌乱的知识点就是条理清晰地串在一起。
在这里,我们只需要死死盯住竞态问题,正是因为进程和CPU不再是一一对应,所以需要调度,而所谓调度,就是杂技里的用两只手玩五只球,总会区分出接回手里的、准备抛出的和停在空中的几种情况,所以也需要根据情况给进程配套设计不同的状态,调度的具体工作,就是想办法让进程在这几个状态中来回迁移倒腾,最终营造出CPU同时执行多个进程的假象。
进程之下是线程,现在又搞出了协程和纤程,以后不知道还会什么程,不过,目的只有一个,更充分地利用CPU时间,而且都难以避免一个问题,就是调度问题。
调度本身不难,难就难在设计调度原则,谁上谁下,执行多久,等待多久,都需要一一加以考虑,而且最难的地方在于,调度是没有最优解的,只有在指定原则条件下,设计出相当不错的调度方案。
进程除了竞争CPU,还要竞争资源,譬如两个甚至更多的进程可能都需要同时读写同一个文件,我们熟悉的多对一的关系,会导致我们熟悉的竞态问题,在CPU那导致了调度问题,而到了资源这里,则会导致同步问题和死锁问题。
同步问题很简单,进程既然要调度,那肯定没办法把活一口气干完,譬如说读写某个文件,读到一半被换下来了,下次再换上来的时候发现,别的进程也在读写这个文件,内容变了。
多线程有一个默契,就是前后环境要保持一致,你把我从CPU那换上换下我没意见,但你得保证我所处的环境是相同的,别像雍正那样一觉醒来发现大清亡了,后面也就没法跟着剧本走。那怎么保证一致性呢,这就是同步问题,方法包括互斥锁、信号量等等。
死锁问题听起感觉复杂一点,书上花了不少笔墨但内容还是不好懂。其实也不复杂,我们在小区门口喜闻乐见的堵车就是死锁。小区门口只有一条车道,早高峰大家都得排着队出去,这时如果外面有一辆车回来,开到门口又不肯避让,那就堵车了,用操作系统的术语来说,就是死锁了。
前面说,为了解决同步问题,我们会采取互斥锁等方法,简单来说,当多个进程都要使用同一项资源时,只有当前正在使用的进程用完了,也就是术语所说的资源释放了,后面的进程才可以接着用。这样做的好处当然是保证了一致性,但坏处则是导致了另一个问题,就是死锁问题。
拿前面的小区出口比划一下就清楚了。单车道当然是互斥的,要么只进要么只出,不可能一边进一边出。如果两头的来车各占一半车道,结果当然是想进来的进不来,想出去的出不去,两头堵死,这就死锁了。
那怎么解决死锁问题呢,大方向有两种,一种是避免出现死锁,从根本上解决这个问题,不过难度较大。另一种则是想办法对已经发生的死锁及时检测发现,然后进行恢复。但是怎么才能及时发现死锁呢?这又是一个操作系统方向需要研究的问题。
责任编辑人:CC
全部0条评论
快来发表一下你的评论吧 !