为了实现多道程序并发执行的一种技术,为了提高资源利用率
发生中断,就意味着需要操作系统介入工作,cpu会立即进入核心态
同时,中断也是用户唯一进入核心态的途径
为了提高响应中断的速度,通常把所有中断服务程序的入口地址汇集为中断向量表
信号来源cpu内部,与当前执行的执行有关
信号来源自cpu外部,与当前指令无关,一般是I/O操作,或者用户自己强行停止一个进程而产生的中断
https://www.cnblogs.com/IvesHe/p/4418300.html
是一个具以下特征的活动:一组指令序列的执行,一个当前状态和相关的系统资源集
进程分为系统进程和用户进程,其区别如下:
线程是现代操作系统引入的一种执行实体,也称“轻型进程”,是进程的组成部分,进程是资源占有单位,线程只是CPU调度单位
进程是个独立的实体单位:
独立占用资源:进程拥有对资源的控制权或所有权
独立参与调度/执行:进程是一个可被操作系统调度和分配的单位
线程仅是分派(调度运行)的单位:
线程不是单独占用资源的代为,线程共享其所属进程的资源
分为用户级线程和内核级线程
线程的创建,撤销和切换都不利用系统调度来实现,线程与内核无关,内核也不着线程的存在
依赖于内核,线程的创建,撤销和切换都由内核实现,在内核中有线程控制块(TCB),内核根据TCB感知线程的存在,并对线程进行控制
在早期的单道程序计算机系统中,一次只能运行一个程序,当有多个程序需要运行时,程序的执行方式必定的顺序的
其程序顺序执行的特征如下:
程序的并发执行具有的特征如下:
进程在运行过程中通常有三种基本状态,分别是
人话就是孔明原语目的是建立,删除,修改PCB
所谓的pv操作是属于操作系统中的一种同步机制,实现对于并发进程中临界区的管理,实在难以理解的话,可以简单理解成P为阻塞,V为通知,如果S信号量初始值为0的话
而解决死锁问题就有两种方案,一种是死锁的预防,例如如果采用预防,资源根本就不是互斥打破了四大条件,就不用继续往下谈死锁的内容,亦或者资源根本就不会等待,进程自己等久了自己就把资源释放给别人也打破了四大条件,另一种是死锁的避免,有序资源分配法,如同字面意思有序一个一个的将资源分配给进程,但这样一来会发现,资源利用率会比较低,而更加灵活有效的是银行家算法
满足用户的要求:响应时间(等待时间),周转时间,截止时间
满足系统的要求:系统吞吐量,处理机利用率,各类资源的平衡使用,公平性及优先级
从提交到完成之间的时间间隔
周转时间包括作业在外存后备队列上等待调度的时间,进程在就绪队列上等待进程调度的时间,进程在CPU上执行的时间,以及进程等待I/O操作完成的时间四个部分
公式是:
周转时间=作业完成时间-作业提交时间
平均周转时间=(作业1的周转时间+…+作业N的周转时间)/n
带权周转时间=作业周转时间/作业实际运行时间
平均带权周转时间=(作业1的带权周转时间+…+作业N的带权周转时间)/n
PS:带权周转时间就是指作业周转时间与作业实际运行的时间的比值
从提交到开始接受相应之间的时间间隔
响应时间是指从用户提交一个请求开始,到系统首次产生相应为止的时间间隔。
输入的请求传送到处理机的时间+处理机对请求信息进行处理的时间+将响应结果发送到输出终端的时间=响应时间
进程完成的最后期限
分为长程调度(作业调度队列),又称作业调度,中程调度(进程调度队列),又称中级调度,短程调度(进程调度队列),又称进程调度
属于最简单的调度算法,可用于作业调度,也可用于进程调度,其算法是非抢占式的
这里需要先去了解一下 3.1.1 的用户原则,即可很快的理解题目该如何做
反正需要知道的是
等待时间=开始时间-提交时间
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
带平均的话,除作业数量就好
其执行顺序时间如下
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 3 | 1 |
B | 7 | 1.17 |
C | 9 | 2.25 |
D | 12 | 2.4 |
E | 12 | 6 |
最短作业优先调度是指对短作业或短进程优先调度的算法,说人话,就是选择一个运行时间最短的进程拿去执行就对了
按照最短优先的顺序时间如下:
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 3 | 1 |
B | 7 | 1.17 |
C | 11 | 2.75 |
D | 14 | 2.8 |
E | 3 | 1.5 |
人话,根据线程优先级来排序运行顺序,分抢占和非抢占的,非抢占的简单很多,优先级高的大哥属于有素质的那种,不会插队,反正小弟比大哥先来并且已经运行的话,那大哥得等着不能强行把小弟腾走自己运行,但是小弟如果没运行的话得给大哥让路,抢占的话就是大哥比较霸道了,小弟哪怕先来哪怕运行了,都得给大哥滚蛋。
根据不抢占优先级优先原则,其执行顺序时间如下
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 3 | 1 |
B | 7 | 1.17 |
C | 14 | 3.5 |
D | 8 | 1.6 |
E | 12 | 6 |
根据抢占优先级优先原则,其执行顺序时间如下
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 14 | 4.67 |
B | 11 | 1.83 |
C | 14 | 3.5 |
D | 5 | 1 |
E | 12 | 6 |
静态优先级:人话就是创建的时候确定了,在进程整个运行期间都不再修改
动态优先级:人话就是优先级会变,在运行前会确定一个优先级,根据等待时间的长短,执行时间的多少,输入输出信息量的大小得出一个优先级
人话来解释的话就是当你有好几个进程可以跟在后面的时候,去算每个进程跟在后面的带权周转时间(响应比),选个最大的跟,以此进行的排序
响应比的计算方式
A先到,执行完后,发现能运行的只有B,B运行,等到B运行完后发现有C,D,E可以运行,这时候进行最高响应比计算
如果是C排在后面
A | B | C |
---|---|---|
3 | 9 | 13 |
其带权周转时间为 (13-4)/4 =9/4
如果是D排在后面
A | B | D |
---|---|---|
3 | 9 | 14 |
其带权周转时间为 (14-6)/5 =8/5
如果是E排在后面
A | B | C |
---|---|---|
3 | 9 | 11 |
其带权周转时间为 (11-8)/2 =3/2
根据最高响应比优先原则,所以跟在AB后的是C,接着就是再重新判断D和E的响应比来判断谁跟再ABC的后面
如果是D排在后面
A | B | C | D |
---|---|---|---|
3 | 9 | 13 | 18 |
其带权周转时间为 (18-6)/5 =12/5
如果是E排在后面
A | B | C | E |
---|---|---|---|
3 | 9 | 13 | 15 |
其带权周转时间为 (15-8)/2 =7/2
根据最高响应比优先原则,所以跟在ABC的是E再次才是D,得出排序如下:
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 3 | 1 |
B | 7 | 1.17 |
C | 9 | 2.25 |
D | 14 | 2.8 |
E | 7 | 3.5 |
人话就是,每个进程运行后,一旦时间片用完,也就是时间用完,则主动退出让下一个排队的进程进来,如此反复
时间片为4
其排序如下:
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 3 | 1 |
B | 5 | 2.5 |
C | 7 | 1.75 |
D | 14 | 2.8 |
E | 11 | 5.5 |
人话:哪个进程服务时间当前最少先运行哪个
其排序结果如下:
通过
周转时间=完成时间-提交时间
带权周转时间=(完成时间-提交时间)/ 运行时间
来计算
周转时间 | 带权周转时间 | |
---|---|---|
A | 3 | 1 |
B | 13 | 2.17 |
C | 4 | 2 |
D | 14 | 2.8 |
E | 2 | 1 |
两个或两个以上的进程,因其中的每个进程都在等待其他进程做完某些事情而不能继续执行,所有进程都阻塞等待,而且是永远阻塞等待
人话就是a等b释放资源,b等a释放资源,就会造成死锁
两个或两个以上进程为了响应其他进程中的变化而持续改变自己的状态,但不做有用的工作
一个可运行的进程被调度程序无期限忽略,不被调度执行的情形
人话就是,孩子饿坏了却依旧不给饭吃
保证指令序列要么作为一个组来执行,要么都不执行
人话就是:要画个圆结果你只画了一半你能说它是圆吗?反正就是执行要么运行完,要么一点都别动
两个或多个进程可以通过传递信号进行合作,可以迫使进程在某个位置暂时停止执行(阻塞等待),直到它收到一个可以“向前推进”的信号(被唤醒)
而上述实现信号灯作用的信号称呼为信号量
二进制信号量(binary semaphore):只允许信号量取0或1值,其同时只能被一个线程获取。
整型信号量(integer semaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。
记录型信号量(record semaphore):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。
仅上述条件都满足时,死锁才有可能发生,破坏上述任意一个条件也可以消除死锁,但是通常指破坏循环等待,因为:
好了,人话来讲,Available 是可用资源还剩多少,Max是进程的最大需求数,Allocation是已经分配给该进程的资源数量,Need是进程还需要多少资源数量
MAX-Allocation=Need
假设系统中有5个进程{P1、P2、P3、P4、P5}和4种类型的资源{R1,R2,R3、R4},资源的数量分别为8、5、9、7,在T0时刻的资源分配情况如下表所示
work | Need | Allocation | Work+Allocation | Finish | |
---|---|---|---|---|---|
P3 | 1 2 2 2 | 1 1 0 2 | 4 0 0 3 | 5 2 2 5 | true |
P1 | 5 2 2 5 | 1 2 0 3 | 2 0 1 1 | 7 2 3 6 | true |
P2 | 7 2 3 6 | 0 1 3 1 | 0 1 2 1 | 7 3 5 7 | true |
P4 | 7 3 5 7 | 1 3 2 0 | 0 2 1 0 | 7 5 6 7 | true |
P5 | 7 5 6 7 | 2 0 0 3 | 1 0 3 0 | 8 5 9 7 | true |
答:T0时刻安全,因为存在安全序列
答案:能够分配
之所以引入虚拟存储管理是因为传统存储管理方式有两个特征
指程序在执行过程中的一个较短时间内,所执行的指令地址或操作数地址分别局限于一定的存储区域中。又可细分时间局部性和空间局部性。
所谓虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统
它的基本思想是:在进程开始运行之前,不是装入全部页面,而是装入部分页面,之后根据进程运行的需要,动态装入其它页面。当内存空间已满,而又需要装入新的页面时,根据某种算法淘汰某个页面,以便装入新的页面。
人话:预知算法,理论上很好,实际上实现不了,作为标准来衡量其他算法,就是当需要置换页框的时候,去预知当前内存已有的哪个是最晚才能遇到的页框,然后将其替换
例题:
置换内存中上次使用距当前最远的页,是属于性能接近于OPT,但开销很大,难以实现的置换法。
重定向,将逻辑路径转换为物理路径
其实就是中级调度,内存空间紧张的时候将某些进程暂时换出外村,把外村中某些已具备运行条件的进程换入内存
连续分配:指为用户进程分配的必须是一个连续的内存空间
内存会被分为系统区和用户区,系统区通常位于内存的低地址部分,用于存在操作系统相关数据,用户区存放用户进程相关数据,内存中只能有一道用户程序,用户程序独占整个用户区空间
为了支持多道程序的系统,为了能在内存中装入多道程序,且程序之间不会互相干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区只装入一道作业
又称可变分区分配,这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小和数目是可变的
进程在内存中连续存放是,通过动态重定位来实现地址的转换
每次都从低地址开始查找,找到第一个能够满足大小的空闲分区,四种算法中,首次适应的综合效果是最好的(没想到吧)
首次适应算法的up版,首次适应每次都是从开头开始找,执行多后前面占的差不多,后面却还有剩,每次都要经过前面的分区,增加了查找的开销,所以这是从上次查找结束的位置继续往下查找的版本
人话,优先使用更小的空闲区,缺点是每次都选最小的分区进行分配,会留下越来越多的很小的难以利用的内存块,会产生很多的外部碎片
人话,和最佳相反,选最大的空闲区,缺点是会导致较大的连续空闲区迅速用完,如果之后有大进程进来,就没有内存分区可用了
产生的原因:如果采用连续分配要么会产生大量的内部碎片亦或者外部碎片,所以该采用不连续的内存分配方法,基于着思想产生了“非连续分配方式”,或称“离散分配方式”
就是通过页面长度换算称2进制,然后前面是页号,后面就是页内地址
因为分页是离散存储的,所以操作系统为了需要知道每个页面在内存中存放的位置,为每个进程建立一张页表
与分页最大的区别就是离散分配时所分配地址空间的基本单位不同
按文件是否有结构分类,可以分为无结构文件和有结构文件两种
无结构文件:文件内部的数据就是一系列二进制流或字符流组成,又称“流式文件”,如:.txt文件
有结构文件:由一组相似的记录组成,又称“记录式文件”,每条记录又若干个数据项组成,数据库表文件,一般来说,每条记录有一个数据项,根据各条记录的长度是否相当,又可分为定长记录,和可变长记录两种
文件中的记录一个接一个地顺序排列(逻辑上),记录可以时定长的或可变长的,各个记录物理上可以顺序存储或链式存储
姑且当作是数组和链表
而顺序存储又有两种结构,分别是串结构和顺序结构
对于可变长记录文件,要找到第i个记录,必须先顺序查找前i-1个记录,但是很多场景中又必须使用可变长记录,索引文件就是为了解决这个问题产生的
建立一张索引表以加快文件检索速度,每条记录对应一个索引项
索引表本身是定长记录的顺序表,因此可以很快速的找到第i个记录对应的索引项。
其缺点:
每个记录对应一个索引表象,因此索引表可能会很大,比如每个记录平均8B,而每个索引表项占32个字节,那么索引表都要比文件本身大四倍,存储空间的利用率大下降,
索引顺序文件是索引文件和顺序文件思想的结合。
索引顺序文件中,同样会为文件建立一张索引表,但与索引文件不同的是,并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项,人话来讲,就是先将文件进行分组然后再用一个索引来对应它
类似上图先将名字全部分组,后各用一个索引对应它,如下图:
索引顺序文件的效率分析
为了进一步提高检索效率,可以为顺序文件建立多级索引表,人话来讲就是,在索引顺序文件的基础上,再将索引项进行分组,然后再多一个顶级索引表的玩意以一个对一组索引项的形式,就是套娃
规定索引节点0-9为直接索引,10节点是一级间接索引,11是二级间接索引,12是三级
默认题目没讲就是十三个盘块,假设一个物理盘块是4k的大小,如果采用直接索引
4k x 13 =52 k
那么该物理盘只能有52k的容量
假设第十个节点的盘口为4字节,那么它能存4k除以4字节总共1024个地址的物理盘块
那么即4k(物理盘口容量) 乘以1024 (地址数量)就是一级索引的容量大小
二级索引节点即多乘以一个1024(地址数量)
简单来说,求解很简单,求得该节点能存多少个地址数量然后乘以物理盘块容量就好了,如果是二级三级,那么就多乘个地址数量