学操作系统的技巧(怎样学操作系统)

导读:这一篇聊操作系统。最近大家对“卡脖子”讨论很多,首当其冲是芯片,紧接着就是操作系统。操作系统,英文名Operating System,所以也常简称“OS”。操作系统很重要,计算机系的学生都知道,操作系统作为一门核心专业课,和数据库、编译原理合称“三座大山”。

作者:木羊同学

来源:华章科技

学操作系统的技巧(怎样学操作系统)(1)

01 操作系统都学些什么

操作系统的重要性当然不止于此。如果深入研究你就会发现,操作系统在整个计算机学科体系中处于一个十分关键的位置。计算机科学的学科方向多如牛毛,但总的来说可以分成两块,硬件一块,软件一块,这两大块都喜欢各玩各的,中间说是隔着次元壁也一点不夸张。

但都在一个体系内,总要想个办法来打破次元壁呀,这个重要的工作由谁来做呢?就是操作系统。所以从体系架构的角度看,操心系统是处在所有硬件的最上层,和所有软件的最下层,是一个“跨界”的角色。

操作系统很重要,那作为一门学科,难不难学呢?大家的态度走两个极端,一边的人觉得操作系统有什么可学的,不就是点鼠标划玻璃,太简单连小学的计算机课都不一定认真教,大学还专门设了专业课太夸张了。另一边的人又觉得操作系统太难,操作系统的玩家不是Linus这样的业界大神,就是微软、谷歌这样的行业大佬,萌新小本只好瑟瑟发抖。

这些观点对不对呢?

都有一些理解上的偏差。我们平时常说的“安装操作系统”,这里的“操作系统”,准确来说,应该叫“操作系统产品”,而操作系统这门课,主要内容讲的是操作系统的内核原理。

操作系统产品和操作系统内核二者的关系,有一点像计算机和CPU,没有它不行,光有它也不行。一款操作系统产品,首先肯定得有操作系统内核,但是光有内核是没法使用的,还得加上配套的周边功能。

虽然叫“周边配套”,但绝不是可有可无的意思,大部分我们所熟识操作系统功能,实际上都是属于“周边配套”,譬如说我们最最最熟悉的“桌面”,放着漂亮的壁纸,摆满各色各样的图标,是操作系统主要的用户交互界面,术语称为图形用户界面(Graphical User Interface,简称GUI)。

前面感觉自己“精通操作系统”的那位同学,其实精通的只是GUI的使用,而且很抱歉,GUI不在操作系统内核里面。

不过,话说回来,虽然专门有“操作系统内核”这样的术语,但并不意味着所谓的“内核”与“周边”之间,天然就存在一条清晰的界限。在操作系统里面,一直存在着宏内核和微内核两条路线的争论,争论的焦点,正是什么该划入“内核”,什么又该算作周边。

微内核的主张,顾名思义,就是最小化内核所需要提供的服务,只负责最基本的功能,把应用服务、驱动、GUI,甚至一些感觉上也挺基本的功能,譬如文件系统服务,都统统赶出内核。

这样做的好处是灵活方便,像是要提供新服务,那直接新增就可以了,不需要对内核进行额外的改动,但缺点也很突出,什么功能都赶出去了,真到用的时候还需要进行内核模式-用户模式的切换,模式切换会增加额外的开销,导致性能受损,因此就有人主张应该把常用的功能都接纳进来,这就是宏内核。

Windows早前采用的就是微内核架构,把GUI赶了出去,结果性能损失受不了,后来又重新请回来,一直到现在,GUI仍然是Windows内核的一部分。

学操作系统的技巧(怎样学操作系统)(2)

02 操作系统的核心内容

操作系统这门课主要研究的是操作系统内核,这名字不太平易近人,容易给人“难学懂”的感觉。确实,现在操作系统的功能越来越丰富,连带着操作系统内核也越来越复杂。有一本操作系统业内很有名的书,叫《Windows Internals》,讲的是Windows操作系统的功能原理,从这本书就可以看出来操作系统的一个变化趋势。

《Windows Internals》是跟着Windows推陈出新的,Windows不断更新,这本书也不断再版,一个肉眼可见的变化就是书越写越厚,现在最新版干脆把一本书分成了上下两卷,内容太多,光一块砖头已经不够装了。

这还只是Windows,现在是移动互联网时代,还有操作系统还有一半多的江山被iOS和Android这哥俩占着,而且都以一年一个版本的速度迭代,要学的知识岂不是漫无边际?

其实不用担心,操作系统确实在迅速发展,但最最核心的还是那些老兄弟。操作系统有一本非常经典的教材,只要你问就一定会有人推荐,叫《Operating System Concept》,中文译为《操作系统概念》。因为这本书的封面画着恐龙,所以学界也称为“恐龙书”。

恐龙书不但介绍操作系统知识,还会引入“当前主流操作系统”作为研究案例。当然,恐龙书已经从第1版发展到了第9版,书里的“当前主流操作系统”也一换再换,默默地记录着操作系统的变化发展。

不过,我把几个版本比较了一下,最新版知识点增加了不少,还补充了一些新的内容,涵盖了iOS、Android等移动操作系统,但主要的知识结构并没有大幅调整,核心的研究对象和问题,仍然是早就登场的那几个。

具体是哪几个呢?就仨:进程、内存和存储。操作系统最重要的功能就是“管理”,具体来说是两项工作,资源的分配和资源的调度,那管理的核心对象是哪些呢?就是这仨,分别对应的硬件是CPU、内存和硬盘,想想就能知道,这仨同样是计算机里的三个扛把子部件。

我们说恐龙书经典,其中一个地方就体现在对操作系统知识体系的划分上面。恐龙书当然会重点照顾这三个核心对象,为它们一一设有单元,再加上必不可少的概论、大家现在都很关注的安全,以及前面提到的案例分析,就构成了恐龙书最新第9版的六大知识板块。

作为一名操作系统爱好者,我看过很多操作系统的书,有偏重原理的,有偏重实例的,也会有其它新的偏重,譬如会为网络,硬件架构、设备管理等等内容设置独立章节,但无论哪本书,进程、内存和存储(也有称为外存)始终是书里的三条主线。总而言之,学操作系统,首先都得紧紧抓住进程、内存和存储学懂学通。

学操作系统的技巧(怎样学操作系统)(3)

03 怎样学操作系统

既然进程、内存和存储是操作系统的三个核心对象,那具体应该怎么学呢?一句话回答:带着问题学。这里的“带着问题学”,和我们平时常说的有所不同,在操作系统里面,进程、内存和存储都有各自需要重点关注的问题。

就拿进程来说,进程是操作系统中相对比较抽象的概念,所以大多数操作系统的教材都会不吝笔墨,给进程下一堆的定义,试图只靠文字就解释清楚什么是进程。不过效果总不太好,大家不容易看懂,还容易看晕,毕竟“抽象”的意思就是说,你懂了马上心领神会,你不懂总感觉鸡同鸭讲。

我倒认为没必要在进程的定义上作过多纠结,关键是功用,开始只需要记住一点,进程对应的是CPU。计算机所谓的“计算”,指的就是CPU运算,那运算什么内容呢?这就是进程。

本来这个过程不算复杂,好像也没什么问题,但是后来人们搞出了“多进程”,一个CPU能“同时”运行多个进程。但这个“同时”不是真正的同时,用术语来说,是并发执行而不是并行执行,结果一下就复杂起来,问题也就随之而来了。

进程增多了,但CPU却只有一个,出现了多对一的竞态问题,这就是一切问题的起源。围绕着竞态问题,进程接着又衍生出了许多问题。

首先就是调度问题。对操作系统来说,调度是个大问题。书本肯定都会告诉你,进程有很多个状态,有些还画成了状态迁移图,各种线飞来飞去,看得眼花缭乱。感觉上很难,但我觉得,把握好了背后的逻辑,这些看似凌乱的知识点就是条理清晰地串在一起。

在这里,我们只需要死死盯住竞态问题,正是因为进程和CPU不再是一一对应,所以需要调度,而所谓调度,就是杂技里的用两只手玩五只球,总会区分出接回手里的、准备抛出的和停在空中的几种情况,所以也需要根据情况给进程配套设计不同的状态,调度的具体工作,就是想办法让进程在这几个状态中来回迁移倒腾,最终营造出CPU同时执行多个进程的假象。

进程之下是线程,现在又搞出了协程和纤程,以后不知道还会什么程,不过,目的只有一个,更充分地利用CPU时间,而且都难以避免一个问题,就是调度问题。

调度本身不难,难就难在设计调度原则,谁上谁下,执行多久,等待多久,都需要一一加以考虑,而且最难的地方在于,调度是没有最优解的,只有在指定原则条件下,设计出相当不错的调度方案。

进程除了竞争CPU,还要竞争资源,譬如两个甚至更多的进程可能都需要同时读写同一个文件,我们熟悉的多对一的关系,会导致我们熟悉的竞态问题,在CPU那导致了调度问题,而到了资源这里,则会导致同步问题和死锁问题。

同步问题很简单,进程既然要调度,那肯定没办法把活一口气干完,譬如说读写某个文件,读到一半被换下来了,下次再换上来的时候发现,别的进程也在读写这个文件,内容变了。

多线程有一个默契,就是前后环境要保持一致,你把我从CPU那换上换下我没意见,但你得保证我所处的环境是相同的,别像雍正那样一觉醒来发现大清亡了,后面也就没法跟着剧本走。那怎么保证一致性呢,这就是同步问题,方法包括互斥锁、信号量等等。

死锁问题听起感觉复杂一点,书上花了不少笔墨但内容还是不好懂。其实也不复杂,我们在小区门口喜闻乐见的堵车就是死锁。小区门口只有一条车道,早高峰大家都得排着队出去,这时如果外面有一辆车回来,开到门口又不肯避让,那就堵车了,用操作系统的术语来说,就是死锁了。

前面说,为了解决同步问题,我们会采取互斥锁等方法,简单来说,当多个进程都要使用同一项资源时,只有当前正在使用的进程用完了,也就是术语所说的资源释放了,后面的进程才可以接着用。这样做的好处当然是保证了一致性,但坏处则是导致了另一个问题,就是死锁问题。

拿前面的小区出口比划一下就清楚了。单车道当然是互斥的,要么只进要么只出,不可能一边进一边出。如果两头的来车各占一半车道,结果当然是想进来的进不来,想出去的出不去,两头堵死,这就死锁了。

那怎么解决死锁问题呢,大方向有两种,一种是避免出现死锁,从根本上解决这个问题,不过难度较大。另一种则是想办法对已经发生的死锁及时检测发现,然后进行恢复。但是怎么才能及时发现死锁呢?这又是一个操作系统方向需要研究的问题。

关于作者:莫凡,网名木羊同学。娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

学操作系统的技巧(怎样学操作系统)(4)

延伸阅读《现代操作系统:原理与实现》

推荐语:操作系统和系统安全领域国际知名学者、上海交通大学陈海波、夏虞斌领衔撰写。作者在复旦大学和上海交通大学十余年操作系统教学经验的科学总结。由浅入深介绍现代操作系统经典理论与方法,结合前沿研究与工业界实践,面向真实场景与真实问题。全新打造ChCore微内核系列课程实验,建立对操作系统的第一手实践经验。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页