华为工程师又爆一份“架构师宝典”,价值百万薪“史诗级”操作系统,送你备战金三银四要不要?
前言
求于至简,归于永恒
当你在电脑上玩游戏、与朋友聊天或编写一个程序并加载运行的时候,你有没有一种像在观看魔术的感觉?编写好的程序能够编译运行,计算出结果,并显示或打印出来。你有没有觉得它很神秘?
如果想揭开这层神秘的面纱,你就得学习操作系统。
因为操作系统是掌控计算机运行的系统,在学习它的过程中,读者能够了解程序在计算机上运行的全景,或者说我们所认为的全景。之所以这么说,是因为精确了解程序在计算机上运行的全景是极其困难的(有人认为这根本就是不可能的)。当然,这里的程序指的是有一定规模的程序,而不是那种只有几行代码的小程序(tivial program)。从某种程度上说,没有人敢肯定自已清楚计算机在任意时刻所处的状态。例如,在多流水线计算机上,如果发生中断或异常,我们根本就得不到一个精准的状态。唯一能做的就是推倒重来。

操作系统的奥秘
对于许多大学计算机及相关专业的同学来说,操作系统就像天上的星星,隐藏着一个固执的谜,永远学不清楚。不过,操作系统真的学不清楚吗?
不是的。学不清楚是因为没有看到其背后的奥秘。这个奥秘不是所有的人都知道的。即使是研究操作系统的人也不一定意识到它,更别提计算机初学者了。
那么这个奥秘是什么呢?
天上的星星数不清是因为我们试图做的事情是数星星。如果我们换个角度,不去数星星,而是寻找星星的设计师,让他告诉我们星星的数量,不就清楚了吗?
这也正是学习操作系统的奥秘。要理解操作系统,就要找到操作系统的设计师,让他们告诉我们操作系统蕴含的所有秘密。当然,这里的寻找设计师并不是真的找来他们,因为找到所有的设计师是不可能的。这里的设计师指的是一种抽象,一种所有设计师所共有的人生哲学,因为设计师在设计操作系统时会不自觉地将自己的思维或人生追求构造在操作系统里,从而赋予操作系统以心智,而操作系统也就在这种心智的指挥下运行着。
下面我们就来看看操作系统吧
第一份操作系统笔记
由于笔记涉及到的知识点与内容极多,就不一一展示给大家了,若需要完整版笔记的朋友,可以一键三连之后【见下图】来获取!!

目录




笔记涉及到的知识点极多,若一一展现给大家比较困难.......Σ( ° △ °|||)︴,为了不影响大家的阅读体验,以下只截取笔记部分内容,文末有完整版笔记获取方式,有需要的朋友可自取

第一章认识操作系统

计算机硬件简介
操作系统与运行操作系统的内核硬件关系密切。操作系统扩展了计算机指令集并管理计算机的资源。因此,操作系统因此必须足够了解硬件的运行,这里我们先简要介绍一下现代计算机中的计算机硬件。

总线
上面的结构(简单个人计算机的组件图)在小型计算机已经使用了多年,并用在早期的 IBMPC 中。然而,随着处理器核内存变得越来越快,单个总线处理所有请求的能力也达到了,上线,其中也包括 IBMPC 总线。必须放弃使用这种模式。其结果导致了其他总线的出现,它们处理 I/O 设备以及 CPU 到存储器的速度都更快。这种演变的结果导致了下面这种结构的出现。

文件
几乎所有操作系统都支持的另一个关键概念就是文件系统。如前所述,操作系统的一项主要功能是屏蔽磁盘和其他 l/O 设备的细节特性,给程序员提供一个良好、 清晰地独立于设备的抽象文件模型。创建文件、删除文件、读文件和写文件都需要系统调用。在文件可以读取之前,必须先在磁盘上定位和打开文件,在文件读过之后应该关闭该文件,有关的系统调用则用于完成这类操作。
为了提供保存文件的地方,大多数个人计算机操作系统都有目录(directory)的概念, 从而可以把文件分组。比如,学生可以给每个课程都创建一个目 录,用于保存该学科的资源,另一个目录可以存放电子邮件,再有一个目录可以存放万维网主页。这就需要系统调用创建和删除目录、将已有文件放入目录中,从目录中删除文件等。目录项可以是文件或者目录,目录和目录之间也可以嵌套,这样就产生了文件系统

系统调用


操作系统结构
下面我们会探讨操作系统的几种结构,主要包括单体结构、分层系统、微内核、客户-服务端系统、虚拟机和外核等。下面以此来探讨一下
单体系统

分层系统

微内核

客户-服务器模式


第二章进程和线程

目录
文件系统通常提供目录(directories) 或者文件夹(folders)用于记录文件的位置, 在很多系统中目录本身也是文件,下面我们会讨论关于文件,他们的组织形式、属性和可以对文件进行的操作。
一级目录系统


进程模型
在进程模型中,所有计算机上运行的软件,通常也包括操作系统,被组织为若干顺序进程(sequentialprocesses),简称为进程(process) 。 一个进程就是一个正在执行的程序的实例,进程也包括程序计数器、寄存器和变量的当前值。从概念上来说,每个进程都有各自的虚拟 CPU,但是实际情况是 CPU 会在各个进程之间进行来回切换。

进程的实现
操作系统为了执行进程间的切换,会维护着一张表格,这张表就是进程表(process table) 。每个进程占用一个进程表项。该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时所必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样。
下面展示了一个典型系统中的关键字段

线程实现
主要有三种实现方式
在用户空间中实现线程
在内核空间中实现线程
在用户和内核空间中混合实现线程。

屏障

第三章内存

主存(RAM)是一件非常重要的资源,必须要认真对待内存。虽然目前大多数内存的增长速度要比 IBM7094 要快的多,但是,程序大小的增长要比内存的增长还快很多。不管存储器有多大, 程序大小的增长速度比内存容量的增长速度要快的多。下面我们就来探讨一下操作 系统是如何创建内存并管理他们的。
一种存储器抽象:地址空间


空闲内存管理


虚拟内存


第四章文件系统

文件系统的实现
在对文件有了基本认识之后,现在是时候把目光转移到文件系统的实现上了。之前用户关心的一直都是文件是怎样命名的、可以进行哪些操作、目录树是什么,如何找到正确的文件路径等问题。而设计人员关心的是文件和目录是怎样存储的、磁盘空间是如何管理的、如何使文件系统得以流畅运行的问题,下面我们就来一起讨论一下这些问题。
文件的实现

使用内存表进行链表分配
由于连续分配和链表分配都有其不可忽视的缺点。所以提出了使用内存中的表来解决分配问题。取出每个磁盘块的指针字,把它们放在内存的一个表中,就可以解决上述链表的两个不足之处。下面是一个例子

目录的实现
文件只有打开后才能够被读取。在文件打开后,操作系统会使用用户提供的路径名来定位磁盘中的目录。目录项提供了查找文件磁盘块所需要的信息。根据系统的不同,提供的信息也不同,可能提供的信息是整个文件的磁盘地址,或者是第一个块的数量 (两个链表方案)或 inode 的数量。不过不管用那种情况,目录系统的主要功能就是将文件的 ASCII 码的名称映射到定位数据所需的信息上

文件系统的管理和优化
能够使文件系统工作是一回事,能够使文件系统高效、稳定的工作是另一回事,下面我们就来探讨一下文件系统的管理和优化。
磁盘空间管理

文件系统性能

第五章 I/O

我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的/0 设备。操作系统必须向设备发送命令,捕捉中断 并处理错误。它还应该在设备和操作系统的其余部分之间提供一个简单易用的接口。操作系统如何管理 I/O 是我们接下来的重点。
I/O 设备

I/O 软件目标

使用程序控制 I/O

磁盘
为了组织和检索数据,会将磁盘组织成特定的结构,这些特定的结构就是磁道、扇区和柱面

磁盘格式化
磁盘由一堆铝的、合金或玻璃的盘片组成,磁盘刚被创建出来后,没有任何信息。磁盘在使用前必须经过低级格式化(low-levvel format) ,下面是一个扇区的格式

第六章死锁

计算机系统中有很多独占性的资源,在同一时刻只能每个资源只能由一个进程使用,我们之前经常提到过打印机,这就是一个独占性的资源,同一时刻能有两个打印机同时输出结果,否则会引起文件系统的瘫痪。所以,操作系统具有授权一个进程单独访问资源的能力。
两个进程独占性的访问某个资源,从而等待另外-一个资源的执行结果,会导致两个进程都被阻塞,并且两个进程都不会释放各自的资源,这种情况就是死锁(deadlock) 。
死锁可以发生在任何层面,在不同的机器之间可能会发生死锁,在数据库系统中也会导致死锁,比如进程 A 对记录 R1 加锁,进程 B 对记录 R2 加锁,然后进程 A 和 B 都试图把对象的记录加锁,这种情况下就会产生死锁。
下面我们就来讨论一下什么是死锁、死锁的条件是什么、死锁如何预防、活锁是什么等。
首先你需要先了解一个概念,那就是资源是什么
资源

死锁



鸵鸟算法

死锁避免

破坏死锁

通信死锁

大厂常见面试题
解释一下什么 是操作系统?

操作系统结构

什么是线程,线程和进程的区别

进程间的通信方式

进程间状态模型

调度算法都有哪些

第二份操作系统笔记
由于笔记涉及到的知识点与内容极多,就不一一展示给大家了,若需要完整版笔记的朋友,可以一键三连之后【见下图】来获取!!

为清楚地阐述操作系统的哲学原理,也为了使内容显得紧凑,逻辑上一气呵成,本书只选择了操作系统的核心内容进行分析,放弃了对操作系统核心以外内容,如安全、多媒体系统、虚拟机技术、光盘技术等的论述。本书集中精力对操作系统发展的历史背景、进程与线程、内存管理、文件系统、输入与输出、多核环境下的进程调度和操作系统设计进行了哲学原理层面上的分析与论述,而将安全、多媒体、虚拟机等技术留给别的专业书籍进行论述。对内容的这种安排有如下好处:
可使本书重点突出、逻辑清晰、内容连贯,便于学生顺利掌握操作系统的核心与关键。
操作系统的核心内容经过长久的研究与实践,已经变得较为稳定并且形成了众所公认的标准,讲解起来没有歧义。
操作系统的非核心部分由于研究的时间短,工业界参与的程度较低,并无公认的标准,论述起来要么不全面,要么显得凌乱,使刚刚接触操作系统的读者感到迷惑。
只要掌握了核心内容的原理,读者便能通过自学掌握操作系统核心以外的知识。
本书分为 8 篇,分别是基础原理篇、进程原理篇、线程原理篇、内存原理篇、文件原理篇、I/O 原理篇、多核原理篇和操作系统设计篇

基础原理篇
第 1 章操作系统导论
第 2 章操作系统历史
第 3 章操作系统基本概念
大伪似真,大道无形
对于任何一门课来说,首要探讨的问题就是这门课的主题到底是什么。对于刚接触操作系统的入门者来说,自然想到的问题当然也会是操作系统到底是什么东西。回答这个问题是本篇的职责。此外,操作系统作为计算机的核心控制系统,它在计算机运行过程中扮演什么角色?它的来历是什么?它有一些什么基本概念?我们应该如何看待操作系统?它是如何参与到程序的执行过程中的?这些也是学习操作系统需要回答的基本问题。
程序是如何运行的

计算机硬件基本知识

操作系统结构

进程原理篇
第 4 章进程
第 5 章进程调度
第 6 章进程通信
恍兮惚兮,其中有像;惚兮恍兮,其中有物
有了基础原理篇的铺垫,我们就可以进入操作系统核心功能部件了。
顾名思义,计算机是用来进行计算的,或者说计算机的基本功能是计算功能。而进行计算的关键部件是计算机的芯片,即 CPU。CPU 能够按照一-定的顺序进行正确计算是在-个指挥者的控制之下完成的。这个指挥者就是操作系统。操作系统对 CPU 进行管理的重要手段就是进程模型,或者说进程是操作系统这个魔术师施法的道具。
进程电报:信号

进程拥抱:共享内存

线程原理篇
第 7 章线程
第 8 章线程同步
第 9 章死锁应对之哲学原理
第 10 章锁的实现
善闭者无关楗不可启,善结者无绳约不可解
进程虽然让并发从理想变为现实,但其自身却是串行:进程只有一一个执行序列。只有一个执行序列的进程模型并不能从根本上满足人类的所有并发的奢望。并发其实并非人类的唯一诉求,甚至也不一定是最重要的诉求。有了并发,我们希望的是并发能够帮助我们实现在非并发时难以实现或实现成本高昂的功能:并发的个体通过合作来完成复杂的任务。
进程的分身术一线程

以测试与设置指令来实现锁

内存原理篇
本篇包括第 11~ 14 章的内容。第 11 章讲述内存管理的环境、虚拟内存、操作系统在内存中的位置、程序在内存里的位置(固定加载地址、固定分区、可变分区)、基本内存管理机制(地址翻译、基址极限、交换)、闲置空间管理等内容。第 12 章讲解的内容包括基址极限的问题、分页管理、页表、页面翻译过程、分页管理系统的优缺点、多级页表、地址翻译速度、锁住页面、内存抖动和页面尺寸设计。第 13 章对页面更换算法的来龙去脉、欲达到的目的、各种具体的页面更换算法进行细致讲解。第 14 章的内容包括页式管理系统的局限、分段管理系统、分段的优缺点、段号与寻址位数,并对否定之否定在内存管理模式发展过程中的作用进行讨论。
第 11 章基本内存管理
第 12 章页式内存管理
第 13 章页面更换算法
第 14 章段式内存管理
页面更换的目标

分段管理系统

文件原理篇
第 15 章磁盘操作
第 16 章文件系统
第 17 章文件系统实现
第 18 章文件系统性能
大成若缺,其用不敝:大盈若冲,其用不穷
在第四篇中介绍过,计算机运行时所需要的数据和代码从主存储器或者内存而来。如果计算机不在运行状态时,这些数据和代码保持在何处呢?我们当然可以试一下内存, 但问题是内存不是持久性的存储介质,它是进程运行过程中临时分配的存储空间。一且进程结束运行,其所占内存空间就会被释放,存放在里面的数据和代码也将消失。而且,内存需要电能支持才能保持数据(指一.般的内存),-旦断电, 所有数据都将丢失。因此,数据和代码要想长久保持,就需要一个更为持久的地方来存放,这个持久地方就是磁盘。而对磁盘进行管理就是操作系统的另一一个重要使命。如果管理得当,磁盘、内存和 CPU 将协作完成计算机的使命。
磁盘的结构

文件系统的布局

能力表

文件系统持久性

I/O 原理篇
第 19 章输入输出
善者,不善人之师:不善者,善人之资

设备控制器

物理 I/O 模式

多核原理篇
第 20 章多核结构与内存
第 21 章多核环境下的进程同步与调度
美言不信,信言不美

多核基本概念

旋锁

操作系统设计篇
第 22 章操作系统设计之哲学原理
多闻数穷,不若守中

操作系统设计的追求

操作系统设计的第 9 条哲学原理:简单为美一求于至简, 归于永恒

由于笔记涉及到的知识点与内容极多,就不一一展示给大家了,这份【操作系统笔记】【操作系统之哲学原理第 2 版】分别为 306 页与 427 页,若需要完整版笔记的朋友,可以一键三连之后【见下图】来获取!!

总结
由此可见,设计一个完美的操作系统是多么困难,甚至是无法达到的。这就意味着我们在操作系统上的探索是永无止境的,虽然不时会有达到完美的感觉,但仔细思量却发现不过是自我幻觉而已。就像真理一样,似乎能感觉到,但似乎又没有把握。而本书所要达到的目标就是为读者探索操作系统提供些许指导,一个指引读者探索方向的路标。
还记得本书前言里面的那首小诗吗?它的结尾是这样的:
不要失望,
失望会使我们衰老
趁我们还年轻,
抬起头来,让我们数星星:
也许,我们能数得清;
也许,我们能看到真相;
也许,我们能找到希望....
评论