本文共 6206 字,大约阅读时间需要 20 分钟。
把逻辑地址转变为内存物理地址的过程称作( 重定位)。
1.什么是系统调用?系统调用与一般用户程序,库函数和实用程序又有什么区别?
系统调用是操作系统提供给编程人员的唯一接口。编程人员利用系统调用在源程序级动态请求和释放系统资源,调用系统中已有的系统功能来完成那些与机器硬件部分相关的工作以及控制程序的执行速度等。 与一般用户程序,库函数和实用程序的主要区别是:系统调用程序在核心态运行,调用它们需要一个类似硬件中断处理的中断处理机制提供系统服务。2 . 简述进程调度与作业调度的不同之处。
(1)作业调度是宏观调度,它决定了哪一个作业能进入主存。进程调度是微观调度,它决定各作业中的哪一个进程占有中央处理机。(2分)(2)作业调度是选符合条件的收容态作业装入内存。进程调度是从就绪态进程中选一个占用处理机。(2分)
进程调度中“可抢占”和“非抢占”两种方式,哪一种系统的开销更大?为什么?
答 可抢占式会引起系统的开销更大。(2分)
可抢占式调度是严格保证任何时刻,让具有最高优先数(权)的进程占有处理机运行,因此增加了处理机的调度,引起为退出处理机的进程保留现场,为占有处理机的进程恢复现场等时间(和空间)开销增大。(2分)
3.简述分区存储管理的主要优缺点。
优点:(1)实现了多个作业或进程对内存的共享,有助于多道程序设计,提高系统的资源利用率。(2)该方法要求的硬件支持少,管理算法简单,实现容易。(2分)缺点:(1)内存利用率不高,存储器中可能含有从未使用的信息和碎小空闲区。(2)作业或进程的大小受分区大小控制。(3)难以实现各分区间的信息共享。
作业调度和进程调度的区别是什么???
响应比 R = (等待时间+ 执行时间)/执行时间
时间片轮转调度算法在实际中也是按照先来先服务顺序使用时间片的,时间片过大,我们认为他转变为先来先服务算法了
.多级反馈队列调度机制
设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先。第一个队列的优先级最高,第二个次之,其余队列的优先级逐个降低。该算法为不同列中的进程所赋予的执行时间片的大小也各不相同,在优先级愈高的队列中,其时间片愈小。
每个队列都采用FCFS算法。当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则,即它在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度;如果它在第二队列中运行个时间片后仍未完成, 再依次将它放入第三队列…依此类推。当进程最后被降到第n队列后,在第n队列中便采取按RR方式运行。
按队列优先级调度。调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行;仅当第1到(i-1)所有队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第i队列的末尾,而把处理机分配给新到的高优先级进程。
PCB设计
设计结构体PCB,其中包括进程的标识符,到达时间,服务时间,完成时间,周转时间和带权周转时间。利用动态数组将所有进程存储起来。
struct PCB{ int ID; //标识符int ComeTime; //到达时间int ServerTime; //服务时间int FinishTime; //完成时间int TurnoverTime; //周转时间double WeightedTurnoverTime; //带权周转时间};
typedef struct { int value; proccess *L;}semaphorevoid wait(semaphore s) { s.value -- ; if (s.value<0) { //如果 value<0 表明资源分配完了,要注释这个进程,放弃处理机 add (s.L,proccess_of this); block(s.L); }}void signal(semaphore s) { s.value ++; if (s.value<=0) { //若value<=0,还有进程在等待该资源被阻塞,唤醒第一个等待的进程 proccess p = remove(s.L); //从等待队列移除一个 进程,然后唤醒 wakeup(p); }}
我们把 wait 和 signal 简称为 PV 操作,P减,V 加
semaphore plate=1,apple=0,orange=0;void dad() { while(true) { P(plate); apple_count++; V(apple); }}void mom() { while(true) { P(plate); orange_count++; V(orange); }}void son() { while(true) { P(orange); orange_count--; V(plate); eat_orange(); }}void daughter() { while(1) { P(apple),apple_count--,V(plate); eat_apple(); }}
int io_read_count=0;semaphore var_mutex=1, file_mutex=1;//分别保护 read_count 变量 和 文件的读写互斥访问write() { while(1) { P(file_mutex),io_write(),V(file_mutex); }}read() { while(1) { P(var_mutex); if(io_read_count==0) P(file_mutex); io_read_count++; V(var_mutex); read_file(); P(var_mutex); io_read_count--; //记得让写进程通过 if(io_read_count==0) V(file_mutex); V(var_mutex); }}
5个哲学家,每个人都要两个筷子才能吃饭
semaphore chopstic[5]={ 1,1,1,1,1};semaphore mutex=1;void pi() { do { P(mutex); P(chopstic[i]); P(chopstic[(i+1)%5]; eat(); V(chopstic[1]); V(chopstic[(i+1)%5]; think(); }while(1);}
总结几种方法:
基本方法:
2. 软件实现: 单标志,双标志先检查,后检查,皮特森算法 3. 硬件实现: 1.中断屏蔽,硬件指令 4. 信号量死锁避免和死锁预防的区别在于,死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁.死锁避免是在系统运行过程中注意避免死锁的最终发生.
简单的来说: 死锁预防是破坏了 4个必要条件 之一【互斥,不可剥夺,请求保持,循环等待】 死锁的避免 则是即便出现了 4个必要条件,通过一定的算法,让程序不死锁去破坏产生死锁的四个必要条件的一个或多个条件,来预防发生死锁。易实现,被广泛使用,但由于所施加的限制条件往往太严格,因而可能导致系统资源利用率和吞吐量降低。
而不需事先采取各种限制措施去破坏产生死锁的四个必要条件。这种方法施加的限制条件较弱,但在实现上有一定的难度。
简记: 预防的语意 大于 避免
所以并发性来看, 避免 > 预防设系统有这几种解决死锁的方法;
从并发性的角度去分析这几种方法
答: 银行家算法是避免死锁, 资源预先分配是预防死锁,死锁检测是出了事 之后再解决 所以 从并发性的角度排序: 死锁检测 > 资源银行家算法 > 资源预分配每个进程都有自己独立的进程空间,若一个进程在运行时所产生的地址在地址空间之外,则发生地址越界,因此需要进行界地址保护,即当程序要访问某个内存单元的时候,由硬件检查是否允许,如果允许,则执行,否则发生越界中断
最佳适配算法: 每次作业分配内存空间时候,总能找到满足空间大小需要的最小空闲分区给作业,可以产生最小的内存空闲分区。
段式分配中,cpu 取一次数据,需要访问两次内存 【1. 通过段表获得物理地址再访问内存】
段页式存储管理中,CPU取数据访问内存3次 【1.找段表,2.找页表. 3. 取数据】
如果存储器采用基本分页机制,那么操作系统会为每个进程或任务建立一个页表(这个页表可能是一级的也可能是多级的)。整个操作系统中有多个进程在运行,那么系统就会有多个页表。页表在内存中的存储位置由寄存器CR3给出。
如果存储器采用基本分段机制,那么操作系统会为每个进程或任务建立一个段表(一般不用多级),用于记录数据段、代码段等各类段在内存中的具体位置。
如果采用段页式结合的机制,那么一般一个进程或任务,操作系统会给其建立一个段表,而段表中的每个段又会对应一个页表,也就是说,段页式机制的每个进程有一个段表,有多个页表。
1. 外部碎片,2.内部碎片
内部碎片是已经被分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片
外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。
什么是缺页中断? 虚拟存储技术将一个作业多次调入内存,实现虚拟内存需要建立在离散分配内存管理方式的基础上。
当用户程序访问部分尚未调入内存中,则产生中断, 中断是一种信号,去通知 CPU 将磁盘数据调入内存缺页中断机构,如果内存中没有足够的内存空间【没有空闲块】,就需要用淘汰算法,将部分内存也 写到外存
注意原理:
lru 算法基于局部性原理 调出最近最长时间没被使用的 clock 算法 又 叫 nru 算法,调出最近没被使用的页数据导致 LRU 算法实现起来耗费高的原因是 需要对所有的页进行排序
belady 现象:
在分页式虚拟存储器管理中,发生缺页时的置换算法采用FIFO(先进先出)算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。刚刚换入外存的,又立刻换入内存,然后反复循环,反复的 IO 降低了系统效率
怎么解决? 这种 java 的 ArrayList 也有相关的问题 比如 数组满了,就申请 1.5倍的空间,然后复制过去 那什么时候缩小容量呢?虚拟内存只能用于非连续分配技术
有3中实现方式: 请求分页存储管理,请求分段存储管理,请求段页式存储管理请求分页存储管理和 分页存储管理的区别: 前者不需要一次性将作业调入内存,而是使用了虚拟技术
系统有一个 open count,以记录多少进程打开了该文件。每个关闭操作使 close 让 count 递减,当打开计算器为0的时候,文件不再被使用,系统回收分配给该文件的内存空间等资源。
若文件被修改过,则将文件写回外存,并将系统打开文件表中相应条目删除,最后释放文件控制块 (File control block ,FCB)转载地址:http://eyyzi.baihongyu.com/