OS对资源的管理,就是对硬件+软件两种资源的管理。
硬件:CPU+存储(主存)+装备
软件:文件(系统)
这就是操作系统的4个章节。
单核达不到程序级并行,但可以到达指令级并行(pipeline)。
概念:
目的:为了实现并发,要不然直接傻瓜调度就好了,就不需要进程了。
进程与程序的区分:动态vs静态;进程有PCB;2者多对多(1个进程可以触及多个程序–>通过系统调用;1个程序可以对应多个进程–>通过量次履行)
状态:运行,阻塞(等待除CPU的资源,如IO,内存等),就绪(等CPU),还有创建&终结
3个核心状态构成4条有向边:
1. 运行 –> 阻塞:等待IO等资源;
2. 阻塞 –> 就绪:IO等资源完成,等待CPU;
3. 就绪 –> 运行:终究抢到了CPU;
4. 运行 –> 就绪:时间片用完了。。。
另外,新建(fork)以后进程处于就绪状态,运行完落后程也可能直接变成结束状态。
是1种数据结构。
包括PID,进程状态,优先级,现场保存区,所需资源已分配资源,调度信息等。现场保存区就是释放CPU时,用来记录CPU此时的寄存器、程序状态字等状态的。
创建进程就是创建PCB,杀死进程就是撤消PCB ==> PCB就是进程存在的标志和唯1代表。它包括了进程的状态调度和控制此进程的所有信息。
进程 = 程序段 + 数据块 + PCB
即:创建,撤消,状态转换。
原语primitive
创建start() 撤消exit() 阻塞await() 唤醒notify()
撤消原语撤消的是PCB而不是程序段,由于程序段有可能被几个进程同享。
管道、信号、消息队列、同享内存、信号量、套接字 等
Pipe:比如cat -A hello.cpp | head
,只能承载无格式字节流;
Signal:比如9
号代表SIGKILL
,所以有kill ⑼ xxx
;
消息队列:是消息的链接表,克服了信号承载信息量少,管道只能承载无格式字节流和缓冲区大小受限等缺点;
同享内存:多个进程可以访问同1块内存空间,是最快的可用IPC情势。是针对其他通讯机制运行效力较低而设计的。常常与其它通讯机制,如信号量结合使用,来到达进程间的同步及互斥。
信号量(semaphore):主要作为进程间和同1进程不同线程之间的同步手段。
Socket:更加1般的进程间通讯机制,可用于不同机器之间的进程间通讯。
先来先服务FCFS、轮转(时间片)、优先级法(优先级高的弄完了再释放CPU)、分级轮转(优先级+时间片:多个优先级不同的队列,先处理优先级高的队列)
信号量机制可以用来解决进程的同步与互斥问题。
临界资源:某些时段只能允许1个进程使用的资源。
临界区:访问临界资源的程序段。临界区是代码,代码段。
也叫直接制约关系。进程间协同工作,有前后次序。
也叫间接制约关系。访问临界资源时。
空闲让进,忙则等待(两句空话,无需解释)
有限等待,让权等待(正解!对要求访问的进程,应保证能在有限时间内进入临界区;如果进不去临界区,应当立即释放处理器,避免忙等待)
整型信号量被定义为1个用于表示资源数目的整型量S
。
wait和signal操作可描写为:
wait(S){
while (S<=0);
S=S⑴;
}
signal(S){
S=S+1;
}
缺点:很明显,缺点就是违背了“让权等待”原则,信号量S<=0时,会不断循环测试,进程处于忙等状态。
之所以叫记录型信号量,是由于信号量不再是单纯的1个整形来表示,而使用1个结构体:
typedef struct{
int value;
struct process *L;
} semaphore;
相应的wait(S)和signal(S)的操作以下:
void wait (semaphore S) { //相当于申请资源
S.value--;
if(S.value<0) {
add this process to S.L;
block(S.L);
}
}
wait操作,S.value–,表示进程要求1个该类资源,当S.value<0时,表示该类资源已分配终了,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到该类资源的等待队列S.L中,可见该机制遵守了“让权等待”的准则。
void signal (semaphore S) { //相当于释放资源
S.value++;
if(S.value<=0){
remove a process P from S.L;
wakeup(P);
}
}
signal操作,表示进程释放1个资源,使系统中可供分配的该类资源数增1,故S.value++。若加1后还是S.value<=0,则表示在S.L中仍有等待该资源的进程被阻塞,故还应调用wakeup 原语,将S.L中的第1个等待进程唤醒。
具体参考信号量:整型、记录型信号量和利用信号量实现进程互斥和先驱关系
TODO:生产者消费者 银行家 等
P/V操作有效,但是是低级的,如果不由程序员来控制完成,才是ok的。
管程,就是用来管理临界资源的。
为了访问临界资源,管程每次只允许1个进程进入其内,不过这无需程序员操心,由编译器保证。所以很高级。
死锁的条件:
1. 互斥;
2. 不剥夺;
3. 要求和保持;
4. 环路等待。
即:有争取的东西;他人正在用东西的时候你不能侵占;没拿全所需的东西的时候,已拿到的也不放手;最后大家都相互等待循环等待,gg。
Attention:环路等待和死锁的关系。
死锁,1定是出现了环路等待。但是环路等待未必会死锁。
例如:两个人要上厕所,需要穿鞋,有1只L鞋子,1只R鞋子。A拿到L,B拿到R,则环路等待,两人都走不了路,死锁。但是如果有两只L鞋子,1只R鞋子,从等待关系上来看,两个人还是会构成环路等待圈,但是其实不会死锁。由于B可以集齐1套,用完以后释放1只L1只R,此时A就能够的到R,愉快上厕所=.=
所以:只有系统的每类资源都只有1个时,环路等待才等价于死锁。
对待死锁,有:死锁预防、死锁避免、思索检测与消除。
资源独占:毙掉3,即必须拿到所有的资源才能运行,如果拿不全的话,那就不拿。
缺点:资源利用率低,系统资源被严重浪费,其中有些资源可能仅在运行早期或运行快结束时才使用,乃至根本不使用。而且还会致使“饥饿”现象,当由于个别资源长时间被其他进程占用时,将导致等待该资源的进程迟迟不能开始运行。
资源顺序分配:只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。
好处:提高资源利用率
缺点:问题是编号必须相对稳定,这就限制了新类型装备的增加
银行家算法:看看借出去的租能否收回来。如果全都借出去还满足不了对方,不能收回来,那就先不借出去。
资源分配图:要求边、分配边
死锁定理:资源分配图不能完全简化 <==> 死锁
实质上是如何让释放资源的进程继续运行
资源剥夺法:挂起某些进程。被挂起的进程不能1直挂着处于“饥饿状态”,饿死了怎样办。。。
撤消进程法:撤消某些进程。根据优先级和撤消的代价决定。
目的:进1步提高程序并发度,提高系统吞吐量
资源同享,减小开消,更好的并发性
进程是资源分配的基本单位,线程是CPU调度的基本单位。
进程有自己的地址空间,即便崩了也不会影响其他进程;线程没有单独的地址空间(但有自己的堆栈&局部变量),线程崩了全部进程就崩了。所以多进程比多线程更硬朗,但资源消耗太大,效力太差。
进程有自己的数据空间,所以进程间数据的传递需要进程间通讯;线程没这么麻烦,同1进程下的线程同享进程的代码段、数据段、系统资源(打开的文件等)等。
孤儿进程vs僵尸进程
爸爸gg了,孩子就是孤儿进程;孩子gg了,爸爸不去收尸,孩子就成了僵尸进程。
所有的进程(init进程除外)gg后都会经历僵尸进程,等待爸爸来收尸^_^。
进程的TASK_ZOMBIE状态:进程灭亡,PCB还在task数组中。发送信号给父进程,父进程释放其task_struct结构。
地址转换
相对地址(逻辑地址/地址空间):源代码编译成的目标代码中的地址
绝对地址(存储空间):可履行代码在物理内存中的实际地址
地址重定位(地址映照):逻辑地址 –> 绝对地址
静态重定位
程序履行之前进行的定位,直接修改存有地址的源码
动态重定位
程序履行进程中的地位,装入代码后,拿相对地址加上起始地址便可。
存储管理部件MMU,Memory Management Unit,有时称作分页内存管理单元(paged memory management unit,缩写为PMMU)。它是1种负责处理CPU的内存访问要求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理,将虚页号转换为物理页号,页内偏移不用改动)等。
页表在主存,1次读写操作需要两次访存。第1次从内存访问页表,获得物理地址,第2次才是真实的根据物理地址获得内存中的数据。
所以将1部份页表放入cache,成为快表。就变成了1次“访缓”+1次访存。固然如果“访缓”没找到相应的页,还得去主存中访问页表。(如果根据页表得到的页不在主存中,还需要产生缺页中断,由中断处理程序将相应的页从磁盘调入主存)
内存管理单元通常借助1种叫做转译旁观缓冲器(Translation Lookaside Buffer,缩写为TLB)的相联高速缓存(associative cache)来将虚拟页号转换为物理页号。当后备缓冲器中没有转换记录时,则使用1种较慢的机制,其中包括专用硬件(hardware-specific)的数据结构(Data structure)或软件辅助手段。这个数据结构称为分页表,页表中的数据就叫做页表项(page table entry,缩写为PTE)。物理页号结合页偏移量便提供出了完全的物理地址。
目的:利用外存来逻辑地扩充内存。
铁定不会同时履行的程序段同享1个内存区域。不履行的先放在磁盘上。
对用户要求太高,需要用户指定哪些可以相互覆盖,不人性化。
也叫滚入滚出,roll-in, roll-out
需要动态重定位机构支持,即再度滚回来时不1定还是之前的内存地址。
交换技术对用户透明,good!
以两个技术为基础——局部性原理、虚拟页式存储管理。
时间(循环/子程序/栈)&空间(顺序履行/数组遍历/相邻寄存)
逻辑地址空间很大,实际主存有限。需要时调入主存便可。
缺页中断
页面置换算法
1. 先进先出FIFO;
2. 最近最久未使用LRU;
3. 最优算法OPT:foresee,impossible。
地址空间大于主存物理空间
进程保护:每一个进程都有自己的虚拟地址空间,即便gg了也不会相互影响
虚拟内存可以隔离进程的地址空间,那末如果不同进程的虚拟地址映照到同1物理地址,就能够实现内存同享,这就是同享虚拟内存!既可以节省物理内存,又可以实现进程间通讯。
PCI总线:Peripheral Component Interconnect总线,外围装备互连总线。将CPU和存储器连接到快速装备和扩大总线上。
所以说PCI不是总线,是“外围装备互连”。“PCI总线”才是总线。
控制器
很多IO装备都有自己的控制器。
CPU操纵控制器,使装备完成I/O传输。
CPU不停扫描装备控制器中的寄存器的状态,明显耽误了CPU干正事儿。
CPU上有中断要求线。
装备接收CPU指令开始传数据,缓冲寄存器满了就开始产生中断,CPU不能不来处理中断,亲身转移这些数据。每一个字在存储器与I/O控制器之间的传输都必须经过CPU,这就致使了中断驱动方式依然会消耗较多的CPU时间。
中断屏蔽 中断向量表 中断优先级
中断用于处理异步事件和系统调用(用圈套方式进入内核的管态)。
用于大容量传输装备。
CPU通知数据传输的起始结束位置和大小,DMA将数据从装备传到内存(需要占用内存总线,暂时制止CPU访存),弄完了就给CPU发出中断,告知它完事儿了。
中断 vs DMA
中断的话,数据缓冲寄存器满1次就得中断CPU1次,CPU得亲身转移这批数据;DMA则是将所有数据传输终了后,才中断CPU,减少了CPU的终端次数,而且数据传输不经过CPU。完全解放了CPU。
通道是1个独立与CPU的专门负责IO的PU。有自己的通道指令。
I/O通道方式是DMA方式的发展,它可以进1步减少CPU的干预,即把对1个数据块的读写为单位的干预,减少为对1组数据块的读写及有关的控制和管理为单位的干预。
I/O通道 vs 1般处理机
通道指令的类型单1,没有自己的内存,通道所履行的通道程序是放在主机的内存中的,也就是说通道与CPU同享内存。I/O通道 vs DMA
DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每一个DMA控制器对应1台装备与内存传递数据,而1个通道可以控制多台装备与内存的数据交换。
字节多路通道:低速装备(eg:打印机),1次1字节。
数据选择通道:高速装备(eg:磁盘/磁带),以块为单位传送。但是1次只能对1台装备进行IO操作。
数组多路通道:高速,分时操作不同的装备。
相同点: 都是介于高速装备和低速装备之间。
寄存的是低速装备上的某些数据的复制的数据,也就是高速缓存上有的低速装备上面必定有。这些数据常常要访问,所以在高速缓存上是为了加快访问速度。
1般在内存区域,用来存储数据。用于装备之间或装备与程序之间,弥补CPU和IO装备速度的不匹配。解决基本数据单元大小(即数据粒度)不匹配的问题。提高CPU和I/O装备之间的并行性。
虽然也能够在硬件上采取硬件缓冲器实现,但是太贵了。
同享打印机是使用SPOOLing技术的1个实例,用于多用户系统和局域网络中。
当用户进程要求打印输出时,SPOOLing系统同意为它打印输出,但其实不真正立即把打印机分配给该用户进程,而只为它做两件事:
1. 由输出进程在输出井中为之申请1个空闲磁盘块区,并将要打印的数据送入其中。
2. 输出进程再为用户进程申请1张空白的用户要求打印表,并将用户的打印要求填入其中,再将该表挂到要求打印队列上。
SPOOLing系统的主要特点有:提高了I/O的速度;将独占装备改造为同享装备;实现了虚拟装备功能。
文件:具有符号名的相干数据的集合。
无结构文件:1系列的字符串组成,流式文件。
有结构文件:相干记录的集合。比如表格等。
文件转储:全量转储、增量转储。
目录:文件系统层次结构的非终结结点。
文件:终结结点。
文件系统:负责存取和管理外存上文件信息的功能模块。
进程 = PCB + 程序段 + 数据段
文件 = FCB + 文件体
文件名、用户名、物理地址、格式、编码、属性、密码等。
文件系统3大职能:
1. 建立文件;
2. 加工文件;
3. 输出加工后的文件。
调度
先来先服务FCFS:
最短寻道时间优先shortest seed time first, SSTF:(贪心算法),不能保证平均最短,但是明显好过 FCFS。可能使1些进程饥饿。
SCAN算法:不但斟酌最短寻道,还要斟酌必须与当前磁头移动方向相同。磁头类似电梯来来回回,又称为“电梯调度算法”。
循环扫描CSCAN,circular scan:磁头单向移动,到达最外道时再从最里道开始扫描。
1般选择SSTF,磁盘负荷重的系统选择SCAN/CSCAN,避免死等。
便宜冗余磁盘阵列RAID,redundant arrays of inexpensive disks
存储程序式计算机,冯 诺依曼计算机:运算器、控制器(自动化操作)、存储器(存储程序和数据)、IO部件。
操作系统(Operating System, OS)是指控制和管理全部计算机系统的硬件和软件资源,并公道地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。
操作系统是计算机系统中最基本的系统软件。
操作系统的特性:
并发:
同享:并发与同享相互依存。
不肯定:OS需要随时处理系统中的不肯定事件。
虚拟:内存、CPU、外设等都采取了虚拟技术,逻辑上扩充了数量。
为了解决人机矛盾及CPU和I/O装备之间速度不匹配的矛盾,出现了批处理系统。它按发展历程又分为单道批处理系统、多道批处理系统(多道程序设计技术出现以后)。
时间片
操作系统和利用程序之间的接口。