操作系统考试准备

操作系统考试准备
一、 名词解释
① 线程(Thread):操作系统能够进行调度的最小单位,被包含在进程之中,是进程中的实际的运作单位。一条进程是指进程中单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同任务。线程共享该进程中的全部系统资源,但同一进程中的多个线程有各自的调用栈、寄存器环境、本地存储。(来源维基百科)
② 进程(PROCESS):计算机中已运行程序的实体,包括程序、数据、中间结果和现场信息。(来源教材翻译+老师讲的)
③ MUTUAL EXCLUSION(互斥锁):应用于多线程编程中,防止两条线程对同一公共资源(比如全局变量)进行读写的机制。(来源:维基百科)
④ 临界区(critical section):对一块公共资源进行访问的代码。(来自维基百科)
⑤ 操作系统OS:管理计算机硬件、软件资源的计算机程序,同时也是计算机系统的内核与基石,需要处理如管理与配置内存、控制输入和输出、管理文件系统等基本事务,也提供一个让用户与系统交互的操作界面。(来源:维基百科)+广泛认可的操作系统的两大功能是作为裸机扩展和资源管理者(来源:书)
⑥ Race Condition(条件竞争):两个或多个进程读写某些共享数据,最后的结果取决于运行时的精确时序。(来源:上课)
⑦ 死锁(DEADLOCK):指操作系统的一种状态,当一个或多个进程等待系统资源,而资源又被进程本身或其他资源占用时,形成死锁。(来源:维基百科)/A set of processes  is deadlocked if each process in the set is waiting for an event that only another process in the set can cause.(来源:上课)
⑧ 系统调用(System CALLS):提供用户程序和操作系统之间的接口,运行在用户空间的程序向操作系统内核请求更高权限的服务。(来源:维基百科)(用于为用户提供系统服务,需要从用户态到内核态)
⑨ 多道程序(Multiprogramming):CPU一次在内存中装入多个程序,在一段时间内共享CPU分时执行,即并发执行。(来源:上课)
⑩ 物理地址(physical address):用于区分虚拟地址,尤其在用MMU转换内存的计算机中,指经过MMU转换后的地址(来源:维基百科)。
⑪ 虚拟内存:计算机存储管理的一种技术,它使得应用程序认为它用于连续可用的内存(一个连续完整的地址空间),实际上,它被分割为多个物理内存碎片,还有部分暂时存储在外部磁盘存储上,需要时进行数据转换。通过把“地址空间”定义为“连续的虚拟内存”欺骗程序(来源:维基百科)。
⑫ 忙式等待(BUSY WAITING):一种技术,让进程反复检查一个条件是否为真。(来源:维基百科)
⑬ BUFFERING(缓冲):用于解决CPU和IO设备间速度不匹配的矛盾,减少CPU的中断频率,使用缓冲技术在内存中开辟一个缓冲区用于临时存放IO数据。(来源:上课+同学+维基百科)
⑭ I-Node(i节点):在许多类UNIX文件系统中的一种数据结构,每个保存文件系统中的一个文件系统对象(包括目录、文件等)的元信息(如文件属性、所属磁盘块),但不包括其名字和真实的数据。(来源:维基百科+上课)/An inode is a data structure on a filesystem on Linux and other Unix-like operating systems that stores all the information about a file except its name and its actual data.
⑮ Monitor(管程):高级同步原语,是过程、变量、数据结构的集合,一模块或软件包的形式放在一起。任何时候只有一个进程在管城内部是ACTIVE的。(来源:上课+书)
⑯ 虚拟地址:在使用了MMU的系统中,MMU转换之前的地址,是在虚拟内存技术中,应用程序认为自己“拥有”的地址空间。(来源:自己总结)
⑰ 中断(Interrupt):处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意。(来源:维基百科)
⑱ 信号量(Semaphore):一种同步对象,新的数据类型,包括一个整型数和一个PCB的指针,取值非负。(来源:上课)
⑲ DEVICE DRIVER(设备驱动程序):每一个链接到操作系统的io设备需要设备特定的代码进行控制,这些代码就叫做设备驱动程序(来源:翻译书)
⑳ Relocation(重定位):程序装入内存时,从逻辑地址到物理地址的转换。
21 Atomic action(原子性操作):一段语句或代码,要么不执行,要么全部执行完。(来源:上课笔记)
22 Device Independence(设备无关):应用程序独立于具体的设备,童工设备共有个功能(书上我自己总结的)
23 RAID(磁盘列阵):由多个便宜的磁盘组成一个容量巨大的磁盘组。(来源:书)
24 Paging(分页):内存管理的一种技术,将程序分为大小相等的页,有些页在内存中,不需要时调出,有些页在外存中,需要时调入(来源:自己总结)。
25 Stable Storagr(稳定存储器):当收到写命令时,要么正确写,要么什么也不做,让现有数据完整保留。(来源:书)
26 Internal Fragmentation:内部碎片:内存中已经被分配但没被利用的内存空间。
二、 P&V操作、信号量、管程
① 信号量是一个同步工具,有两个操作,P&V(dowm&up),P(信号量)——将信号量值减一,若减一后信号量的值大于等于0,则进程进入临界区操作,否则,被阻塞到等待队列中,无法进入临界区,V(信号量)——将信号量的值加一,若队列中有进程等待,唤醒一个进程;P、V操作均是原子操作;
② 利用信号量解决一些问题(生产者消费者问题、读写者问题、哲学家就餐问题见书,下面通过生产者消费者问题说明如何使用信号量)
③ 生产者消费者问题:生产者向缓冲区中生产数据,如果缓冲区已经满,则生产者等待消费者取走;消费者从缓冲区取走数据,如果缓冲区是空的,那么消费者等待生产者生产数据。
从题中可以看出生产和消费者的具体过程如下:
(1) 生产者:判断缓冲区是否是满的,是,等待
否则,生产数据放入缓冲区
判断此时缓冲区是否为1,若是唤醒消费者


(2) 消费者:判断缓冲区是否为空,若是,等待
否则,从缓冲区取走一个数据,
判断此时缓冲区是否为N-1,若是,唤醒生产者。
从上面,可以明确看出,缓冲区是临界资源,不可同时被访问,因此要为他设置互斥访问的信号量,而“唤醒他人”在信号量中好像并没有体现,实际上,唤醒其实就是V操作,将在等待队列中的进程释放出来继续执行,如果我们引入一个counter作为缓冲区数据的计数,可以很容易进行上述过程,同时要注意counter的访问也是互斥的,有如下示范:
int counter=0;
semaphore mutex1=1;//访问缓冲区互斥;
semaphore mutex2=1;//访问counter互斥;
semaphpre full=0;//生产者等待队列
semaphore empty=0;//消费者等待队列
(1) 生产者:
P(mutex2);
if(counter==N) P(full);
P(mutex1)
insert_item();//生产数据
V(mutex1);
counter++;
if(counter==1) V(empty);
V(mutex2);
(2) 消费者
P(mutex2);
if(counter==0) P(empty);
P(mutex1);
remove_item();//取出数据
V(mutex1);
counter--;
if(counter==N-1) V(full);
V(mutex2);
  事实上,上面的代码完全可以保证生产者和消费者对缓冲区的访问是互斥的,同一时间只有一个生产者或消费者可以计入缓冲区生产/取走数据,同时也可以保证生产者和消费者是同步的,即生产者生产一个数据,消费者拿走一个,而不会产生错误(如消费者对一个数据拿了两次);但是有一种更加简单的方式,即为full和empty的初值做出一些改变,这样就能完成,修改后的代码如下:
semaphore mutex1=1;//访问缓冲区互斥;
semaphpre full=N;//生产者等待队列,含义是生产者可以生产的数量
semaphore empty=0;//消费者等待队列,含义是消费者可以取走的数量
(1) 生产者:
P(full);
P(mutex1)
insert_item();//生产数据
V(empty);
V(mutex1);;
(2) 消费者
P(empty);
P(mutex1);
remove_item();//取出数据
V(full);
V(mutex1);
事实上,没有特殊的需要时,我们不使用计数器(对计数器进行判断来确定是否等待,此时不用计数器,而用信号量。),我们使用信号量直接让其自动等待,方便又简单,而对于第一种表示,常常用于管程(Monitor)中,因为同一时间只有一个进程在管程中是Active的,即可以进入其中执行,即不需要设置对临界区的互斥访问,这时如果想让管程中的进程等待,使用的不是信号量,而是条件变量(Condition),让其等待,在选取一个在管程外的进程进入管程,唤醒同样,使用的是wait\signal操作,对于条件变量,由于他们没有初始值,所以无法像信号量那样有“计数”的作用,同时,也清醒的意识到,信号量的值只能通过P&V改变,既不能自己查看信号量的值,也无法通过人为的“++”改变,因此,在特殊情况下,即必须使用计数器时(无论计数器值是多少,进程都不等待,而是进行不同的操作),此时使用信号量没有意义,也会产生错误。
因此在管程(Monitor)中生产者消费者问题这样表示:
Monitor PRODUCE&CONSUME
begin 
int counter=0;
condition full,empty;
procedure insert_item()
begin
if(counter==N) then wait(full);
insert_iten();
counter++;
if(counter==1) then signal(empty);
end
procedure remove_item()
begin
if(counter==0) then wait(empty);
remove_item();
counter--;
if(counter==N-1) then signal(full);
end
end
生产者、消费者只需要分别调用inset_item()和remove_item()即可。
④ 实例:(不是很想打字和解释了,主要就是一个处理请求的进程,和多个工作线程,共同对请求数组进行访问,请求到来时,由处理请求的线程判断是否有工作进程,若有,唤醒他处理,否则,判断请求队列(其实是那个请求数组)是否满,若没满,放入,否则,拒绝请求。(此时可看出不可以省略工作线程的计数器,因为只用信号量必然有等待的情况,但是这里是进行不同的操作,同样,对于请求数组的计数器也不能用信号量省略)
工作线程:在执行完一个请求后,看请求数组中是否有请求,若有,继续处理请求数组中的请求,若没有,结束。
因此可以确定有以下几个变量:
int rc=0;//请求数组中请求的数目(最大为M)
int wc=N(N为空闲工作线程数目);//空闲工作线程的数目
semaphore rc1=1;//对rc访问互斥
semaphore wc1=1;//对wc访问互斥;
semaphore mutex=1;//对请求数组互斥访问
semaphore request=0;//用于处理请求的进程唤醒等待的工作进程
(1) 工作线程:
A. P(request);
B. <处理请求>
C. P(rc1);
D. if(rc==0) then
a) P(wc1);
b) wc++;
c) V(wc1);
d) V(rc1);
e) goto A;
E. else
a) rc--;
b) P(mutex);
c) <取出请求>;
d) V(mutex);
e) V(rc1);
f) <处理请求>;
g) goto C;
(2) 处理到来请求的进程
while(true){
P(wc1);
if(wc==0)then{
P(rc1);
if(rc==M) then <refuse>;
else{
P(mutex);
<插入请求>;
V(mutex);
rc++;)
V(rc1);}
else{
wc--;
V(request);}
  V(wc1);
}
}
 
(计算题三个字忽略),取优先级最高的请求即可。
对于用管程实现,只需要把临界区访问的信号量都去掉,保留request条件变量即可。
三、 计算题
(1) 资源+进程,使用银行家算法计算是否有安全序列。
(2) 作业到达时间和所需运行时间已给出,按照算法先来先服务、最短作业有限的原则计算作业的开始时间、结束时间和周转时间。
(3) 页式虚拟内存管理,要访问的逻辑序列:XXX….分配给该进程的主存空间共XX字节,每个页的大小是XXX字节,按不同的调度算法计算却也次数、淘汰页号,缺页中断率。
(4) 磁臂调度算法计算磁头移动量。
四、 本次考试中出现的不确定题
1. 批处理操作系统的优点、不追求的;
2. 缺页中断处理的过程。
3. 通道和DMA的区别。
4. 页内碎片和内存碎片的区别。
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值