操作系统的四个特性
(1) 并发:是指多个事件在同一时间间隔内发生,指操作系统具有在同一时间间隔内处理和调度多个程序同时执行的能力。
(2)共享:指系统中的资源可以被多个并发执行的程序共享,,而不是独占。
(3)异步:在多道程序环境下,允许多个程序并发执行。但由于资源有限,进程的执行不是一贯到底,而是走走停停,已不可预知的速度向前推进,这就是进程的异步性。异步性使得操作系统运行在一种随机的环境下,可能导致进程产生与时间有关的错误。
但只要运行环境相同,操作系统必须保证多次运行进程,都获得相同的结果。
(4)虚拟:把物理上的一台设备变成逻辑上的多台设备。
操作系统的主要功能
1.处理器管理:完成对处理器的分配,通过各种算法来确定某个时刻的处理器分配给哪个进程使用。
2.存储管理:管理数据和程序的存放
3.文件管理:负责对文件的存储、检索、更新、保护等
4.设备管理:计算机系统中配有各种各样的外部设备。操作系统的设备管理功能采用统一管理模式,自动处理内存和设备间的数据传递,从而减轻用户为这些设备设计输入输出程序的负担。
进程: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源调度和分配的基本单位
①特征
(1)动态性:进程是动态产生并消亡的
(2)并发性:任何进程都可以同其他进程一起并发执行
(3)独立性:进程是一个能 独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
(4)异步性:进程具有执行的间断性,按各自独立的、不可预知的速度向前推进,进程何时执行、何时终止等都是未知的
②状态
(1)就绪状态:当进程已分配到除了CPU以外的所有必要资源,只要获得处理器的使用权限便可立即执行
(2)执行状态:当进程已经获得处理器,程序在处理器上运行时的状态.
(3)阻塞状态: 正在执行的进程由于等待某个事件、资源而无法执行时便放弃处理器从而处于阻塞状态.
状态转换
(1) 就绪 -> 执行:处于就绪状态的进程获得了处理器的分配后进程就由就绪转成执行状态。
(2)执行 -> 就绪:处于执行状态的进程因分配给其的时间片用完而不得不让出处理器,于是从执行转成就绪状态。
(3)执行 -> 阻塞:正在执行的进程因为等待某种事件发生而无法继续执行时便从执行状态转成阻塞状态。
(4)阻塞 -> 就绪:处于阻塞状态的进程若其等待的事件已经发生,就可以等待处理器的分配来执行了 这时从阻塞状态转成就绪装固态.
进程和线程的区别
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位。
线程:单个进程中执行中的每个任务就是一个线程,它相当于一种轻量级的线程,线程是进程中执行运算的最小单位.就是说1个线程只能属于一个进程,但是一个进程可以拥有多个线程。
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。线程没有地址空间,线程包含在进程的地址空间当中。 jvm(线程私有的程序计数器、虚拟机栈、本地方法栈),
进程通信方式:
1.管道通信 .
是指用于连接一个读进程和一个写进程来实现它们之间通信的一个共享文件。 处于内存当中,半双工,具有固定的读端和写端,只能用于具有亲缘关系的进程间通信。
2.共享内存通信
3.消息传递系统
4.Socket套接字通信.
进程同步的方式
1.信号量:用于进程间传递信号的一种机制,可进行PV初始化的原子操作。 P用来阻塞进程,V用来解除阻塞的一个进程。
PV操作大量分散在各个进程当中,不易管理易死锁。
2.管程: 将共享变量及对共享变量能够进行的所有操作集中在一个模块中。
(把信号量及其操作原语“封装”在一个对象内部)管程保证同一时间只有一个进程处在管程内部的方法内。
- 任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;
就如同使用临界资源,就要先通过其信号量的申请。 - 任何时刻,仅允许一个进程在管程中执行某个内部过程。
3.消息队列
用户态和内核态的区别:
操作系统的两种CPU状态
内核态:运行操作系统程序
用户态:运行用户程序
指令划分:
特权指令:只能操作系统使用,用户程序不能使用的指令。(启动IO、内存清零, 修改程序状态字、设置时钟)
非特权指令:用户程序可以使用的指令 (控制转移、算数运算、取数指令、访管指令)
处于用户态时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的;
处于核心态的进程,则能访问所有的内存空间和对象,且其所占有的处理机是不可被抢占的。
三种导致用户态切到内核态的情况
(1)系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如前例中fork()实际上就是执行了一个创建新进程的系统调用。
而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
2)异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
3)外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,
如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者彼此通信而造成的一种阻塞的现象,此时称系统处于死锁状态,永远在相互等待的进程称为死锁进程。
死锁的产生的4个必要条件
(1)互斥条件:指进程对所分配到的资源进行排他性的使用,某段时间内资源只能由一个进程使用。如果此时还有其他进程请求资源,那么请求者只能等待直至占有该资源的进程释放资源。
(2) 请求和保持:指进程持有了至少一个资源后,又提出了新的资源请求,而该资源又已经被其他资源占有。此时请求进程阻塞, 但是又不释放自己持有的资源。
(3)不剥夺条件:进程已获得的资源在未使用完之前不能被剥夺,只能使用完后由自己释放。
(4) 循环等待:存在一种进程资源的循环等待链,导致它们逐一等待下一个进程所持有的资源。
死锁产生的原因:当系统中进程共享的资源不足以供各个进程使用时会引发对资源的竞争而产生死锁。
打破4个必要条件:
互斥:改造资源的独占性质
请求和保持:使用资源预先分配策略,进程运行前申请全部资源,满足则运行,不满足则等待。
不可剥夺:当一个进程申请其他资源无法满足时释放自己占有的资源
循环等待:实现资源有序分配策略,所有进程按序号递增的形式申请资源
进程调度算法
先来先服务(FCFS)调度算法
该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。
短作业优先调度算法
短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。短作业优先(SJF)调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法,则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。
优先级调度算法
优先级调度算法又称优先权调度算法,该算法既可以用于作业调度,也可以用于进程调度,该算法中的优先级用于描述作业运行的紧迫程度。
在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最髙的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
根据新的更高优先级进程能否抢占正在执行的进程,可将该调度算法分为:
- 非剥夺式优先级调度算法。当某一个进程正在处理机上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在运行的进程继续运行,直到由于其自身的原因而主动让出处理机时(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
- 剥夺式优先级调度算法。当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。
而根据进程创建后其优先级是否可以改变,可以将进程优先级分为以下两种:
- 静态优先级。优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
- 动态优先级。在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据为进程占有CPU时间的长短、就绪进程等待CPU时间的长短。
时间片轮转调度算法
时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。
在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。如果时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算法。如果时间片很小,那么处理机将在进程间过于频繁切换,使处理机的开销增大,而真正用于运行用户进程的时间将减少。因此时间片的大小应选择适当。
时间片的长短通常由以下因素确定:系统的响应时间、就绪队列中的进程数目和系统的处理能力。
多级反馈队列调度算法(集合了前几种算法的优点)
多级反馈队列调度算法的实现思想如下:
- 应设置多个就绪队列,并为各个队列赋予不同的优先级,第1级队列的优先级最高,第2级队列次之,其余队列的优先级逐次降低。
- 赋予各个队列中进程执行时间片的大小也各不相同,在优先级越高的队列中,每个进程的运行时间片就越小。例如,第2级队列的时间片要比第1级队列的时间片长一倍, ……第i+1级队列的时间片要比第i级队列的时间片长一倍。
- 当一个新进程进入内存后,首先将它放入第1级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第2级队列的末尾,再同样地按FCFS 原则等待调度执行;如果它在第2级队列中运行一个时间片后仍未完成,再以同样的方法放入第3级队列……如此下去,当一个长进程从第1级队列依次降到第 n 级队列后,在第 n 级队列中便釆用时间片轮转的方式运行。
- 仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;仅当第1 ~ (i-1)级队列均为空时,才会调度第i级队列中的进程运行。如果处理机正在执行第i级队列中的某进程时,又有新进程进入优先级较高的队列(第 1 ~ (i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i级队列的末尾,把处理机分配给新到的更高优先级的进程。
页面置换算法:
(1) 最佳置换算法
每次选择未来长时间不被访问或者以后永远不访问的页面进行淘汰
计算时首先需要给出一个页面访问序列:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1,然后需要获取进程分配的物理块个数
如果是3块程序运行时,先将7,0,1三个页面装入内存。
之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最佳置换算法,因为页面7要在第18次才能访问,页面0在第5次访问,页面1在第14次访问,页面7最久不被使用,所以将页面7淘汰;
当进程0要访问时,因为它已存在在内存所以不必产生缺页中断;
当页面3要访问时,又引起缺页中断淘汰1。
- 缺点:最佳置换算法是一种理想化算法,具有较好的性能,但是实际上无法实现(无法预知一个进程中的若干页面哪一个最长时间不被访问);
- 优点:最佳置换算法可以保证获得最低的缺页率
(2) 先进先出页面置换算法
特点
- 优点:先进先出算法实现简单,是最直观的一个算法
- 缺点:先进先出的性能最差,因为与通常页面的使用规则不符合,所以实际应用少
(3) 最近最久未使用置换算法(LRU)
特点
- 优点:由于考虑程序访问的时间局部性,一般能有较好的性能;实际应用多
- 缺点:实现需要较多的硬件支持,会增加硬件成本
虚拟内存:
(1) 一次性:传统内存管理的话他需要作业一次性全部装入内存后才能开始运行,
(2)驻留性:作业被装入内存后就一直驻留在内存当中,任何部分不会被换出直至作业运行结束。
导致的问题:许多在程序运行中不用或暂时不用的程序(数据)占据了大量的内存空间,而一些需要运行的作业又无法装入运行,显然浪费了宝贵的内存资源。
要了解虚拟内存技术原理就必须要了解计算机中著名的局部性原理。
时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
基于局部性原理在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。
https://blog.youkuaiyun.com/u014590757/article/details/80452618 分页和分段的内存管理方式参考