本书从生活哲学的视角对操做系统进行了独到的阐述。从人类天然的行为规范推演到操做系统的设计与实现,以一条逻辑轴线将整个操做系统的各类原理精彩呈现到读者眼前。html
这本书的语言风格比较独特,做者以风趣形象的语言讲解计算机系统的原理。linux
前言ios
操做系统的主要内容为CPU管理(进程、线程)、内存管理(虚拟内存)、文件系统和输入输出系统。程序员
操做系统经过虚拟机界面为用户程序提供各类服务,各类应用程序在运行过程当中不断使用操做系统提供的服务来完成本身的任务。算法
操做系统和各类应用程序之间能够看作相互调用,从而造成一个很是复杂的动态系统。shell
第一篇 基础原理篇
第1章 操做系统导论
引子:智者的挑战编程
1.1 人造学科小程序
人造科学(特色:不许确,具备相对性<没有对错>;从对人类活动的观察导出;依赖人的主观能动性;一般符合人的直觉)windows
神造学科(特色:准确,绝对;从对天然存在的观察导出;不依赖人的主观能动性;一般违反人的直觉)数组
1.2 程序是如何运行的
1.3 什么是操做系统
一、操做系统是介于计算机与应用软件之间的一个软件系统。它掌控计算机上全部事情,使计算机变得好用(令人类从繁琐的、复杂的对机器掌控的任务中解脱),使计算机运行变得有序(掌控计算机上全部事情)。
二、主要功能
1)替用户及其应用管理计算机的全部软硬件资源
2)保证计算机资源的公平竞争和使用
3)防止对计算机的非法侵占与使用
4)保证操做系统自身正常运转
1.4 魔幻与管理
一、魔术师(将计算机以一个更加容易、更加方便、更见强大的方式呈现给用户使用。直白地说:就是把差的东西变好,把少的东西变多,把复杂的东西边容易。)
二、管理者(cpu管理、内存管理、外存管理、I/O管理——将XX分配给不一样的应用与用户)、(健壮性管理、安全性管理)(关键原则是效率和公平)
1.5 用户程序与操做系统
1.6 操做系统的范畴
1.7 为何学习操做系统
思考题
第2章 操做系统历史
引子:操做系统进化的推进因素
2.1 第一阶段:状态机操做系统(1940年之前)
2.2 第二阶段:单一操做员、单一控制端操做系统(20世纪40年代)
一组标准库函数
2.3 第三阶段:批处理操做系统(20世纪50年代)
批处理监控器+操做系统库函数。分为两部分(一部分控制程序执行,另外一部分支持程序执行)
2.4 第四代:多道批处理操做系统(20世纪60年代)
同一时间运行多个程序(宏观上),操做系统要在多个程序间切换而且能管理多个输入输出设备,保证一个进程不受另外一个进程的干扰。
既要管理进程,又要管理内存、还要管理cpu调度
2.5 第五代之一:分时操做系统(20世纪70年代)
多用户,用户直接和电脑交互
2.6 第五代之二:实时操做系统
软实时系统和硬实时系统
2.7 第六代:现代操做系统(1980年之后)
2.8 操做系统的演变过程
2.9 操做系统的将来发展趋势
思考题
第3章 操做系统基本概念
引子:“差很少”精神
3.1 计算机硬件基本知识
一、总线结构->流水线结构->多流水线、超标量计算和超长指令字等多指针发射机制
二、五级存储架构(指令的存放单元):寄存器(访问速度最快,容量最小,成本最高)、缓存、主存、磁盘、磁带(访问速度最慢、容量最大,成本最低)
三、中断、软中断
中断的基本原理:设备在完成在的任务后向CPU发出中断,CPU判断优先级,而后肯定是否响应。若是响应,则执行中断服务程序。、,并在中断服务程序完成后执行原来的程序。
软中断:软件发出的中断
3.2 抽象
一、抽象来源于现实(计算机硬件——cpu、内存、I/O设备)而又高于现实(更强大、更好用)
二、抽象不光是操做系统提供给用户的一个存在,它也存在与操做系统内部(操做系统内部分为不一样的功能块,而不一样的功能块之间相互提供的也是抽象)
3.3 内核态和用户态
一、内核态(特权态、拥有/访问资源多的状态):运行在内核态的程序能够访问的资源多,可是可靠性、安全性要求高,维护管理复杂。
例如:CPU管理,内存管理(保障计算机安全),诊断和测试程序(须要访问计算机的全部资源),输入和输出管理(要访问各类设备和底层数据结构),文件管理(一部分,文件系统自己的管理)
二、用户态(非特权态、访问资源将受到限制的状态):运行在内核态的程序能够访问的资源受限,但可靠性、安全性要求低,维护管理较简单
例如:文件管理(一部分,用户数据的管理),编译器、网络管理的部分功能、编辑器用户程序
三、用户态和内核态是处理器的一种状态,不是程序的状态。能够经过设置状态字将CPU设置为内核态、用户态或其它子态。一个程序运行时,CPU是什么态,这个程序就运行在什么态。一个程序究竟运行在内核态仍是用户态取决于其对资源和效率的需求。
四、内核态和用户态的实现
要限制一个程序对资源的访问,须要对程序的每个指令进行检查(地址翻译)才能完成。程序发出的每个指令都要通过这个地址翻译过程,经过对翻译的控制,就能够限制程序对资源的访问。内核态时,内核程序能够绕过内存地址翻译而直接执行特权指令,这种绕过翻译的作法能够突破系统对资源的控制。
3.4 操做系统结构
巨大单一体的操做系统(内核态)->层次化的操做系统(内核态)->微内核的操做系统(内核态+用户态)
3.5 进程、内存和文件
进程是一个运行中的程序。
内存是进程的存放场所。
文件是操做系统提供的外部存储设备的抽象,是程序和数据的最终存放地址。
3.6 系统调用
一、操做系统一个系统程序,为别的程序提供服务的程序。系统调用是操做系统提供的应用程序服务界面(API)。用户程序是经过调用这些API来获取操做系统的服务。
二、系统调用按功能能够划分为六类(进程控制类、文件管理类、设备管理类、内存管理类、信息维护类、通讯类)
三、系统调用分为三个阶段(参数准备阶段、参数调用识别阶段、系统调用识别阶段)
3.7 壳(shell)
做用:负责将用户的命令解释为核心所能理解的系统调用和中断子例程;同时将核心的工做结果解释为用户所能理解的可视化的字符界面或者图形界面。
思考题
第二篇 进程原理篇
CPU是在操做系统控制(经过进程核线程)下按照必定的顺序进行正确计算的。由于并发,咱们发明了进程和线程。进程出现的动机是人类渴望的并发。进程的出现也让操做系统的复杂性大大增长:因为须要对进程进行分离存储而致使出现了内存管理;因为须要让不一样进程有条不紊地推动而致使进程调度的出现。
三层并发
流水线:计算机体系结构层面上的并发(指令级并发)
进程:处理器结构层面上的并发
线程:进程结构层面上的并发
第4章 进程
引子
4.1 进程概论
一、计算机三大核心功能(进程管理、内存管理、文件管理)
二、进程:一个程序加载到内存后(正在执行)就变成了进程。进程=程序+执行。
4.2 进程模型
物理视角:进程切换。每一个进程都占用一块内存空间,在任什么时候间,CPU只执行一条指令,一个进程,至于执行哪条指令由物理程序计数器指定。也就是说,全部进程共用一个程序计数器。
逻辑视角:多道并发。进程能够执行,也能够挂起后先让别的程序先执行,以后再接着执行。只需记住挂起时本身所处的位置。每一个进程都有一个程序计数器。
时序视角:持续推动。在运行一段时间后,进程都应该完成了必定的工做量,即进程每次返回,它都处于上次返回点以后。
备注:进程不必定必须结终,能够一直运行到强制终止或关机。
4.3 多道编程的效率
人们发明进程的目的是为了支持多道编程,而进行多道编程的目的则是为了提升计算机的CPU效率,或者说系统的吞吐量。
多道编程的效率与每道程序的性质、多道编程的度数、进程切换消耗等都有关系,只要度数合适,利大于弊。
多道编程对系统效率提升与度数关系的规律:随着度数的增长,CPU利用率逐渐增长,直到一个临界点,超过此临界点以后呈现出逐步降低的趋势,这时由于进程切换所带来的系统消耗将变得很是明显。
多道编程的优势:提升CPU利用率,改善系统的响应时间
4.4 进程的产生与消失
进程的产生(3种):系统初始化(神创造人);执行进程创立程序(人生子);用户请求创立新进程(试管婴儿)。
进程的消失(4种):寿终(运行完成而退出),自杀(进程因错误而自行退出),他杀(进程被其余进程强行杀死),处决(进程
因异常而强行终结)
4.5 进程的层次结构
unix:进程树->进程组,父进程,子进程
windows:进程树,父进程,子进程(全部进程均地位平等)
4.6 进程的状态(记忆下图)
进程挂起的缘由:进程在执行过程当中执行了某种阻塞操做,这种操做须要时间等待结果才能继续执行,系统将该进程挂起,让其余进程执行;一个进程执行时间太长,系统为了公平,将其挂起,让其余进程执行。前者是进程自身的缘由,后者是系统的缘由。
从理论上,等待到执行是能够发生的,只是这种状态转化没有任何实际价值而被操做系统禁止。
4.7 进程创立
1)申请空白进程控制块(PCB);
2)初始化机器寄存器;
3)初始化页表;
4)将程序代码从磁盘读入内存;
5)将处理器状态设置为“用户态”;
6)跳转到程序的起始地址(设置程序计数器);
unix fork->exec
windows 调用createprocess
4.8 进程与地址空间
进程空间也称为地址空间,地址空间就是进程要用的全部资源。全部资源构成了状态的划分。不可能有两个进程状态彻底同样。因此
每一个进程对应计算机的一种状态,而计算机状态就是全部存储单元的内容。
4.9 进程管理
操做系统管理进程。
一、进程管理所须要的手段
操做系统要管理进程就要维护关于进程的一些信息。操做系统用于维护进程记录的结构就是进程表或进程控制块(pcb,process
control block,里面存放该进程的信息)。不一样操做系统维护的进程信息是不尽相同的。但应包括寄存器、程序计数器、状态字、栈、指针、优先级、进程ID,信号、建立时间、耗用CPU时间、当前持有的各类句柄等。采纳的数据结构有线性表、链表、和结构,也可能有树和图。
二、进程管理要处理的问题
资源分配的效率与公平
4.10 进程的缺陷
(1)进程一个时间只能作一件事;
(2)进程在执行过程当中遇到阻塞,只能挂起。这样,即便进程里面有部分工做不依赖于输入阻塞操做,也没法推动。
因此,人们就发明了线程,来解决上述问题。
思考题
第5章 进程调度
引子
对于掌握着众多进程的操做系统来讲,须要经过调度进程来达到维持计算机功能的目的。事实上,调度是操做系统实现进程模型的根本手段。
5.1 调度的目标
单一CPU模式下,实际上任什么时候刻只能有一个进程或线程处于执行状态。
Q:咱们如何肯定在任意时刻哪一个程序执行,哪一个不执行呢?即咱们如何进程程序的调度呢?
使用CPU的3种模式:
CPU导向或者计算密集型程序:一种程序大部分时间在CPU上执行(大部分时间在计算,而后花少许时间输入输出),
I/O导向或者输入输出密集型程序:一种程序大部分时间在进行输入输出(大部分时间在输入输出,而后花少许时间计算,I/O导向程序或输入输出密集型程序),
平衡性程序:介于前面两种模式之间(平衡型程序)。
总结:对于 I/O导向的程序,响应时间很是重要;对于CPU导向的程序来讲,周转时间很是重要;对于平衡性程序来讲,进行某种响应和周转之间的平衡就显得很是重要。
5.2 处理器调度的整体目标
CPU调度目标:要达到极小化响应时间、极大化系统吞吐率、保持系统各个功能部件均处于繁忙状态和某种貌似公平的机制。
5.3 先来先服务调度算法(FCFS
,First Come First Serve)
谁先来,就先服务谁
先来先到的一个隐含条件是不能抢占,一个程序一旦启动就一直运行到结束或者受阻塞为止。。
5.4 时间片轮转算法
目的:改善短程序的响应时间。
方法:周期性的进行进程切换。
1)系统响应时间主要依赖时间片的选择,若选择的较长,就和FCFS类似,若选择的较短,系统的大部分时间都花费在进程的上下文切换上,而不是执行程序上。
2)若运行的进程较多,时间片就要选择的短一点,不然用户体验较差;若运行的进程较少,时间片就能够适当长一些。
备注:时间片轮转的系统响应时间不必定比FCFS的响应时间要短。
5.5 短任务优先算法
STCF(shorted time to completion first)优先级高的任务先运行,短任务优先级高于长任务,短任务优先比前几个的响应时间要短。分为非抢占和抢占两种。
缺点:1)长程序可能得不到响应时间而饥饿,咱们没法知道那个进程要运行多长时间。
5.6 优先级调度
赋予重要的进程以高优先级以确保重要任务获得cpu时间。
5.7 混合调度算法
将全部进程分为不一样的大类,每一个大类一个优先级,高优先级的大类中的进程先执行,同大类的进程使用时间片轮转来执行。
5.8 其余调度算法
5.9 实时调度算法
5.1 0高级议题:调度异常之优先级
优先级倒挂:
一个低优先级任务持有一个高优先级认为所须要的共享资源。这样的高优先级任务因缺少资源而处于受阻状态,一直到低优先级任务释放资源为止。这样实际上形成了这两个任务优先级的倒挂。若是此时有其余优先级介于两者之间的任务,而且不须要这个共享资源,则这个中优先级任务得到CPU控制,从而超越这两个任务,致使高优先级进程被临界区外的低优先级进程阻塞。
优先级倒挂的危害:
1)可能会致使系统故障
2)可能会形成系统性能降低
思考题
第6章 进程通讯
引子:孤独爆破手的自白
不管是对于人仍是对于进程而言,通讯的需求都很是强烈。
6.1 为何要通讯
进程之间的交互称为:进程间通讯(IPC,inter-process communcation)、线程通讯
例如:父进程在建立子进程后,一般须要监督子进程的状态,以便在子进程没有完成给定的任务时,能够再建立一个子进程来继续。
6.2 线程对白:管道、记名
管道、套接字
管道所占的空间既能够是内存,也能够是磁盘。
建立:经过系统调用建立管道。系统调用所作的事情就是在某种存储介质上划出一片空间,给其中一个进程写的权利,另外一个进程读的权利。
6.2.一、管道:管道是一个线性字节数组,相似文件,使用文件读写的方式进行访问。由于经过文件系统看不到管道,因此它不是文件。
管道能够设到内存里,
建立管道在shell和程序里是不同的:shell里,只用“|” $ sort < file1 |grep zou 在两个utility
“ sort ”和“ grep ”之间建立了一个管
道,数据从sort
流向grep。sort 的结果做为grep的输入。程序里面,建立管道须要使用系统调用popen()或者pipe().
管道的一个重要特色是:使用管道的两个线程之间必须具备亲缘关系(如父子进程、爷孙进程等)。
6.2.二、记名管道:若是在两个不相关的线程,之间进行管道通讯,就要使用记名管道。记名管道是一个有名字的管道。记名管道与文件系统共享一个名字空间,即咱们从文件系统中看到记名管道,记名管道不能和文件系统中的任何文件重名。
记名管道的名称有两部分组成:计算机名和管道名。如\\[主机名]\管道\[管道名]\。对于同一个主机来讲,容许有多个同一命名管道的实
例而且能够由不一样的进程打开,但不一样的管道有属于本身的管道缓冲区和通讯环境。
缺点:管道和记名管道只能在unix和linux中使用,管道的管道通讯只能在相关进程间进行,记名管道须要知道名字来打开。
6.2.三、套接字(虫洞)
使用套接字进行通讯须要双方均建立一个套接字,一个做为服务器方,另外一个做为客户方。
套接字支持不一样层面、不一样应用、跨网络间的通讯。
套接字的分类:
stream socket:提供双向、有序、可靠、非重复的数据通讯。
datagram socket:提供双向消息流。数据不必定按序到达。
sequential socket:提供双向、有序、可靠链接,包有最大限制
raw socket:提供对下层通讯协议的访问。
6.3 线程电报:信号(signal)
管道与套接字——这两种方式通讯的缺点:
一、必须事先在通讯的进程间创建链接(建立管道和套接字),这就耗费系统资源;
二、一方选择使用管道与套接字发送信息,另外一方能够选择接收的时机,甚至能够“充耳不闻”。
三、创建链接须要时间,若是信息量小的话,效率会十分低下。
使用信号的需求:
一、迫使另外一方对咱们的通西北当即作出回应。
二、咱们不想事先创建任何链接,而是临时的通讯需求。
三、传输的信息量微小,使用管道或者套接字不划算。
在计算机里,信号就是一个内核对象/内核数据结构,发送方将数据结构的内容填好,并指明该信号的目标进程后,发出特定的软件中断。操做系统接收到特定的终端请求后,知道是有进程要发送信号,因而到特定的内核数据结构里查找信号接收方,并发出通知。
6.4 线程旗语:信号量(semaphore)
在计算机里,信号量其实是一个简单整数,一个进程在信号变为0或1的状况下推动,而且将信号变为1或0来防止别的进程推动。
当进程完成任务后,则将信号再变为0或1,从而容许其它进程执行。
注意:信号量不仅是一个通讯机制,更是一个同步机制。
6.5 线程拥抱:共享内存
产生需求:两个进程须要共享大量数据。
共享内存就是这两个线程共享一片内存,能够访问这片内存中的任何内容。要使用共享内存通讯,首先一个线程建立一片内存区域专门作通讯用,而其余线程则将这片区域映射到自己的地址空间。这样,线程本身的地址空间中对应共享内存的区域时,就是在和其余线程通讯。
共享内存与管道的区别:
1)使用共享内存的两个内存必须在同一台物理电脑上
2)共享内存的访问方式是随机的,而不是只能从一端写,从另外一端读
所以,其灵活性比管道和套接字大得多,可以传递的信息复杂得多。
缺点:
1)管理复杂,使用共享内存的两个线程必须在同一台物理电脑上才能使用的通讯方式;
2)安全性脆弱,因为两个线程存在一片共享的内存,一个中病毒,就很容易传到另外一个线程。
另:使用全局变量在同一个线程的线程间实现通讯不称为共享内存。
6.6 信件发送:消息队列
消息队列是一列具备头和尾的消息排列。新来的消息在队尾,读取消息则是从队列头部开始。消息队列与管道的区别:(记忆)
1)管道对读写有要求:读的只能读,写的只能写,不可既读又写;而消息队列无需固定的读写进程,任何有权限的进程均可以读写,
2)管道只支持一对一的两个进程,而消息队列能够支持多个进程,多个进程能够读写消息队列,多对多。
3)管道在内存和磁盘上均可以实现,而消息队列只是在内存中实现。
4)管道只在UNIX和lunux操做系统中实现,而消息队列在几乎全部的主流操做系统中均有实现。
6.7 其余通讯机制
思考题
第7章 线程
引子
每一个人在人生的某个时候,都但愿本身可以分身,从而完成某件不可能完成的任务。而进程也是同样,它但愿在某些时候可以分身,从而完成更加复杂的实名,预示便有了线程。
7.1 进程的分身术——线程
进程是运转的程序,是为了在CPU上实现多道编程而发明的一个概念,可是进程在一个时间只能干一个事情,为了让进程同时干多件事情咱们就发明了线程。线程是进程的分身,是进程的不一样执行序列。线程是咱们为了让一个进程可以同时干多件事情而发明的”分身术“。每一个线程本质是同样的,即拥有一样的程序文本,可是执行时的上下文不一致。
在线程模式下,一个进程至少有一个线程,但也能够有多个线程。
将进程费解为线程还能够有效利用多处理器和多核计算机。(在没有线程的状况下,增长一个处理器并不能提升进程的执行速度,但若是分解为多个线程,则可让不一样的线程同时运转在不一样的处理器上,从而提升进程的执行速度。)
设计线程的目的就是共享资源,提升资源利用率。
7.2 线程管理
一、进程管理就是要维持线程的各类信息,存放这些信息的数据结构称为线程控制表或线程控制块。
能够共享的资源放在进程控制块中,不能够共享的资源放在线程控制块中。
二、原则:
1)共享的资源越多越好——这是咱们发明线程的主要动机之一。
2)若是某个资源不独享会致使线程运行错误,则该资源就是有线程独享;而其余资源则有进程里的全部线程共享。
三、线程共享资源:地址空间、全局变量、打开的文件、子进程、闹钟、信号及信息服务程序,定时器、占用cpu的时间。
线程独享资源:程序计数器、寄存器、栈、状态字。
7.3 线程的实现方式
线程的实现方式有两种:
a) 进程本身来管理线程,用户态编程实现;
b) 操做系统来管理线程,内核态编程实现。
进程的实现方式:因为进程是在cpu上实现并发(多道编程),而cpu是由操做系统管理的,因此进程的实现只能是由操做系统内核来进行,
而不是由用户态实现的状况。
一、内核态线程的实现
线程是进程的分身,是进程的不一样执行序列,线程应该是cpu调度的基本单位,又由于cpu调度是由操做系统实现的,因此操做系统管理进程是天经地义的。
与操做系统管理进程同样。操做系统管理线程,就要保护维护线程的各类资料,即进程控制块存放在操做系统内存空间中。这样,操做系统内核就能够保有进程控制块和线程控制块。而根据进程控制块和线程控制块提供的信息,操做系统就能够对线程进行各类相似进程的管理:线程调度,线程的资源分配,各类安全措施的实现。
优势:
1)用户编程保持简单,由于线程的复杂度由操做系统承担,用户编程时无需管理线程的调度(线程执行和挂起)
2)因为操做系统可以监测全部的线程,当一个线程执行阻塞操做时,操做系统就能够调用另外一个线程。
缺点:
1)效率低,从用户态到内核态的切换耗费时间;
2)内核态占用内核稀缺的内存资源,由于操做系统要维护线性表,操做系统所占内存空间是固定的,因为线程数量较多(与进程相比),内存空间很容易就占满,这样最后会致使系统“死掉”。
二、用户态线程实现
用户本身写一个执行系统作调度器,即除了正常执行任务的线程外,还有一个专门负责线程调度的线程。一个线程在执行一段时间后就主动把资源释放给别人使用。
优势:灵活;线程切换快;切换线程无需到内核态。
缺点:因为没法肯定何时出让cpu使用权最合适,编程有点困难;用户态编程没法达到线程多道编程的目的,一个线程受阻,整个进程都没法继续。(解决办法:不让进程阻塞;阻塞后想办法激活同一进程的其它线程)。第一种行不通,
7.4 现代操做系统的线程实现模型
用户态的操做系统负责进程内部线程非阻塞线程的切换,内核态的操做系统负责阻塞线程的切换,这样咱们就能够同时实现用户态和内核态管理,内核态的线程较少,用户态线程多,每个内核态的线程能够服务一个或多个用户态的线程,也就是用户态的线程被复用了内核态。用户态几个线程使用一个内核态的线程,若是一个线程阻塞了,那就换另外一个执行。
7.5 多线程的关系
线程的通讯与同步
7.6 讨论:从用户态进入内核态
有两种状况或形成一个线程从用户态进入内核态
(1)程序运行期间发生中断或异常,系统会自动切换到中断或异常处理机制上来。
(2)程序系统调用也会形成一个线程从用户态进入内核态。
7.7 讨论:线程的困惑——肯定性与非肯定性
(1)线程的优点:
线程提供了程序层面上的并发性能,并发既提升了系统的效率(吞吐率),有改善了用户的响应时间。
线程的劣势:
系统运行的不肯定性。相对于单一进程,多进程的执行效率和执行正确率均存在不肯定性。
(2)相似于硬件的流水线机制(提供指令级的并发),
(3)在多流水线多梯度的状况下,许多指令同时在不一样的流水线和梯度上执行,其之间存在的数据和指令依赖关系十分复杂。线程和流水线的管理十分复杂,从某种程度上说,线程和流水线分别是软件层和硬件层不肯定的根源(高度归纳)。
思考题
——————————————————————————2015.7.7——————————————————————————————
第8章 线程同步
引子
8.1 为何要同步
设计线程的目的:共享资源,提升资源利用率。
线程之间的关系是合做关系,但多线程带来的是执行过程的不肯定性和执行结果的不肯定性。
8.2 线程同步的目的
目的一:无论线程之间的执行如何穿插,其结果都是正确的(要保证多线程执行下结果的正确性)。
目的二:保证执行效率。
同步就是让全部的进程按照必定的规则执行,其正确性和效率都有迹可循。
手段:对线程之间的穿插进行控制。
8.3 锁的进化:金鱼生存
两个进程争相执行同一段代码或访问同一个资源的现象叫竞争。这个可能形成竞争的共享代码段或资源叫临界区。
(1)为了不竞争,就须要某种协调手段,防止两个或以上的线程同时就进入到临界区。协调的目的就是在任什么时候刻只能有一个线程访问临界区,这叫互斥。正确互斥的四个条件:
1)不能同时有两个线程同时在临界区里面
2)可以在任何数量和速度的CPU上正确执行,
3)在互斥区域外不能阻止另外一个线程的执行,
4)进程不能无限制的等待进入临界区。
(2)锁
锁有两个基本操做:闭锁和开锁。
闭锁:等待锁达到打开状态,得到锁并锁上。(原子操做)
开锁:事情完成,将锁打开,别的人就能够进去了。
锁的特性:
1)初始状态是打开状态
2)进临界区前必须得到锁
3)出临界区前打开锁
4)若是别人持有锁则必须等待
所谓原子操做,就是该操做毫不会在执行完毕前被任何其余任务或事件打断,也就说,它是最小的执行单位,不可能有比它更小的执行单位,所以这里的原子实际是使用了物理学里的物质微粒的概念。
8.4 睡觉与叫醒:生产者与消费者问题
缓冲区的存在使得生产者和消费者可以相对独立地运行。
计算机模拟:一个进程表明生产者,一个进程表明消费者,一片内存缓冲区做为交换的中介。生产者生产的物品从一端放入缓冲区,消费者从另外一端获取物品。
睡觉与叫醒:若是锁被对方持有,你不用等待锁变为打开状态,而是回去睡觉,锁打开后再把你叫醒。
8.5 信号量
信号量不只是一个同步原语,更是一个通讯原语,还能做为锁来使用。
原语,来源于原子不可分的传说。操做系统的原语,由若干多机器指令构成的完成某种特定功能的一段程序,具备不可分割性.即原语的执行必须是连续的,在执行过程当中不容许被中断 。
信号量能够理解为一个睡眠锁,持有锁者能够执行,非持有锁者只能被动等待。
信号量能够理解为一个计数器,其取值为当前累积的信号数量。支持两种操做P操做(减法操做down)和V操做(加法操做up)
P操做:
1)判断信号量的取值是否大于等于1
2)若是是,将信号量的值减去1,继续往下执行
3)不然在该信号量上等待(线程被挂起)
V操做:
1)将信号量的值加1(此操做将唤醒一个在该信号量上面等待的线程)
2)线程继续往下执行
缺点:程序编写困难和程序执行效率低下,执行顺序的差别有可能形成死锁。
8.6 锁、睡觉与叫醒、信号量
8.7 管程(监视器 monitor)
管程:做为监视器,监视全部进程和线程的同步操做。
在管程中使用两种同步机制:锁来互斥,条件变量来控制执行顺序。
8.8 消息传递
用途:在多计算机环境下进行同步。
实现:经过同步双方通过互相收发信息来实现。它有两个基本的操做:发送send和接收receive。同步须要的是阻塞调用。(含义:?)
过程:生产者每生产出一件商品,就须要从消费者那里得到一个空的盒子,而后把产品装进盒子里,再把装有产品的盒子发送给消费者;消费者先发送N个空盒子给生产者,而后等待生产者将生产的产品发送过来,消费以后。将空盒子发送过去。只要当前当既有空盒子,又有满盒子,生产者和消费者就能够分别独立地运行。
缺点:效率低下
1)存在系统消耗
2)依赖网络环境
8.9 栅栏(barrier)
含义:到达栅栏的线程必须中止下来,直到出去栅栏后才能往前推动。
用途:对一组线程进行协调。
产生缘由:有时候一组进程协同完成同一个问题,因此须要全部进程到达同一个地方汇合以后才能一块儿向前推动。
思考题
第9章 死锁应对的哲学原理
引子
9.1 发生死锁的缘由
在一个多道编程的环境里,一个系统里存在多个进程或线程,这些进程和线程公享计算机里的资源,资源就是一个一个程序工做时所需的东西,如磁盘驱动器、锁、信号量、数据表格等。既能够是硬件:cpu、内存、磁盘等,也能够是软件:锁、信号量等看不见摸不着的东西。
资源是否能够抢占又能够分为:可抢占资源和非可抢占资源(若是被抢,将形成系统运行错误)。
9.2 死锁的描述
线程使用资源的顺序是:请求资源,使用资源,释放资源。
若是请求没被批准,则会发生:(a)阻塞等待,(b)当即返回,(c)失败退出,结束线程。
第一种结果可能会致使死锁
若是有一组线程,每一个线程都在等待一个事情(资源的释放)的发生,而这个事情只能有该组内的另外一线程发出,咱们就称这组线程发生了死锁。在死锁状态下,没有线程能够执行、释放资源或被叫醒。
百度百科上的定义:集合中的每个进程都在等待只能由本集合中的其余进程才能引起的事件,那么该组进程是死锁的。
9.3 死锁的4个必要条件
(1)必要条件:资源有限。指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。若是此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
(2)必要条件:持有等待。一个线程在请求新的资源时,其已经得到的资源并不释放,而是继续占有。
(3)条件:不能抢占。指进程已得到的资源,在未使用完以前,不能被剥夺,只能在使用完时由本身释放。
(4)条件:循环等待条件:你等我,我等你
9.4 哲学家就餐问题
哲学家围坐在一个圆桌边,每一个人的左右两边分别放着一根筷子。若是想要吃饭,就须要得到左右两边的筷子(不能用一根筷子吃饭)。
显然,每一个哲学家穿插着进行,将出现每一个哲学家拿起左边的筷子,而等待右边的筷子的状况。
9.5 死锁的应对
有四种应对策略:
(1)容许死锁存在
(a)顺其天然,不予理睬:为了寻求方便,解决死锁有可能比死锁自己带来的代价更高,直接重启就好,犯不着跟死锁较劲
评价:省时省力,但不受用户欢迎,也不是一个负责的研究者应该采起的态度。
(b)死锁检测与修复:
死锁检测:将资源可用矩阵和资源等待矩阵中的每个行相减,若是每一个线程都有负数,那就是发生了死锁。
死锁修复:能够抢占,杀死某个线程,上翻(将整个操做系统翻转到过去的某个状态)
备注:死锁的检测与修复仅仅存在理论上的可行性,实际中根本行不通。
评价:容许死锁的发生,死锁的侦测存在种种困难,也不是咱们追求完美者应该采起的态度。
(2)不容许死锁存在
(c)死锁的动态避免,
含义:在死锁有可能发生时采起先发制人的措施,断然拒绝可能致使系统进入潜在死锁状态的资源请求。因为系统历来不进入死锁状态,死锁带来的各类问题天然不复存在了。
原则:防止系统进入不安全状态
手段:每次须要进行资源分配时,就计算一下该分配方案是否会将系统代入不安全的状态。若是是,就否决相关的资源请求;不然,就批准。
缺点:计算一个状态是否安全不是一件容易的事情。
评价:存在实现上的困难,设计实现和时间成本都不理想。
(d)死锁的静态防止
方法:消除死锁发生的四个必要条件中的任何一个。
9.6 消除死锁的必要条件
(1)消除资源的独占条件:使尽量多的独占资源变得能够共享。e.g将任务或资源请求发送给一个精灵程序deamon,由这个deamon将统一处理请求。
(2)消除保持和请求条件:一个进程必须得到全部须要的资源后才能顺利进行;另外一种是一个进程必须得到全部须要的资源后才能顺利进行,可是若不能知足,那就把全部已得到的资源全释放。
(3)消除非抢占条件:容许对资源的抢占,例cpu和内存等,但有些资源被抢后会形成严重后果,例锁。
(4)消除循环等待条件:一个进程须要多个资源,1,2。它可能先申请1,再申请2;也可能先申请2,再申请1。则可能会形成死锁。若规定申请的顺序就能够避免死锁。
9.7 银行家算法:冒险的代价
9.8 哲学家就餐问题之解
9.9 讨论:死锁的思考——综合治理
死锁的四种应对策略:不予理睬,死锁检测与修复,死锁的动态避免,死锁的静态防止。
不予理睬和静态防止较合理,另外两种成本太高。经过对这两种策略的组合,例如对cpu和内存实施可抢占的静态防止策略,对磁盘、打印机等实施假脱机的共享,咱们有效防止了死锁的可能,对锁等一些软件资源,咱们就按照规定顺序请求,从而防止在这些资源上出现死锁,在剩下的其它资源上出现死锁,咱们就不予理睬了。
9.1 0讨论:死锁、活锁与饥饿
除了死锁之外,多道编程或多线程编程还要面对资源饥饿,某个进程或线程一直等不到它须要的资源。
思考题
第10章 锁的实现
引子:锁的实现哲学
操做系统之因此可以构建锁之类的同步原语,缘由就是硬件已经为咱们提供了一些原子操做:中断禁止和启用(interrupt enable/disable)、内存加载和存入(load/store)、测试和设置指令(set/test)。
10.1 以中断启用与禁止来实现锁
经过禁止中断,而且不自动调用让出CPU的系统调用(如yield之类),就能够防止进程切换,就能将一组操做变为原子操做。
发生上下文切换只有两种可能:
1)一个线程自愿放弃CPU而将控制权交给操做系统调度器,从而发生上下文切换;
2)一个线程被强制放弃CPU而失去控制权;
lock的操做:
lock(){
disable interrupts;
while(value!=FREE){
enable interrupts;
disable interrupts;
}
value=BUSY;(why?)
enable interrupts;
}
unlock的操做:首先禁止中断,而后将value的值设置为FREE,再启用中断。
10.2 以测试与设置指令来实现锁
10.3 以非繁忙等待、中断启用与禁止来实现锁
10.4 以最少繁忙等待、测试与设置来实现锁
10.5 中断禁止、测试与设置
思考题
第三篇 内存原理篇
第11章 基本内存管理
引子
11.1 内存管理的环境
理想状态下,程序员对内存的要求:大容量、高速度和持久性。
现实内存架构:缓存+主存+磁盘+磁带。缓存(低容量、高速度、高价格)、主存(中容量、中速度、中价格)、磁盘(大容量、低速度、低价格)。这样的架构就须要一个有效的管理机制——内存管理。
内存管理,就是对内存架构进行管理,使程序在内存架构的每个层次上对于用户来讲都是同样的,虚拟内存是操做系统提供给用户的另外一个“幻想”。
11.2 内存管理的目标
(1)地址保护:在内存中运行的多道程序互不干扰。一个进程不能进另外一个进程的地址空间。
(2)地址独立:程序发出的地址应与物理主存地址无关。指针里的地址是程序空间(虚拟空间)的虚拟地址(程序地址)。
11.3 虚拟内存的概念
虚拟内存的中心思想是将物理主存扩大到便宜的、大容量的磁盘上,即把磁盘空间看作是主存空间的一部分。程序能够彻底放在主存里,也能够彻底放在磁盘空间里,能够部分放在主存里,能够部分放在磁盘空间里。这样就给人一种内存空间增大的假象。
11.4 操做系统在内存的位置
计算机中存在着两种程序:管理计算机的程序(操做系统)和使用计算机的程序(用户程序)。管理者自己也使用资源(内存空间)。
(1)最简单的办法就是把内存分为两部分,操做系统和用户程序各占一部分。分有两种状况,以下图,操做系统是为用户服务的,在逻辑上应处于用户程序的下面,左边的较符合人们的思惟习惯,且在复位、中断、陷入等操做时,控制移交给操做系统更方便。
(2)现代计算机除了RAM外,还有ROM。操做系统能够所有放在ROM内,也能够部分放在ROM内。因为ROM比较贵,因此多采起后者。
(3)使用ROM的另外一个好处是,把输出输入和内存访问统一块儿来。把输入输出设备里的寄存器或其余存储媒介编入内存地址,使得访问输出输入设备和访问内存同样。这种输出输入叫作内存映射的输出输入。若是访问的地址高于RAM的最高地址,就属于I/O操做,否者就是正常内存操做。
a)没有内存映射的输出输入,ROM里面全是操做系统。
b)使用了内存映射的输出输入,ROM的一部分是操做系统,另外一部分属于I/0设备。
c)使用了内存映射的输出输入,ROM里面全属于I/0设备,如上图的右边的条形柱所示。(不是很明白?)
11.5 单道编程的内存管理
最简单的内存管理就是单道编程的内存管理,每次程序都会加载在固定的内存地址。
11.6 多道编程的内存管理
因为是多道编程,就没法把程序加载在固定的内存地址。
(1)固定分区的多道编程的内存管理
把用户程序的内存空间部分分为几个区域,能够大小同样,也能够不同。当加载用户程序时,选择一个当前空闲且容量够大的分区加载。在此模式下,一个新程序可能要在一个队列中等待。当有合适分区出现时,才进行加载。但会出现小程序占用大分区、小空间闲置的现象。
若是程序按照空间大小排在相应的队列里就能够解决上述问题,但也会出现有空闲空间但不能运行程序的尴尬。
(2)地址翻译
物理地址=虚拟地址+(程序)基址(程序所在区域的起始地址)
程序所在区域的起始地址<有效地址<程序所在区域的起始地址+程序长度
设置两个端值:基址和极限,存放在基址寄存器和极限寄存器。只有内核能够改变基址和极限。
(3)动态地址翻译的优势
灵活、利于地址保护、能够使虚拟空间的概念得以实施。
(4)非固定分区的多道编程的内存管理
固定分区的多道编程的内存管理的缺点有:程序大小与分区大小不匹配、僵化、地址空间没法增加。
非固定分区的多道编程的内存管理的思想很简单,用户程序的空间做为一个总体存在,来一个程序,就分一块空间,用完了,就退出来,让其它程序用,如上图。
同“固定分区的多道编程的内存管理”同样,设置两个端值:基址和极限,存放在基址寄存器和极限寄存器。
一个空间的增加
可是程序增加一般有两个来源,数据和栈。这两个空间的增加方式对整个程序的扩展性产生影响。
a)、向同一个方向增加,可是这种方式空间利用率低。
b)、unix,相向的方向增加;windows,是给栈划定了边界,超出了边界就报错。
c)还有第三种,交换。
(5)交换
交换就是将一个进程从内存倒出到磁盘上,再将其从磁盘上加载到内存中来的过程。
交换的目的:给程序腾出一个大的空间;实现进程切换(代价高,通常不这样作)。
(6)重叠
将程序按照功能分为一段一段功能相对完整的单元,一个单元执行完后,再执行另外一个单元,前面的单元就不会再执行,能够就能够把后面的程序单 元覆盖到当前的程序单元上,这样就能够执行一个比物理内存还要大的程序了。
(7)双基址
若是咱们运行两个同样的程序,只要设定两组基址和极限,就可让它们共享部份内存空间。
11.7 闲置空间管理
位图表示法:给每一个分配单元赋予一个字位,用于记录该单元是否闲置。成本空间是固定的,但没有容错能力,以下图。
链表表示法:将分配单元按是否闲置连接起来,以下图。
思考题
第12章 页式内存管理
引子
12.1 基址极限管理模式的问题
内存管理的方法:
(1)单道编程:固定加载地址的内存管理;
(2)多道编程:固定分区的内存管理;非固定分区的内存管理;交换内存管理。这三种多道编程均使用了一种实现机制:基址+变址。(物理地址=虚拟地址+(程序)基址)
12.2 分页内存管理
12.3 分页系统的优缺点
12.4 翻译速度
12.5 缺页中断处理
12.6 锁住页面
12.7 页面足寸
12.8 内存抖动
思考题
第13章 页面更换算法
引子
13.1 页面须要更换
13.2 页面更换的目标
13.3 随机更换算法
13.4 先进先出算法
13.5 第二次机会算法
13.6 时钟算法
13.7 最优更换算法
13.8 NRU算法
13.9 IRU算法
13.10 工做集算法
13.11 工做集时钟算法
13.12 页面替换策略
思考题
第14章 段式内存管理
引子
14.1 分页系统的缺点
14.2 分段管理系统
14.3 分段的优缺点
14.4 段页式内存管理
14.5 段号是否占用寻址字住
14.6 讨论:否认之否认的嵌套一纯粹
分段与逻辑分段、分页与段页
思考题
第四篇 文件原理篇
第15章 磁盘操做
引子
现代的计算机系统所处理的数据多存放在磁盘中。
文件系统就是磁盘的抽象,或者说操做系统为磁盘所提供的抽象就是:文件及文件系统。
15.1 磁盘组织与管理
磁盘就是形状像盘子的磁性存储介质。特性:数据存放持久,圆形,磁性,成本低廉。
15.2 磁盘的结构
一块磁盘是有多块盘片(正反)组成,每一个盘面配有一个磁头,磁头公用一个磁臂。
15.3 盘面的结构
磁道和扇面,磁道是一个一个的同心圆,每一个磁道又被分为扇面(扇区),数据以扇面进行存储,扇面是磁盘的最小I/O单元。
扇面有三部分组成:标题、数据和纠错信息。
15.4 磁盘驱动器的访问速度
影响磁盘读写速度的三个因素:寻道时间、旋转延迟、数据传输时间。
15.5 操做系统界面
15.6 磁盘调度算法
算法:先来先服务、短任务优先、短服务优先、电梯梯度、提早查看电梯梯度、单向电梯梯度。
思考题
第16章 文件基础
引子
16.1 为何须要文件系统
全部应用程序都要对数据进行处理,输入和输出数据,这些数据要找个地方存放。内存容量有限,不持久,且难以共享,进程结束或断电,数据就会消失。磁盘容量大,低成本,持久,且能够共享,进程结束或断电,数据也不会消失。可是通常用户不知道怎样驱动磁盘,计算数据在磁盘的什么位置
操做系统是个魔术师,提供给用户的是各类幻象——抽象,进程->cpu,虚拟内存->内存,磁盘->文件系统。文件系统是操做系统提供的另外一个抽象,他是一个看不见,摸不着,可是却能够使用的一个介于磁盘与用户之间的界面,它使磁盘变得更容易使用。
16.2 什么是文件系统
文件系统将其接触的磁盘物理特性转换为用户看获得的路径名和文件名。用户对磁盘进行访问只须要路径名和文件名便可,无需磁盘的具体信息。
16.3 文件系统的目标
一、地址独立(文件数据的产生和未来磁盘地址相对独立)
二、地址保护(文件访用权限)
16.4 文件的基本知识
16.5 从用户角度看文件系统
一、文件命名(操做系统将文件名翻译成其数据块在磁盘上存放的地址)
二、扩展名(一般表示文件类型,.c,.cpp,.exe)
四、文件存储组织
a、关系导向型组织,将数据之间的关系记录在文件里面,文件按照你的构建与数据之间的关系存在着某种对应关系
1>记录流存放方式下,数据以一个记录一个记录的方式,顺序排列
2>树形存放方式下,数据不光是按记录排列,记录之间的关系也能够被捕捉,层次关系排列,但不造成环
3>网状存放方式下,能够成环
b、非关系导向型组织,其组织形式不考虑数据里面的任何结构。数据就是一个数据流(多是字位流,字节流,数据块流,它们之间的区别也就是“流”的单位不一样),没有记录,没有关系。
c、两种组织方式比较:
关系导向型组织:文件系统须要知道不少细节(记录自己的细节,还要记录文件之间的细节),增长了文件系统的复杂性。后果是:文件系统自己的设计更加费时费力;因为文件系统的记录格式可能不一样,一个文件不能再另一个文件系统下访问,这样会照成文件的可靠性与兼容性问题。
非关系导向型组织:因为操做系统辨认的是数据块。字节或字位,数据的语义并无包括在组织方式里,任何操做系统均可以读写这些文件。
字节流的文件系统更加方便,操做系统的代码更加可靠,更加灵活、用户编写也更加方便。
五、文件类型
a、目录,记录文件的文件,它的内容是关于别的文件
b、通常文件,用来保存数据,根据内容的组织方式可分为文本文件和二进制文件
1>文本文件,存放的是没有通过处理的文件,ASCII码表示的文件,任何编辑器均可以打开
2>二进制文件,存放的是通过处理的文件,普通编辑器打不开,特定软件能够打开,加密文件也是二进制文件
c、块文件,关于输入输出设备的。,块文件模拟的是输入输出。对于每个输入输出设备的,咱们都以一个块文件来表示。须要与输入输出设备发生数据交换时,就以该文件替换。
六、文件格式
七、文件访问
a、顺序访问,从开头访问,按先来后到的顺序读取数据,不能在中间随便跳转,但能够快进快退。
b、随机访问,能够按照任何顺序读取数据记录,现对文件进行选点(seek),到达位置后开始读写。
八、文件属性
九、文件操做
16.6 地址独立的实现机制:文件夹
操做系统须要一个数据结构(文件夹)来记录每一个文件在磁盘上的位置,文件夹,也称为目录价(folder),存放的不是用户数据,而是关于文件和文件系统的信息。文件夹是用来追踪问价的,里面存放的是文件到文件地址的映射(文件
->文件在磁盘上的地址),
一、文件夹结构
因为文件夹里面有文件夹,这就造成了一个层次结构,这个层次结构的顶端是根文件夹,也就是根目录。根目录受损,整个文件夹都会崩溃(能够经过技术部分恢复)。
二、相对路径与绝对路径
文件名"/zou/cs307/file.pdf"
相对路径:
绝对路径:从根目录开始的一个完整路径
三、共享与连接
16.7 文件系统调甩
16.8 内存映射的文件访问
思考题
第17章 文件系统实现
引子
存在分区的理由:
一、不一样的分区能够创建不一样文件系统,这样能够方便咱们对文件的管理。
二、分区具备安全上的优点,一个分区坏了,不影响其余分区的使用。
三、分区具备可靠性上的优点,一个分区有故障,不影响其余分区的运行。
必须分区的理由:
对磁盘空间的管理,计算机内存的长度一般有限,而磁盘地址须要存放在内存字中,这样操做系统能够访问的磁盘地址数量就是有限的,这个上限数就限制了操做系统能够访问的磁盘空间大小。
17.1 文件系统的布局
一个磁盘分为若干个三面,扇面从0开始递增,第0扇面存放的是主引导记录(MBR),该记录的内容是一个小程序,用于启动计算机,若该扇面损坏,磁盘者没法使用。
大体布局与上图相似,整个磁盘的布局如上图:从左到右依次为,主引导记录,磁盘分区表,分区1(主分区),分区2,。。分区n。
主分区又分为引导记录,超级数据块,闲置空间管理,I-NODE区,根目录区,文件与目录区。
磁盘分区表里面给出的是磁盘的全部分区及其开始地址和终结地址。
操做系统放在主分区里面,计算机启动时,处于主板ROM里面的bios程序首先运行,BIOS在进行一些基本的系统配置扫描后对磁盘的0扇区进行读操做,将MBR里面的程序读到内存并运行,MBR程序接下来找到系统主分区,并将系统主分区里面的引导记录(boot
Recode)加载并运行,boot Recode里面内容是个小程序,负责找到操做系统映像,并加载到内存,从而启动操做系统。引导记录(boot Recode)后面的内容因状况而异,通常来讲,在该记录块后面的磁盘内容因文件系统的不一样而不一样。
上述叙述是其中的一种,具体布局可能不一样。
17.2 文件的实现
文件的实现要解决如下几个问题:给文件分配磁盘空间,记录这些磁盘空间的位置,将文件内容存放到这些空间。
存放的方式:连续方式,非连续方式(链表、索引)
一、连续存放方式,优势是读写效率高,缺点是空间浪费,文件扩展不易。
二、非连续方式:链表,每一个数据块里面留出一个指针的空间,用来存放下一个数据块的位置。
缺点,
1)数度慢,特别是随机访问时,须要一个一个找下去;
2)指针占空间;
3)计算机里面的尺寸都是2的n次方,若是数据块中的一部分空间来存指针,另外一部分存数据的就极可能不是2的m次方了,这样数据处理的效率就会降低。
文件分配表(FST,file allocation table),全部指针从数据块里抽出来,放在一块儿造成一张表,存放在内存里。
三、FAT文件系统,使用FAT机制的文件系统,有FAT12,FAT16,FAT32三种,磁盘内存字节数为12,16,28(不是32个)。FAT表的大小与物理磁盘大小和磁盘数据块大小有关,物理磁盘越大,磁盘数据块越小,FAT表越大。
四、索引文件系统,
拓展阅读:FAT文件系统原理http://blog.chinaunix.net/uid-23215128-id-2521273.html
17.3 目录实现:地址独立的实现
17.4 闲置空间管理
思考题
第18章 文件系统
引子
18.1 文件系统访问控制
18.2 主动控制:访问控制表
18.3 能力表
18.4 访问控制的实施
18.5 文件系统性能
18.6 提升系统性能的方法
18.7 文件系统设计分析:日志结构的文件系统
18.8 海量数据文件系统
思考题
第五篇 I/O原理篇
第19章 输入输出
引子
19.1 什么是输入输出
19.2 输入输出的目的
一、输入输出的目的有两个:
a、屏蔽输入输出设备之间的差别。
b、在不一样的设计之间进行数据表示的转换。
二、为达到上述目的,咱们要保持下列机制:
a、设备独立:无论输入输出设备是否是更好、更新,咱们进行输入输出的模式和方法保持不变。
b、设备保护:一个输入输出设备的操做不会影响对另外一个输入输出设备的操做。
19.3 输入输出硬件
一、输入输出硬件以设备存储和传输数据的方式能够划分为块设备和字符设备。
块设备:以数据块为单位存储和传输数据的输入输出设备,磁盘、光盘、U盘、磁带等。
字符设备:数据以字节(字符)为单位存储和传输数据的输入输出设备,鼠标,键盘,打印机、网络界面等。
另,网络界面,有时候能够和内存进行DMA,看起来更像块设备。时钟既不属于块设备,也不属于字符设备。
二、块设备和字符设备最大的区别是在寻址。块设备的数据按照数据块为单位进行寻址,每一个数据块都有惟一的磁盘地址,数据块是能够寻址的,字符设备的字符是不能够寻址的(?)。
设备控制器做用:1)控制设备的物理运行;2)将序列字位流转化为字节块流;3)进行纠错操做。
一、根据cpu与设备控制器沟通方式以及与内存的不一样关系,物理I/O模式分为如下三种:
a)专有通道的I/O:I/O和内存是彻底脱离的。每一个控制寄存器被赋予一个I/O端口(一个8位或16位的整数,这个整数与内存地址无关系,操做系统必须使用专门的输入输出特殊指令来进行数据的读写)
优势:与内存分开,输入输出操做不会影响内存选择
缺点:也是“与内存分开”,程序员必须使用IN/OUT低级指令,增长程序设计的难度,这是早期的计算机使用的。
b)内存映射的I/O:将I/O映射到内存中,从而使I/O和内存管理获得统一。I/O设备的每一个控制寄存器和设备缓冲区被赋予一个惟一的内存地址对这些地址的访问,也就是对输入输出设备的访问,从这些地址的访问逻辑上看,就是内存地址。
优势:I/O和内存管理获得统一
缺点:1)缓存使用引发的问题。
2)总线竞争
c)混合I/O:前两种方式的组合
二、根据cpu在I/O过程当中的涉入程度进行分类
a)繁忙等待访问:无论内存映射的输入输出,处理器均须要与I/O控制器与数据缓存区进行数据交换(按字节/数据块交换)。
b)直接内存访问(DMA,Direct Memory Acess):若是是按数据块交换,即须要大量数据传输,就无需CPU的介入,I/O设备直接与内存交换,数据传输有DMA控制器进行管理。
DMA输入输出的过程以下:
CPU对DMA进行设置,高暑期I/O的起始地址和数据长度;启动DMA过程;DMA进行数据传输;DMA结束后发出中断;CPU响应中断并处理结束事宜。
DMA模式须要考虑:如何访问总线(DMA与CPU造成内存总线竞争——解决方案:周期盗用或爆发模式);数据存放何处(直接放入内存、或先放入DMA缓冲区,而后经过中断让CPU一次性将DMA的数据考入内存);内存寻址模式(虚拟地址或物理地址)
19.4 输入输出软件
I/O软件的目的是魔幻和管理:魔幻将不一样I/O设备的不一样屏蔽,使它们看起来是同样的,管理师对这些设备进行管理,该独享的独享,该共用的共用,该缓冲的缓冲,并对设备进行实际的驱动(发出读写命令)。
一、I/O软件的目的:
设备独立:程序对I/O设备的访问不依赖于设备的物理特性,且在输入输出程序的编写时无需事先指定指定I/O设备。
统一命名:设备与文件的命名不依赖于具体的计算机,这样使用名字将使程序能够在任何机器上运行。
错误处理:对输入输出过程当中产生的数据错误进行侦测与纠正,而且纠错应该是在最靠近硬件的层面上进行。
数据传输:实际操控数据在主机与外设之间的传递。
缓冲:为数据传输提供一个临时存放地,而后在方便的时候将数据拷贝到最后的目的地。
共用与独享:将设备尽可能变为共享,以增大资源利用率和下降死锁发生的几率。
二、逻辑I/O模式
从CPU的涉入程度来分,能够分为可编程I/O和中断驱动I/O,这两种分别对应硬件原理的繁忙等待I/O和直接内存访问.
a)可编程I/O:在可编程模式下,CPU等待I/的完成,即CPU涉入很深,这种模式叫轮询,或繁忙等待。在等待的时间里,CPU不能干任何事情。
b)中断驱动I/O:中断驱动是将CPU从繁忙中解脱出来,在发送完一批数据后,CPU就去忙其余事情。I/O设备处理完这批数据后,就向CPU发出中断,CPU再发送另一批数据。
中断驱动过程:1)CPU初始化I/O并启动第一次I/O操做,2)CPU去忙别的事情,3)I/O处理完数据时,向CPU发出中断请求,4)CPU处理中断,5)CPU恢复被中断的程序。
三、直接内存访问I/O原理(DMA)
中断驱动的I/O须要周期性的中断来发射或接受后续的数据,会下降系统的效率。
19.5 I/O软件分层
输入输出是个极为繁琐的事情。它牵涉到用户空间和内核空间的数据交换,I/O设备的设置与启动,中断响应与返回,并且整个过程须要提供一个与I/O设备无关的统一界面.
一、中断服务程序,
思者题
第六篇 多核原理篇
多核对操做系统的影响:
(1)多核对操做系统的进程和线程调度产生了直接影响。
(2)在多核条件下,一条指令再多的核上执行,对单核环境下的同步机制有影响。
(3)能耗的管理。
本篇最重要的内容是多核的协调。
第20章 多核结构与内存
引子
20.1 以量取胜
多核:同一个芯片(cpu)上多个核(core)
多处理器:一个体系上放置多个cpu。
20.2 多核基本概念
在x86体系结构下,多处理功能芯片通过了对称多处理器结构、超线程结构、多核结构、多核超线程结构的4个演变阶段。
(1)多处理器结构
除了提高CPU主频和增长1、二级缓存容量外,提高计算机性能最直截了当的的办法就是在一个电脑里面安装多个cpu。
又分为对称多处理器结构(SMP)和非对称多处理器结构(AMP)。
(2)超线程结构
Inter提出了超线程技术让一个cpu同时执行多重线程,从而提升cpu效率和用户满意度。
超线程技术是一个cpu上同时执行多个程序共同分享该cpu内的资源。可让应用程序在同一时间里使用芯片的不一样部分。同一个物理cpu能够外化为多个逻辑cpu,这样一个物理cpu能够同时执行多个线程。但两个线程同时须要一个资源时,其中一个要暂停。
(3)多核结构
多cpu成本高、功耗大,超线程技术又不等同与两个cpu的性能,常常碰到两个线程同时须要一个资源其中一个要暂停的状况。
多核技术能够克服上述的缺点。
多核结构就是在一个cpu里面布置两个执行核,两套执行单元(ALU、FPU、L2缓存等),其余部分则是两个核共享。
(4)多核超线程结构
多核状况下,咱们也能够使用超线程技术,从而造成多核超线程。即同一个物理执行核里面能够分解为多个逻辑逻辑执行单元。
20.3 多核的内存结构
UMA:将内存做为与执行核独立的单元构建在核以外,全部的核均经过同一总线对内存进行访问。因为每一个内核使用相同的方式访问内存,器到内存的延时也相同。
优势是设计简单、易实现。缺点是难以针对单个程序进行访问优化,扩展困难,多核对共享内存的竞争会使系统效率降低。
NUMA:使用多个分开的独立共享内存,每一个执行核或cpu到达不一样共享内存的距离不一样,延时也不一样,这种延时不一样的内存共享模式称为非均匀内存访问。
优势是灵活、易扩展。缺点是对调度要求高。
COMA:
在每一个执行核里面配备缓存,其执行所须要的数据均缓存在该缓存里面。这种彻底由缓存知足数据访问的模式称为全缓存内存访问。每一个执行核配备的缓存共同组成了全局地址空间。
NORMA:非远程内存访问模式
若内存单元为每一个执行核私有,且每一个执行核只能访问本身的私有内存,对其它内存的访问经过消息传递进行。
优势:设计比numa简单。缺点是执行核间的通讯成本高。此模式在多核体系结构下使用较少。
20.4 对称多处理器计算机的启动过程
20.5 多处理器之间的通讯
20.6 SMP缓存一致性
20.7 多处理器、超线程和多核的比较
多处理器、超线程和多核都是为了提高计算机性能,都可以同时执行多个指令序列。
思考题
第21章 多核环境下的进程同步与调度
引子
21.1 多核环境下操做系统的修正
21.2 多核环境下的进程同步与调度
21.3 多核进程同步
21.4 硬件原子操做
21.5 总线锁
21.6 多核环境下的软件同步原语
21.7 旋锁
21.8 其余同步原语
21.9 核环境下的进程调度
21.10 多核环境下的能耗管理
21.11 讨论:多核系统的性能
思考题
第七篇 操做系统设计原理篇
第22章 操做系统设计之原理
引子
22.1 操做系统设计的追求
22.2
操做系统设计的第1条哲学原理:层次架构
22.3
操做系统设计的第2条哲学原理:没有时错
22.4
操做系统设计的第3条哲学原理:懒人哲学
22.5
操做系统设计的第4条哲学原理:让困于人
22.6
操做系统设计的第5条哲学原理:留有余地
22.7
操做系统设计的第6条哲学原理:子虚鸟有——海市蜃楼之美
22.8
操做系统设计的第7条哲学原理:时空转换——沧海桑田之变
22.9
操做系统设计的第8务哲学原理:策机分离与权利分离
22.10
操做系统设计的第9条哲学原理:简单为美——求于至简、归于永恒
22.11
操做系统设计的第10条哲学原理:适可而止
思考题
结语
参考文献