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

作者:木羊同学

来源:华章计算机(ID:hzbook_jsj)

01 操作系统都学些什么

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

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

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

这些观点对不对呢?

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

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

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

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

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

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

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

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

02 操作系统的核心内容

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

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

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

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

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

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

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

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

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

03 怎样学操作系统

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

划重点????

干货直达????

  • 手把手教你用Matplotlib进行数据可视化

  • 详解华为12种数据采集技术及应用实践

  • 如何让图表更有说服力?6大准则和1个经典案例给你讲明白

  • Python循环语句代码逐行详解:while、for、break和continue

更多精彩????

在公众号对话框输入以下关键词

查看更多优质内容!

PPT | 读书 | 书单 | 硬核 | 干货 讲明白 | 神操作

大数据 | 云计算 | 数据库 | Python | 可视化

AI | 人工智能 | 机器学习 | 深度学习 | NLP

5G | 中台 | 用户画像 1024 | 数学 | 算法 数字孪生

据统计,99%的大咖都完成了这个神操作

????

怎样学操作系统?一文带你掌握核心内容相关推荐

  1. 为什么模电这么难学?一文带你透彻理解模电

    想必模电就是小伙伴们非常头疼的一门课程,最深刻的感受莫过于就是"老师说第一遍不懂,第二遍还是不懂,第三遍还是不懂." 网友对模电有以下总结: 天书般难懂. 模电=魔电 本科模电就够 ...

  2. 一文带你全面了解内容运营及其发展趋势

    单说运营,很多小伙伴们可能都一头雾水,标题太大.它分为内容运营.产品运营.用户运营.活动运营.社区运营.数据运营.电商运营-等等.我们今天说的是内容运营,随着互联网的不断发展,网站运营工作也随之不断的 ...

  3. 计算机软件系统发展历史,一文带你了解操作系统发展史

    大家了解过操作系统的发展史吗?在当下这个互联网时代,计算机已经成为了人类的生活必需品,而计算机操作系统的发展历史,也就代表着计算机的发展历史.今天贤集网小编为大家详细的整理了一份关于操作系统发展史的相 ...

  4. 教妹学Java(二十一):一文带你了解面向对象编程的所有概念

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 的博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我还力求把每一个 ...

  5. 『带你学AI』一文带你搞懂OCR识别算法CRNN:解析+源码

    目录 前言 一.CRNN 1.1 CRNN 介绍 1.2 CRNN 网络结构 1.2.1 CNN 1.2.2 Map-to-Sequence 1.2.3 RNN 1.2.4 CTC Loss 1.3 ...

  6. 当初我要是这么学操作系统就好了(附思维导图)

    公众号关注 "GitHubDaily" 设为 "星标",每天带你学编程! 作者 | cxuan 来源 | Java建设者 本文思维导图 操作系统 现代计算机系统 ...

  7. 《一文带你读懂:云原生时代业务监控》

    点击上方蓝字关注我们! 对业务来说,完备的应用健康性和数据指标的监控非常重要,通过采集准确的监控指标.配置合理的告警机制,我们能够提前或者尽早发现问题,并做出响应.解决问题,进而保证产品的稳定性,提升 ...

  8. 小白如何学操作系统?

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达! 很多读者问我如何学习操作系统?推荐几本操作系统可以看的书?操作系统都需要学什么?有哪些视频可以看吗?下面我就针对性的对这些问题做一下我自己 ...

  9. 训练的神经网络不工作?一文带你跨过这37个坑

    近日,Slav Ivanov 在 Medium 上发表了一篇题为<37 Reasons why your Neural Network is not working>的文章,从四个方面(数 ...

最新文章

  1. python开发环境anaconda_搭建Python开发环境,用Anaconda + PyQt + Pycharm
  2. DELL OME监控服务器安装配置
  3. hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
  4. jQuery之ajax的跨域获取数据
  5. arduino 停止程序_极路由1S OpenWrt开机自启程序及串口调试
  6. python获取网站图片_python获取网站图片
  7. linux下网络配置 命令
  8. 开源纯C#工控网关+组态软件
  9. 互联网原创表情论坛举行 探索设计师盈利新生态
  10. 吉林警察学院计算机考研,吉林警察学院怎么样
  11. AD7705模数芯片原理详解
  12. oracle modeler 使用,Navicat Data Modeler使用教程八:图表版面下
  13. 扣哒世界的游戏开发2-2军事训练2
  14. 【docker】docker容器端口如何暴漏出来?
  15. 《炬丰科技-半导体工艺》 硅光电子器件上的单片砷化铟量子点
  16. java计算机毕业设计人口普查信息管理系统源代码+数据库+系统+lw文档
  17. MySQL中针对SQL语句优化
  18. Android 添加Flutter 项目依赖
  19. 右侧追击(一)——东方财富
  20. Eight HDU - 1043

热门文章

  1. Python笔记-Flask的搭建及基本使用
  2. C++|Linux工作笔记-C++获取Linux中shell命令结果
  3. Qt3D文档阅读笔记-Qt3D老版本知识点及使用新版本的运行
  4. WEB安全基础-WEB服务器相关知识
  5. linux看dns解析的时间,curl测试dns解析时间
  6. php tp写构造函数,详细介绍ThinkPHP中类的构造函数_construct()与_initialize()的区别
  7. soapui工具_自动化测试需知的4项测试工具
  8. php程序内存空间,php如何管理内存
  9. android 4.4 linux 内核版本,稳定内核版本和更新  |  Android 开源项目  |  Android Open Source Project...
  10. 计算机网络之应用层:1、概述