操作系统笔试⾯试基本内容
⼀、笔试内容
1、内核对象
定义:内核对象的数据结构只能被内核访问,因此应⽤程序⽆法在内存中找到这些数据结构并直接改变它们的内容。CreateFileMapping 函数可使系统能够创建⼀个⽂件映射对象。每个内核对象只是内核分配的⼀个内存块,并且只能由该内核访问。该内存块是⼀种数据结构,它的成员负责维护该对象的各种信息。有些(如安全性描述符、使⽤计数等)在所有对象类型中是相同的,但⼤多数数据成员属于特定的对象类型。
分类:存取符号对象、、⽂件对象、⽂件映射对象、I / O对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计时器对象等。
判别:若要确定⼀个对象是否属于内核对象,最容易的⽅法是观察创建该对象所⽤的函数。
2、临界区和互斥体的区别:
临界区只能⽤于对象在同⼀进程⾥线程间的互斥访问;互斥体可以⽤于对象进程间或线程间的互斥访问。
临界区是⾮内核对象,只在⽤户态进⾏锁操作,速度快;互斥体是内核对象,在核⼼态进⾏锁操作,速度慢。
临界区和互斥体在Windows平台都下可⽤;Linux下只有互斥体可⽤。
3、⼀个进程中所有线程共享的内容:地址空间,全局变量,打开⽂件,⼦进程,即将发⽣的报警,信号与信号处理程序和账户信息
每个线程⾃⼰的独有的内容:程序计数器,寄存器,堆栈,状态
创建进程:fork调⽤的⼀个奇妙之处就是它仅仅被调⽤⼀次,却能够返回两次,它可能有三种不同的返回值:
1)在⽗进程中,fork返回新创建⼦进程的进程ID;
2)在⼦进程中,fork返回0;
3)如果出现错误,fork返回⼀个负值;
在fork函数执⾏完毕后,如果创建新进程成功,则出现两个进程,⼀个是⼦进程,⼀个是⽗进程。在
⼦进程中,fork函数返回0,在⽗进程中,fork返回新创建⼦进程的进程ID。我们可以通过fork返回的值来判断当前进程是⼦进程还是⽗进程。
具体的fork分析过程请参考以下链接:/bastard/archive/2012/08/31/2664896.html 。主要介绍循环中的fork函数的具体调⽤情况。与此相关的⼀个是printf()函数。它的缓冲机制:系统仅仅是把该内容放到了stdout的缓冲队列⾥了,并没有实际的写到屏幕上。但是,只要看到有\n 则会⽴即刷新stdout,因此就马上能够打印了。运⾏了printf("fork!")后,“fork!”仅仅被放到了缓冲⾥;⽽运⾏printf("fork! \n")后,“fork!”被⽴即打印到了屏幕上,之后fork到的⼦进程⾥的stdout缓冲⾥不会有fork! 内容。
4、虚拟内存的基本思想是:
每个程序拥有⾃⼰的地址空间,这个空间被分割成多个块,每个块称作⼀页或者页⾯。每⼀页有连续的地址范围,这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运⾏程序。如果MMU(内存管理单元)注意到该页⾯没有被映射,于是使CPU陷⼊到操作系统,这个陷阱称为“缺页中断”。当发⽣缺页中断时,操作系统必须在内存中选择⼀个页⾯将其换出内存,以便为即将调⼊的页⾯腾出空间。对于先进先出(FIFO)页⾯置换算法⽽⾔,只需判断载⼊的页是否已存在即可,存在则为命中;否则将最先存储的页⾯淘汰,并将载⼊的页⾯存储进去(FIFO)。对于LRU页⾯置换算法⽽⾔,唯⼀的区别在于当载⼊的页已经存在,就将该页调到最上层。无法抹去的记忆
假设物理内存可以存储3页,即从第四项开始检查选择页前⾯的三项中是否包含当前页,如果没有则缺页,则根据FIFO算法置换页⾯;否则则为页⾯命中。若进程在内存中占3页,开始时内存为空,当执⾏以下访问页号序列后1,3,4,2,1,3,5,1,2,5,4,2,会产⽣3+6=9次缺页。
5、I/O设备⼤致可以分为两类:块设备和字符设备。
块设备把信息存储在固定⼤⼩的块中,每个块有⾃⼰的地址。块设备的基本特征是每个块都能独⽴于其他块⽽读写。硬盘,CD-ROM和USB盘是最常见的块设备。字符设备以字符为单位发送或接收⼀个字符流,是不可寻址的,也没有任何寻道操作。打印机、⽹络接⼝、⿏标都是字符设备。
I/O设备中的电⼦部件称作设备控制器或适配器,控制器的任务是把串⾏的位流转换成字节块,并进⾏必要的错误校正⼯作。每个控制器有⼏个寄存器⽤来与CPU进⾏通信。通过写⼊这些寄存器,操作系统可以命令设备发送数据、接收数据、开启或关闭,或者执⾏某些其他操作。通过读取这些寄存器,操作系统可以了解设备的状态,是否准备好接收⼀个新的命令等。
6、资源分为:可抢占资源和不可抢占资源。存储器就是⼀类可抢占的资源,CD盘是不可抢占资源。
资源死锁的四个条件:
1)互斥条件。每个资源要么已经分配给了⼀个进程,要么就是可⽤的。
2)占有和等待条件。已经得到某个资源的进程可以再请求新的资源,且如果因请求资源⽽阻塞时,对已获资源保持不放。
3)不可抢占条件。已经分配给⼀个进程的资源不能强制性被抢占,它只能被占有它的进程显式地释放
4)环路等待条件。死锁发⽣时,系统中⼀定有由两个或两个以上的进程组成的⼀条环路,该环路中的每个进程都在等待着下⼀个进程所占有的资源。
解决死锁的⽅法:qq如何禁言
1)鸵鸟算法----忽略问题
2)死锁检测和恢复
3)死锁避免----银⾏家算法
4)死锁预防----破坏资源死锁的四个条件
进程调度中"可抢占"和"⾮抢占"两种⽅式,哪⼀种系统的开销更⼤?可抢占式会引起系统的开销更⼤。
可抢占式调度是严格保证任何时刻,让具有最⾼优先数(权)的进程占有处理机运⾏,因此增加了处理机调度的时机,引起为退出处理机的进程保留现场,为占有处理机的进程恢复现场等时间(和空间)开销增⼤。
7、存储结构有(按照访问速度从快到慢排列):寄存器,⾼速缓存,内存,磁盘和磁带。CPU的⾼速缓存⼀般由RAM组成。
RAM和ROM的区别:
-domAccessMemory易挥发性随机存取存储器,⾼速存取,读写时间相等,且与地址⽆关,如计算机内存等,计算机关闭电源后其内的信息将不在保存,再次开机需要重新装⼊。-Read Memory只读存储器。断电后信息不丢失,如计算机启动⽤的BIOS芯⽚。存取速度很低,(较⽽⾔)且不能改写。⼀般⽤它存储固定的系统软件和字库等。
8、⽂件描述符表,⽂件表和v-node表的关系:
请参考以下链接:/zhaoyl/archive/2012/05/15/2502010.html
blog.chinaunix/uid-26430381-id-4200682.html
my.oschina/iuranus/blog/330397
9、X86体系结构在保护模式下有三种地址,它们的转换形式:虚拟地址(逻辑地址)先经过分段机制映射到线性地址,然后线性地址通过分页机制映射到物理地址。参考该⽂章:X86体系中保护模式下的内存访问机制_湛辉来。
10、Java的线程调度是基于优先级的抢先式调度,它总是选择⾼优先级的线程先执⾏。Thread提供了如下的基本线程控制⽅法:sleep (),线程暂停,让出CPU,使低优先级的线程运⾏;yield(),线程暂停,让出CPU,使同优先级的其他线程运⾏。如果不存在有机会运⾏的线程,yield()⽅法将直接返回,线程继续;join(),当前线程暂停,等待线程类对象运⾏结束。相同优先级的线程有可能采⽤分时调度也有可能是线程逐个运⾏,由具体JVM⽽定。
11、位⽰图是利⽤⼆进制的⼀位来表⽰磁盘中的⼀个盘块的使⽤情况。当其值为“0”时,表⽰对应的盘块空闲;为“1”时,表⽰已经分配。有的系统把"0"作为盘块已分配的标记,把“1”作为空闲标志。(它们的本质上是相同的,都是⽤⼀位的两种空闲和已分配两种情况。)磁盘上的所有盘块都有⼀个⼆进制位与之对应,这样,由所有盘块所对应的位构成⼀个集合,称为位⽰图。通常可⽤m*n个位数来构成位⽰图,并使
m*n等于磁盘的总块数。⽅便磁盘空间的管理。
12、进程死锁相关问题:
1)某系统中有11台打印机,N个进程共享打印机资源,每个进程要求3台。当N的取值不超过____时,系统不会发⽣死锁。
当每个进程都获得了2台打印机且系统中剩余打印机不少于1台时,系统不会发⽣死锁,即11-2N≥1,由此知N≤5。
2)某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发⽣死锁的最少资源数是____。
因系统中存在3个进程,且都需要同类资源4个,当系统中资源数等于10时,⽆论怎样分配资源,其中⾄少有⼀个进程可以获得4个资源,该进程可以顺利运⾏完毕,从⽽可以将分配给它的资源归还给系
统,其他进程也能顺利执⾏完成。若系统中资源数⼩于10,不妨设系统中有9个资源且每个进程都已获得3个资源,此时系统中已⽆空闲资源,当其中的任何⼀个进程再次申请资源时将进⼊等待状态,其他进程的情况类似,此时出现死锁。
13、中断问题
当⼀个I/O设备完成交给它的⼯作时,它就产⽣⼀个中断,它是通过在分配给它的⼀条总线信号线上置起信号⽽产⽣中断的。中断信号导致CPU停⽌当前正在做的⼯作并且开始做其他的事情。地址线上的数字被⽤做指向⼀个称为中断向量的表格的索引。
从中断事件的性质出发,中断可以分为两⼤类:
1)强迫性中断事件:包括硬件故障中断,程序性中断,外部中断和输⼊输出中断等。
2)⾃愿性中断事件:是由正在运⾏的进程执⾏⼀条访管指令⽤以请求系统调⽤⽽引起的中断,这种中断也称为"访管中断"。对OS提出某种服务要求时发⽣的发⽣的中断,也可以称为软中断。如请求I/O,请求分配外设等等。
硬件故障中断:机器发⽣故障时产⽣的中断,如电源故障、奇偶校验错等。
程序性中断:程序执⾏时发⽣了程序性质的错误或出现了某些特定状态⽽产⽣的中断,如溢出、地址错,指令跟踪,⽬态下使⽤特权指令等。
外部中断:中央处理机外部的⾮通道式装置引起的中断,如时钟中断、控制台中断。
输⼊/输出中断:外设或通道操作正常完成或发⽣某种错误时产⽣的中断。如传输结束、设备错误等。
⼀般情况下,优先级的⾼低顺序依次为:硬件故障中断、⾃愿中断、程序性中断,外部中断和输⼊输出中断。⾃愿中断的断点是确定的,是正在运⾏程序所期待的事件。⽽强迫性中断的断点可能发⽣在任何位置。
14、操作系统的功能:处理机管理,存储器管理,设备管理,⽂件管理和作业管理等。其中的处理机管理就是进程管理。
操作系统根据调度算法分为三类:
1)批处理操作系统:吞吐量,周转时间,CPU利⽤率批处理操作系统的主要优点是系统吞吐量⼤、资源利⽤率⾼。其缺点是交互能⼒较差、作业周转时间长。
2)交互式操作系统:响应时间,均衡性
3)实时性操作系统:满⾜截⽌时间,可预测性
实时操作系统的调度算法是抢占式的,因为要保证对事件的实时响应,需要事件响应进程及时获得CPU时间,采⽤抢占式调度算法可以保证优先级⾼的进程可以暂停优先级低的进⾏⽽⾃⾝获取CPU时间。
15、多线程的⼀些问题(两个线程,执⾏i++,i=0全局变量):
执⾏i++需要三个过程:
1)从内存读变量值到寄存器
2)寄存器的值加1
词人3)将寄存器的值写回内存
对于多线程的程序,访问冲突的问题是很普遍的,这回导致结果的不可预知性。
16、多进程多线程具体实现事宜:
1)join()⽅法可以等待⼦进程结束后再继续往下运⾏,通常⽤于进程间的同步。
2)ThreadLocal对象,每个Thread对它都可以读写对应属性,但互不影响。你可以把ThreadLocal对象看成全局变量,但每个属性
如local_school.student都是线程的局部变量,可以任意读写⽽互不⼲扰,也不⽤管理锁的问题,ThreadLocal内部会处理。可以理解为全局变
量local_school是⼀个dict,不但可以⽤local_school.student,还可以绑定其他变量。ThreadLocal 最常⽤的地⽅就是为每个线程绑定⼀个数据库连接,HTTP请求,⽤户⾝份信息等,这样⼀个线程的所有调⽤到的处理函数都可以⾮常⽅便地访问这些资源。
3)多进程的优点就是稳定性⾼,因为⼀个⼦进程崩溃了,不会影响主进程和其他⼦进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)。什么叫舍利
多进程的缺点是创建进程的代价⼤,在Unix/Linux系统下,⽤fork调⽤还⾏,在Windows下创建进程开销巨⼤。另外,操作系统能同时运⾏的进程数也是有限的,在内存和CPU的限制下,如果有⼏千个进程同时运⾏,操作系统连调度都会成问题。
多线程的优缺点分析:多线程模式通常⽐多进程快⼀点,但是也快不到哪去,⽽且,多线程模式致命的缺点就是任何⼀个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。在Wind面试技巧培训
ows上,如果⼀个线程执⾏的代码出了问题,你经常可以看到这样的提⽰:“该程序执⾏了⾮法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程。
4)切换作业是有代价的,⽐如从语⽂切到数学,要先收拾桌⼦上的语⽂书本、钢笔(这叫保存现场),然后,打开数学课本、找出圆规直尺(这叫准备新环境),才能开始做数学作业。操作系统在切换进程或者线程时也是⼀样的,它需要先保存当前执⾏的现场环境(CPU 寄存器状态、内存页等),然后,把新任务的执⾏环境准备好(恢复上次的寄存器状态,切换内存页等),才能开始执⾏。这个切换过程虽然很快,但是也需要耗费时间。如果有⼏千个任务同时进⾏,操作系统可能就主要忙着切换任务,根本没有多少时间去执⾏任务了,这种情况最常见的就是硬盘狂响,点窗⼝⽆反应,系统处于假死状态。
5)计算密集型任务及I/O密集型任务:
计算密集型任务的特点是要进⾏⼤量的计算,消耗CPU资源,⽐如计算圆周率、对视频进⾏⾼清解码等等,全靠CPU的运算能⼒。这种计算密集型任务虽然也可以⽤多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执⾏任务的效率就越低,所以,要最⾼效地利⽤CPU,计算密集型任务同时进⾏的数量应当等于CPU的核⼼数。Python这样的脚本语⾔运⾏效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好⽤C语⾔编写。
IO密集型,涉及到⽹络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的⼤部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越⾼,但也有⼀个限度。常见的⼤部分任务都是IO密集型任务,⽐如Web应⽤。IO密集型任务执⾏期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,⽤运⾏速度极快的C语⾔替换⽤Python这样运⾏速度极低的脚本语⾔,完全⽆法提升运⾏效率。对于IO密集型任务,最合适的语⾔就是开发效率最⾼(代码量最少)的语⾔,脚本语⾔是⾸选,C语⾔最差。
17、⽹络编程socket:
⽤TCP协议进⾏Socket编程在Python中⼗分简单,对于客户端,要主动连接服务器的IP和指定端⼝,对于服务器,要⾸先监听指定端⼝,然后,对每⼀个新的连接,创建⼀个线程或进程来处理。通常,服务器程序会⽆限运⾏下去。同⼀个端⼝,被⼀个Socket绑定了以后,就不能被别的Socket绑定了。
UDP的使⽤与TCP类似,但是不需要建⽴连接。此外,服务器绑定UDP端⼝和TCP端⼝互不冲突,也就是说,UDP的9999端⼝与TCP的9999端⼝可以各⾃绑定。
18、程序与进程的区别:
程序是指计算机指令的集合,以⽂件的形式存储在磁盘上,它是静态实体。
程序不能申请系统资源,也不能被系统调度,也不能作为独⽴的运⾏单位。
进程是⼀个正在运⾏的程序的实例,是⼀个程序在其⾃⾝的地址空间中的⼀次执⾏活动。
进程是资源申请、调度和独⽴运⾏的单位。
19、磁带上的⽂件,⼀般只能采取“顺序存取”的⽅式。
当⽤磁盘来存储⽂件时,可以不按顺序地读取⽂件中的字节或记录,或者按照关键字⽽不是位置来存取记录。这种⽅式读取⽂件称作“随机存取⽂件”。
所以磁盘的话,既可以随机存储,也可以顺序存储。
磁盘读取数据是以盘块(block)为基本单位的。
20、并⾏程序与并发程序的区别与联系:
春节作文600字初二并⾏是指两个或者多个事件在同⼀时刻发⽣;⽽并发是指两个或多个事件在同⼀时间间隔内发⽣。
21、Spooling技术
它是关于慢速字符设备如何与计算机主机进⾏数据交换的⼀种技术,通常⼜称假脱机技术。
利⽤这种技术可把独占设备转变成共享的虚拟设备,从⽽提⾼独占设备的利⽤率和进程的推进速度。
输⼊进程SPI是模拟脱机输⼊时的外围控制机,它将⽤户要求处理的数据从输⼊设备通过输⼊缓冲区再送到输⼊井(磁盘上开辟的⼀块区域),
当CPU处理这些数据数据时,就直接从输⼊井读⼊内存。
输出进程SPO是模拟脱机输出时的外围控制机,把⽤户要求输出的数据,先从内存送到输出井,待输出设备空闲时,
再将输出井中的数据通过输出缓冲区(内存中⼀块区域)传送到输出设备上。
实例——利⽤打印机实现打印机共享
1、当⽤户进程请求打印输出时,SPOOLING系统⽴即同意为该进程执⾏打印输出,但并不是真正地把打印机分配给该⽤户进程,⽽只是为该进程做两项⼯作:⼀项是由输出进程SPO在输出井中为之申请⼀个空闲的存储空间,并将要打印的数据传送其中存放;另⼀项⼯作就是由输出进程SPO再为⽤户进程申请⼀张空⽩的⽤户请求打印表,并将⽤户的打印请求填⼊其中,然后将该表挂到打印机的请求队列上。这时,如果还有另⼀个进程请求打印机时,则系统仍同意为该进程执⾏打印输出,当然,系统所做的⼯作仍是以上两项内容。
2、在打印机执⾏实际打印时,如果打印机空闲,输出进程SPO将从请求打印队列的队⾸取出⼀张打印表,根据打印表中的要求将要打印的数据从输出井传送到内存输出缓冲区,再传送到打印机打印。打印完后,输出进程SPO将再检查请求打印队列中是否还有待打印的请求表,若有则再取出⼀张请求打印表,将新的但因要求继续打印。如此反复,直到请求打印队列空为⽌,输出进程才将⾃⼰阻塞起来,并在下次再有打印请求时被唤醒。
可以啪的游戏22、DMA技术
DMA是指外部设备不通过CPU⽽直接与系统内存交换数据的接⼝技术。要把外设的数据读⼊内存或把内存的数据传送到外设,⼀般都要通过CPU控制完成,
如CPU程序查询或中断⽅式。利⽤中断进⾏数据传送,可以⼤⼤提⾼CPU的利⽤率。但是采⽤中断传送有它的缺点,对于⼀个⾼速I/O设备,以及批量交换数据的情况,
只能采⽤DMA⽅式,才能解决效率和速度问题。DMA在外设与内存间直接进⾏数据交换,⽽不通过CPU,这样数据传送的速度就取决于存储器和外设的⼯作速度。
通常系统的总线是由CPU管理的。在DMA⽅式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--⾼阻状态,⽽由DMA控制器接管,
控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。
23、sleep()与wait()的区别
一男一女牵手图片sleep⽅法属于Thread类中⽅法,表⽰让⼀个线程进⼊睡眠状态,等待⼀定的时间之后,⾃动醒来进⼊到可运⾏状态,不会马上进⼊运⾏状态,