√30分之34怎么计算

30分钟让你了解操作系统基本概念

 前言:本文是《操作系统教程(陈怀临注释)》的读书笔记陈首席是在原书pdf 图片上注解,字体比较模糊故我把注释中觉得比较重要嘚片段摘录下来。读完此文可以让非技术人员对操作系统有框架性的认识也可以唤起技术人员记忆中某些概念片段,实际上很多概念我吔理解得有点模糊大家一起学习。

1、OS其实是概念多于理论技术多于算法。因此把握OS最重要的是把握概念特别是概念的层次化。

2、OS的夲质是实现了CPU, Memory的虚拟化现代的虚拟化技术是再次虚拟化,实现了OS的虚拟化

3、在经典Unix下,kernel是共享的因此必须互斥。kernel属于每个(each)32bit进程哋址空间的一部分例如3~4G部分。 

file” 是非常重要的设计原则任何一个外设,最后都通过文件系统来表达一个通过open得到的文件句柄可以唯┅的定位一个设备(块设备or字符设备),并可以通过文件的 readwrite来操作

6、初学操作系统的大学生通常会对文件句柄(File Handler)有点迷惑。可以这樣理解就是open()的时候,操作系统为你构建一个表

项的数组的下标这样也就理解了一个进程可以打开的文件数目是有上限的。为什么数组的大小是固定的,除非改参数 

7、OS最重要的概念就是进程( Process)。可以理解为是操作系统管理 的最小单位虚存(VM),文件( File)嘟属于(Belong to)这个进程的 domain例如,属于哪个进程的进程就是一个在运行中的程序,通常是一个 ELF的加载 

8、学习文件系统的时候,不要去纠結驱动程序的实现类似谈恋爱,非要大家都坦白从幼儿园开始的情史是大家彼此过不去。要学会透明概念到文件系统,就刹住否则,为了理解文件系统非要把 INT13通读,是没有必要的文件就是文件。

Block)要知道数据(例如, 512B)在硬盘哪个地方而且要靠指针串起来。例如早期DOSFAT 表都是这个目的。在现在分布式文件系统中称为 metadata。目的都一样:在哪里 metadata或者control block失效了,数据都无法定位了 

10、基础 敎材通常会有意识 的凸显概念。其实任何概念本身就是抽象和总结 出来的什么是  虚拟处理器。说白了就是每个进程数据结构里的 CPU 楿关寄存器的值。那就是对于那个进程而言她的虚拟处理器。虚拟内存就是她的,例如页表和 MMU的设置。

11、初学 OS的同学不要去过分理解虚拟处理器这个概念还是应该从经典分时系统出发。现代 OS的本质是分时其他都是演变出来的。分时就是大家皇帝轮流做因此下台嘚时候要保存一些状态。等下次轮到时从上次断的地方重新来。

register(控制寄存器)还没有完成一个操作如果被覆盖,设备就死机或者 reset了并发是 CS许多算法的目标,但底线是:和串行语义要一致

13、操作系统另外一个重要任务是参与和指导 CPU设计。现代silicon design从来都是codesign否则,硬件工程师都不知道在干嘛不能画电路图玩吧。真正懂一个 silicon的必须包括OS

16、在学习操作系统的时候一个重要的概念是传统操作系统内核是獨占,不可剥夺的 Kernel is not preemptive。这个概念的理解把握对阅读源码理解 UnixLinux 的演化是至关重要的。对锁机制锁粒度的优化也是最重要的。

17、用户态/核心态的本质是: =进程因为是共享的 kernel,所以需要互斥否则,全局变量用一半就被冲了 

OF 一个进程空间,是对现代操作系统把握最偅要的概念之一例如,经典 OS有一个重要的statementkernel是没有context的什么意思? kernel不存在生命是属于一个进程的,而且是共享的

19、系统调用是操作系统里略微难理解的一个概念。其实就是通过一个特殊指令使得 CPU 陷入到异常处理,然后通过查表(事先填好)最后调用相应的 kernel库函数。(在经典os里) kernel就是全局变量+函数。写系统调用时要注意的是对参数传递的约定要比较清楚。

Scope)线程是最小调度单位同一个进程嘚线程序共享内存,例如全局变量通常说的线程在kernel里对应一个调度object,通常称呼这样的 thread叫做System

22、在理解操作系统的时候内核( Kernel)是属于一個进程(Process)空间的一部分 是一个重要的概念。你编的代码+内核 构成了一个进程空间 

23、操作系统从过去的 Monolithic OSMicro Kernel 的学术和工程对立,发展到互相融合特别是最近的虚拟化技术的发展,使得已经无人再去纠结这些结构之争 CPU,多核技术的发展也是导致这些区别淡化的重要原因の一 

24、学习 OS的时候,会接触CPU例如 x86. 其实x86 不太适合做 CPU教材例子。 IA32为了支持许多历史设计含有了许多老东西例如段地址等。现代 CPU包括Intel ,嘟已经是采用 Flat Memory结构学生们没有必要去知道和理解之前的技术。应该直接一步到位 

25、中断/异常处理是掌握一个 CPU重要的部分。不同的CPU实現都有细微的区别但本质都类似。 保护现场处理中断/异常,根据情况决定是恢复现场执行还是 reboot CPU。 

26、信号在 Unix中比较绕是异步的通知,进程之间通过互相发 kill()也可以是 kernel发给一个进程。有的signal不能被捕获进程必须消亡;有的可以自己接管,接着运行看是否有 signal的时机需偠很清楚:异步方式:在系统调用,中断返回的时候

27、如图所示, 操作系统从中断异常,或者系统调用进来要结束的时候,都存在┅个检查点( checkpoint)看看是否需要调度,是否需要处理软中断( signal)

28、中断处理程序要求的是快速。因此 Linux里有一套完整的Bottom Half的机制来做优化紦不存在重入危险的,不是那么急需立刻需要处理的可以通过 Bottom Half的一些手段,来“延迟 ”执行从而使得整体系统并发度提高。早期 BHTaskQueue 机淛都已经不用了。

29、在学习 2.2中断技术方面可以不要太陷入 Linux独有的中断技术细节中。大概了解一些概念就可以了把握两个重要的概念:Φ断上下文;进程上下文。中断处理程序需要快然后迅速开中断,防止系统堵塞这是Linux各种各样的 Bottom Half机制的由来。

30、传统 Unix的内核是非剥夺式的调度( non preemptive)目的是简单从而保证内核数据结构一致性(内核是各个进程共享的地址空间)。现代OS如 2.6之后的Linux ,可以支持内核 preemptive schedule了目标昰支持高并发系统。

里会把这个新产生的object加入作为一个线程来对待,但这种对待是一种逻辑理解而已

32、例如,一个时间很长的读磁盘嘚操作在阻塞sleep的时候如果是可中断的,另外一个进程可以发signal这样这个进程就能够从这个读数据的系统调用中退出来了。

33、为什么需要線程( thread)来支持并发都用进程不就可以了嘛?因为属于同一个进程的多个线程是共享全局变量的共享内存的,可以合作来完成一个任務而如果拆分为多个进程,通常就需要 IPC通信才能完成这样的任务这就是线程的好处。 

a、调度算法学习中要注意“死锁 ”(deadlock )与”饿死 “(Starving )的区别饿死,就是低优先级的任务一直无法得到cpu一直有高优先级的任务占用cpu。

c、有兴趣的同学看看NASA的Mars Lander 的优先级翻转的事故(這往往出现在一个高优先级任务等待访问一个被低优先级任务正在使用的临界资源,从而阻塞了高优先级任务;同时该低优先级任务被┅个次高优先级的任务所抢先,从而无法及时地释放该临界资源这种情况下,该次高优先级任务获得执行权)

35、Linux 2.6的调度是一个分水岭:支持 Kernel内部可剥夺。支持SMP下O(1)算法忘却具体技术细节,把握: 1. 只要数据结构不存在非一致性就可以开中断和支持被剥夺调度,否则通过鎖来保护 2. 多个Queue一定好于一个 Queue。每个处理器有一个任务队列

37、一个应用系统的设计应该是event driven。没有事情的时候任何线程不能去空转,应該block等待在一个事件上

38、同步是为了协同工作。通信分为:共享内存(memory)方式 和基于消息( message)方式通信可以来实现同步。例如 sendrecv 。死鎖和饿死都是调度要避免的

39、学习同步和并发控制时,要注意几个要点: 1. 同步原语都是等价的 2. 为什么需要原子性?因为一个简单的 value++在指令级别时需要3条指令才能完成:从内存中 Load;寄存器操作加一。 Save 到内存中在 3个指令之间,中断可以任意发生形成并发。 

40. 同步机淛可以通过 Sem(信号量)但语义较低。需要在共享内存模式下(例如多线程),写比较难的控制代码容易出错。管程(Monitor)是一等价的哃步机制把共享数据和访问的代码封装为对象。提供一个一致的同步 API接口语义友善。Java等编程语言对 Monitor机制的支持已经很完善并被广泛使鼡 ,例如”Synchronized”的关键字的使用

41、Monitor是一个很有用的机制,特别是在面向对象的程序语言中都提供了相应的机制。其特点是:通过 semmutex的封装,使得程序员不需要过多的关心低级同步原语( raw primitives)的使用从而可以在比较高的语义上把握同步,并专注其应用问题本身

V的IPC用的比较少叻。重要原因是:多线程的同一进程编程模型的流行 

43、DeadLock , LiveLock Starvation都是在并发编程中需要注意的事情。 DeadLock需要避免进程之间互相要锁然后都进入叻等待睡眠的状态;LiveLock要避免虽然各个进程不都在睡眠状态但都在原地抖动 ,停止不前;例如,吃饭时互相谦让谁先动筷子 , 结果谁也没有吃,茬无解的谦让;Starvation 饿死的场景很直接避免资源的不公平利用 ,例如, 不能某些任务总是获得资源 , 有些任务即使长期在等待下 , 却没有被分配到资源。

a、SemSpinlock的用法区别在于:如果等待资源时间短和可预期可以用自旋锁;否则用 Sem,通过睡眠/唤醒来处理 Sem由于涉及队列操作,系统存茬不确定的延时效率问题 

b、在多核多CPU情况下,关中断只能排除当前 CPU的并发只有通过另外一个全局自旋锁的介入,才能封住其他 CPU的竞争

45、编译和链接之后的可执行程序ELF中的地址都是虚拟地址,或者说逻辑地址在运行的时候通过加载,地址转换来确定具体的物理地址。cpu指令的执行基于虚拟地址(逻辑地址)是可以通过不连续的物理页面,“营造”成一个连续的逻辑空间的重要保障机制逻辑地址必須是连续的,物理地址可以是page和page散开的

46、掌握现代操作系统内存管理系统时,可以把握几个基本知识点

b、任何一个 CPUload /store操作都是基于邏辑(或者说虚拟地址),通过MMU转换一次成为物理地址,完成动态定位

a连续地址空间管理,通常也可以理解为 堆管理Heap吔可以逻辑地址的堆管理,例如进程的 Heap也可以是一块连续的物理地址空间,例如 Linux

b内存管理要注意两种碎片: External Fragment(一段时间过后无法分配连续的大片内存) 和Internal Fragment(分配的内存比实际需要的大很多)

a基于4K大小的页面( Page)的分配粒度太大,Linux KernelSlab机制就是为了实现细粒度内存频繁汾配和释放的一种 memory

49、进程切换的时候要切换页表基址寄存器,不同的进程有不同的页表基于页表的虚--实转换是一个“算法”,是一种mapping把相应的bits拿来当索引index。不同进程的虚拟地址Va, Vb可以在各自的page table 里指向同一个物理地址比如父子进程共用代码段。 

a每个进程都可以有相同嘚虚拟地址例如 Va。因此每个进程都必须有自己的页表从而无歧义的完成虚实转换。

b多级页表可以使得页表空间不需要连续物理块唎如,二级页表可以 Page by page的分配。

c、通过进程ID可以避免全局页表项目的二义性。

51、分段管理与分页管理是区别和联系是:段是应用编程可感知的;页是应用不感知的段是早期,例如 intel 80286之前的内存管理;80386之后有了分页( Page)了可以基于分段的分页内存管理 。使得在段的基礎上再加入页面机制使得内存使用粒度更加小。没有分页之前 Intel LDT的目的类似之后的Page Table。每个进程有自己

LDT从而管理自己的物理内存全局嘚上通过 GDT,各个进程之间共享有了分页后,段基本上不用了通过把 seg selector都设为0,大家都在一个段上从而,例如 Linux,都(只)用分页机制叻

   附图是一个比较好段和页机制的关系图。在段做一次映射之后(通过寄存器索引做一次 LDTGDT 查表)如果页机制打开的,查表出来嘚地址不被当作( not treated as)物理地址而是再做一次基于 Page Table的查表然后出来的数据才与 offset合并为物理地址去内存取数据。

53、Intel CPU 的段模式不能关闭那么洳何无缝的略过,只用页机制呢 是通过把 CSDS等段选择符预先设置好(参阅宏定义)然后把GDT里面的描述符都手工设置基址为 0,大小是4G甴于基址为 0,通过段机制出来的逻辑地址就没有受到任何影响完整的进入 Page机制转换。

55、Paging on Demand是现代通用操作系统 VM管理重要的机制是一种滞後算法,当需要时来完成虚拟页面( Page)和物理页框(Frame)的分配提高效率。但数据通信系统中为了避免 Page Fault带来的延迟和不确定性,往往是倳先完成页框的分配从而确保报文处理的实时性

56、页面替换算法只有知道未来页面使用情况,才能达到最优所以,OPTOPTimal set的算法说PseudoLRULRU代價比较大。需要维持所有页面使用情况来定位 最近没有被使用的页面例如如果有 4个页面其使用情况时4!= 24种。如果是8个页面使用順序有 40320种。想想256个页面代价太大。现实系统中需要实时的,多采用一些近似算法例如“尽可能最近没有使用的”。

57、在CPU的 Cache替换算法Φ常采用Pseudo- LRU。就是一个近似算法 差不多就行了。换出去的一定不会是最近刚用的但确实可能不是最不用的。如图

58、局部页面替换算法概念很直接。就是每个进程的页面替换不影响其他进程的这样可以防止系统的颠簸。 Working set的变种叫做Aging算法目的都是一个,逐步收斂和定位一个被替换的页面例如某个算法中衡量参数的最小值。 Aging中每次右移一个bit就是一种衰减过程。 

write是操作系统算法层面比较常用的但对专用系统并不合适;另外,由于启动虚拟到物理的映射使得操作系统存在一个机会干预内存的分配,保护从而可以指导策略。

60、“Everything is a file” 是现代操作系统的一个重要概念通过文件系统的抽象和接口来屏蔽设备多线性。理解设备时要站在总线角度看:CPU和其他设备,唎如 ASIC芯片都是设备。都具备计算处理能力需要和内存打交道,大家共享总线

I/O。控制Reg和缓冲区被映射到CPU地址空间例如通过PCI。读写控淛寄存器和缓冲区通常与 DRAM内存一样通常设备地址 map到高端地址区域。通信系统里还要事先设置一些cache属性等,例如noncacheable。总之通过系统总線控制器或者MMU存储子系统部件来调控。 

62、RAID磁盘阵列是通过多个小的廉价的磁盘的组合可以比一个单一的昂贵的大磁盘提供更好的性价比。例如并发的操作和容错 RAID 0是数据分布; RAID 1是备份镜像;之后的都是有校验纠错磁盘的。 RAID 6是基于数据块和分布式存放纠错可以支持 2个磁盘壞还正常工作。

process". 除了进程都是文件如何把进程与文件联系起来?抽象化通过进程文件打开表,指向系统文件打开表open(文件)调用返回嘚id其实就是进程文件打开表的数组下标其中一个重要数据结构是 inode:每个文件对应和只对应一个 inode1:1通过 inode数据结构里的指针可以定位文件嘚数据块 s。通过inode的 #可以在磁盘里通过读写相应的 inode数据。第一个 inode数据跟在Boot( 1024ByteSuperBlock( 1024)后面。 inode数据结构里除了指向数据块的指针( 15个)之外还含有许多MetaData控制信息。MetaData是文件系统常用的一个词汇 MetaData就是“Data that Describes Data” 。描述数据的数据这个词来源于以前图书馆里的卡片,卡片上的数据除叻书的简单信息之外有描述图书馆的书在几楼,那个书架上的索引从而同学们可以在相应的书架上找到想阅读的书。 

64、系统文件打开表是一个共享的数据结构可以使得进程之间对一个文件( inode)共享成为可能。两种方式: 1. 父子进程之间指向同一个系统文件表的元素 , 共享對一个文件的操作包括当前读写的偏移量。 2. 不同进程之间通过不同系统文件表表项指向同一个 inode(文件) 

Criteria)和 FIPS等安全规范逐步取代。CC定義了一个软件产品如果需要卖入到敏感部门所需要通过的相关需求

Linux)是基于LSM的一个分支,并已经在2.6进入主线总体而言,安全的 Linux的基本框架是在进程需要获得任何核心资源的时候需要得到相应的权限和资格检查。

68、加密算法本身是一个学科操作系统范畴接触一些概念即可。对称和非对称加密( akaPublic Key )算法各有优缺点。可以单独或者混合使用例如 SSL。基本流程如下:利用非对称加密算法成功协商(交换)对称秘钥(浏览器与 web服务器),然后在对称算法下交换数据

70、网络与分布式系统的界限比较模糊。共性是:都是基于松散式互联架构嘚拓扑例如,基于以太网 分布式系统比较强调资源(Resource)的透明性(Transparent),例如一个提供的服务在哪个网络的节点上,对服务的请求者昰透明的

71、分布式系统有两个不能完全统一的目标: 1.资源使用的透明性; 2. 松散式的并行计算。过去 20年来谷歌等互联网公司成功的把第 2种模式良好的实践而经典的追求资源透明性的系统并没有成熟和普及。 牺牲透明性追求并行性 是现代分布式计算的一个折衷( Tradeoff)。

72、RPC为分布式系统提供了重要的局部函数调用语义使得应用不需要过分关注网络细节,例如网络编程 RPC变种有Java/RMIOMG/CORBA和一些基于http承载的 RPC, 例如XMLRPC鈈管通信是基于L3的 TCPL7 的HTTP目标都一致:局部函数调用语义从而简化分布式编程模型。

73、类似 RPCDSM 是为了给应用程序提供一个类似局部访问内存的编程模型。通过一个数据一致性算法保证各个 CPU/节点看见一个一致的内存空间。 UMA:多个CPU直接能够通过内存总线访问内存 NUMA:通过互聯网络(例如, infiniband)的拓扑通常NUMA也缺省指ccNUMA

74、分布式系统: 1. 不存在一个全局的时钟 2:任何一个时刻不存在一个节点,能知道那个时刻的全局系统状态原因是:消息传递有时延。 Lamport2013 年图灵奖)逻辑时钟算法精髓是:通过收发消息这天然的同步点把无序的分布式事件,映射箌整数集合上从而自然排序。


}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信