周转时间:完成时间-提交时间
应用程序调用系统调用,内核调用相应的内核函数。
操作系统体系结构:模块组合、层次结构、微内核。
进程通信:共享存储系统、消息传递、管道通信。
多线程模型:
多对一:多个用户映射一个内核线程,只要有一个用户级线程瘫痪整个,系统都会瘫痪。
一对一:不会互相影响,较好。
多对多:更好。
可以进行进程调度:当前进程运行结束、当前进程进入阻塞状态、系统调用完成后饭会用户进程、抢占式、分时系统。
不能进行进程调度的是:处理中断、在系统内核程序临界区、原子操作。
常见进程调度算法:
先来先服务:有利于长作业不利于短作业。
短作业优先调度算法:作业同时到达的时候SJF是最佳算法,平均周转时间最短,对长作业不利,可能会陷入饥饿状态。
时间片轮转算法:时间片设置过大,会变成先来先服务,时间片过小会出现,频繁切换。
影响时间片设置因素:系统响应时间,就绪队列中进程数目,系统的处理能力。
高响应比优先调度算法:响应比= (等待时间+运行时间)/运行时间。
多级队列调度算法(进程调度):多个队列,不同队列使用不同的调度算法。
多级反馈队列调度算法:时间片轮转调度算法和优先级调度算法综合发展,设有N个队列(Q1,Q2….QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > … > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。
同步(直接制约)
互斥(间接制约):准则:空闲让进、忙则等待、有限等待、让权等待。
互斥实现方法:软件方法(存在忙等)、硬件方法(不能实现“让权等待”)。
管程:实现进程互斥!
死锁产生的必要条件:互斥条件,不可剥夺条件,请求和保持条件,环路等待条件。
处理死锁的基本方法:鸵鸟算法(视而不见)、预防死锁(破坏产生死锁的必要条件)、避免死锁(银行家)、检测及解除。
死锁的避免:安全状态和不安全状态(系统尚未死锁,但是后续可能会死锁,但并不一定会产生死锁,因为有的进程可能会突然放弃自己已经占用的资源),满足安全状态的序列叫安全序列。
死锁的检测:圆圈表示进程,方框表示资源。
死锁定理:依此满足不同进程的资源,看看最后是不是每个进程都资源需求都得到了满足。
死锁解除:剥夺资源、撤销进程、进程回退。
死锁与饿死:饿死(一个进程长时间得不到所需的资源)
各个线程用于属于自己的栈空间,不允许共享。
设备分配不会产生进程。!!!
内存管理:
程序的装入与链接:首先编译程序将源代码编译成若干个目标模块;其次,通过链接程序将编译好的目标模块以及所需要的库函数链接在一起,形成完整的装入模块;最后,通过装入程序将这些装入内存并且执行。
静态链接(在运行之前,将所有目标模块以及库链接为一个完整的可执行程序,后面不再拆开)、装入时动态链接(将程序编译后得到的目标模块装入内存时采用边装入边链接的动态链接方式)、运行时动态链接(知道程序运行过程中需要一些模块时,才对这些模块进行链接,在执行过程中,发现一个被调用模块尚未装入内存时,立即去找到该模块并将其装入内存,然后将其链接到调用者模块上。凡是在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,不仅缩短了短程序的装入过程,而且可以节省大量的内存时间,便于修改和更新,便于实现对目标模块的共享)
程序装入的三种方式:绝对装入(在编译的时候就知道程序将要驻留的物理地址,编译程序产生含有物理地址的目标代码,这种方式不适合多道程序设计)、可重定位装入(根据内存当前的状况,将装入模块装入到内存的适当位置,地址变化通常在装入时一次完成,之后不再变,这种方式称为静态重定位,当操作系统为程序分配了一个以某地址为起始地址的连续主存区域后,重定位时将程序中的指令或者操作数的逻辑地址加上这个起始地址)、动态运行装入(允许程序运行时在内存中移动位置。把装入模块装入到内存后的所有地址都是相对地址,在程序执行过程中每当访问到相应指令或者数据的时候,才将程序或者数据的相对地址转换为物理地址。重定位过程是在程序执行期间随着指令的执行逐步完成的。该操作需要依靠硬件地址变换机构)。
内存保护:防止一个作业有意或无意地破坏操作系统或其他作业,常用的内存保护方法有界限寄存器和存储保护键方法。
交换与覆盖:覆盖(为了解决大作业小内存的矛盾,把一个大程序划分为一系列覆盖,