您的位置:首页 > 其它

操作系统查漏补缺

2018-01-15 16:34 218 查看
进程的描述与控制

进程的描述

定义:程序+PCB(进程控制块)+数据集合,是系统资源分配的最小单位。
目的:为了使程序并发执行,并能对其加以描述和控制。
特征:动态性、并发性、独立性、异步性。
三种基本状态:就绪态、运行态、阻塞态

        进程的同步

同步方式:临界区、互斥区、信号量、事件、管程
临界区:在每个进程中访问临界资源的代码称为临界区;在进入临界区之前,对临界资源进行观察,观察是否被访问。
管程:java虚拟机的方法级和方法内部的同步就使用了管程。  定义:定义了个数据结构和能为并发进程在该数据结构上的一组操作,这组操作能同步进程和改变管程中的数据。即 管程是OOP的思想,将临界资源抽象为一组数据结构;将对资源的操作抽象为一个方法。
管程和进程的区别:(1)管程是共享数据结构,如消息队列;进程是私有的;(2)管程是为了解决共享资源互斥问题,进程是为了实现系统的并发性。(3)管程是被动工作,即进程进入管程访问临界区资源;进程是主动工作。(4)进程拥有动态性和并发性,而管程则没有。
同步遵循的规则:空闲让进、忙则等待、有限等待、让权等待
出现死锁的情况:必须同时满足四条,互斥条件、请求与保持、循环等待、不可剥夺资源
避免死锁的算法:银行家算法+安全性算法
进程通信方式

主要有四大类:共享存储区、管道通信、消息传递、客户-服务器模型
管道:用于连接一个写进程-读进程的并实现它们之间的通信的文件,又名pipe。提供互斥、同步以及确认对方是否存在。
C/S模型,最核心的就是套接字。基于文件型的套接字类似于管道,基于网络的套接字就和平常我们说的一致。
   

线程相关

定义:系统调度和分配的最小单位
目的:和进程类似,为了OS有更好的并发性。
和进程的区别:(1)进程是最小的可拥有资源的独立单位,换言之,线程并没有独立的资源。(2)并发性:进程之间能并发执行;同一进程的多个线程也能并发执行。(3)切换:进程在切换时消耗的资源大于线程;但一个进程崩溃不会影响其他进程;而一个线程崩溃则隶属于的整个进程拉闸。(4)独立性:进程拥有自己的PCB数据结构,是独立的;而线程是共享进程的资源,谈不上什么独立性。
线程的实现方式:(1)内核态线程  (2)用户态线程 (3)二者混用
java线程间通信方式:线程不独立占有资源,所以线程间进行通信主要就是为了同步(1)互斥锁 (2)信号量 (3)对于读写进程单向的管道 (4)wait/notify (5)临界区也算上一个吧

调度算法

先来先服务(FCFS):最简单的,顾名思义,哪个进程先到就先服务哪个。
短作业优先(SJF):属于优先级调度算法的一种,以作业长度为优先级判定。 缺点:(1)对长作业非常不利 (2)人机无法进行交互 (3)没有考虑每个作业的紧迫程度
高响应比优先:结合了FCFS和SJF,本质上你我觉得还是优先级算法。

进程调度
进程调度的任务:(1)保存CPU当前的现场信息,如程序计数器、通用寄存器中的内容,将断点信息保存到PCB中。(2)选取下一个执行的进程,改为运行态 (3)将CPU分配给进程,并让其从上次断点处开始运行,把断点信息装入寄存器中。
组成部分:(1)排队器 (2)分配器 (3)上下文切换器 
调度方式:(1)协同式  (2)抢占式
抢占式调度:(1)RR时间片轮转 (2)优先级调度算法 (3)多级反馈队列调度算法
内存分区分配方式

单一连续分配
固定分区分配
动态分区分配(可变分区分配):(1)基于顺序搜索分配算法 (2)基于索引分配算法

基于顺序搜索:(1)首次适应算法 (2)循环首次 (3)最佳适应算法 (4)最坏适应算法 
首次适应算法(FF):从可分配内存的链首开始寻找,找到一个可以用的内存空间,装进去,OK。  缺点:大量碎片
循环首次:不是从链首了,而是从上一次找到的空闲分区的下一个开始。
最佳适应:找到一个和需要内存大小相近的空间,装进去。  缺点:大量碎片
最坏适应:找最大的内存空间,寅吃卯粮。   优点:查找效率高,碎片少。
基于索引分配:(1)快速适应 (2)伙伴系统 (3)哈希算法
动态可重定位分配:(1)相对于动态分区分配多一个“紧凑”,即碎片整理功能。

页面置换算法

最佳置换算法:这个东西实际应用中实现不了,但是可以作为一个检验性能的标杆。核心就是,观察已经存入的内存页面,将最长时间(未来)不再访问的页面换出。而实际应用中,我们明显无法预测到未来,到底是个什么情况。
先进先出FIFO:啥都有它,不介绍了
最近最久未使用置换算法LRU:顾名思义,就是将内存中最近最久没有使用的页面置换出去。   操作系统中实现它使用了寄存器和,这个栈很精髓,编程实现的话要用这个。用栈保存当前使用各个页面的页号,每当进程访问某页面 的时候,便将该页面的页号从栈中移除并压入栈顶,因此,栈顶始终是最新被访问页面的页号,栈底是最久未使用的页号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息