《操作系统常见问题解答.docx》由会员分享,可在线阅读,更多相关《操作系统常见问题解答.docx(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统常见问题解答操作系统常见问题解答志艺,访问局部性(localiltyofreference)知足进程要求3,进程倾向于占用I/O4,使用基于最短剩余时间(shortestremainingtime)的调度机制5,减少页大小最先排出1和3选项,访问快慢、访问接口,对ldquo;错误rdquo;能够有什么影响?肯定是需要某种策略。仔细看题:ldquo;减少rdquo;,而不是ldquo;消除rdquo;,讲明这个ldquo;错误rdquo;不管怎么样,肯定是存在的;关键在于你能否理解ldquo;换页错误rdquo;的定义了。看看选项2和4都有点像;至于5嘛,不太像了mdash;mdash;
2、即便页面减少,错误率会降低吗?难讲,你可不知道系统实际运行时,数据大小、分布是什么样的:页面大,更可能将大数据块放在一页上;页面小,则会分散数据mdash;mdash;形象上是这么理解,但操作系统算法没这么费事,也没见过这方面的概率讨论,排除。我猜测的答案是2,由于被ldquo;错误rdquo;2字误导了:既然要减少错误嘛,ldquo;局部化rdquo;是很常用的策略,错误发生在局部就不至于影响全局.(归根结底还是不明白ldquo;换页错误rdquo;的定义)其实假如仔细想想,ldquo;局部化rdquo;能够降低错误的影响,但是它并不能降低错误的发生概率!剩下的答案就显而易见了。换页错误:P
3、ageFault是在进程尝试执行代码指导,或者引用进程所映射物理内存中并不存在的数据页时,操作系统记录的事件。换句话讲,进程需要的内存页实际上可能还处于物理内存中,但是由于它无法再分配到进程中,所以当进程将此页读取回到它的内存页时,就发生了PageFault。讲白了就是想在内存里找东西,却发现不存在(不得不重新读取.),按道理这不应该算ldquo;错误rdquo;这么严重吧(简单点,ldquo;不命中rdquo;罢了)。采用最短剩余时间调度机制:SRT算法(SPN算法的抢占式版本):总是选择剩余时间最短的进程运行为什么会减少换页错误呢?由于时间短的结束运行快,不需要频繁切换进程(导致刷新内存)
4、,所以换页错误发生的概率就减少了.(二)关于PV操作在计算机操作系统中,PV操作是进程管理中的难点。首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的经过),对信号量进行操作,详细定义如下:P(S):将信号量S的值减1,即S=S-1;假如S=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。V(S):将信号量S的值加1,即S=S+1;假如S0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。什么是信号量?信号量(semaphore)的数据构造为一个值和一个指
5、针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。一般来讲,信号量S=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因而S的值减1;当S0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因而S的值加1;若S=0,表示有某些进程正在等待该资源,因而要唤醒一个等待状态的进程,使之运行下去。利用信号量和PV操作实现进程互斥的一般模型是:进程P1进程P
6、2hellip;hellip;进程Pnhellip;hellip;hellip;hellip;hellip;hellip;P(S);P(S);P(S);临界区;临界区;临界区;V(S);V(S);V(S);hellip;hellip;hellip;hellip;hellip;hellip;hellip;hellip;其中信号量S用于互斥,初值为1。使用PV操作实现进程互斥时应该注意的是:(1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。(2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环
7、。(3)互斥信号量的初值一般为1。利用信号量和PV操作实现进程同步PV操作是典型的同步机制之一。用一个信号量与一个消息联络起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息能否到达,调用V操作发送消息。使用PV操作实现进程同步时应该注意的是:(1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,相互间通过什么资源(信号量)进行协调,进而明确要设置哪些信号量。(2)信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。(3)同一信
8、号量的P、V操作要成对出现,但它们分别在不同的进程代码中。(四)用于进程间通讯(IPC)的四种不同技术:1.消息传递(管道,FIFO,posix和systemv消息队列,信号量)2.同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和SystemV信号灯)3.分享内存区(匿名分享内存区,有名Posix分享内存区,有名SystemV分享内存区)4.经过调用(Solaris门,SunRPC)消息队列和经过调用往往单独使用,也就是讲它们通常提供了本人的同步机制.相反,分享内存区通常需要由应用程序提供的某种同步形式才能正常工作.解决某个特定问题应使用哪种IPC不存在简单的断定,应该逐步熟悉各种I
9、PC形式提供的机制,然后根据特定应用的要求比拟它们的特性.必须考虑的四个前提:1.联网的还是非联网的.IPC适用于单台主机上的进程或线程间的.假如应用程序有可能分布到多台主机上,那就要考虑使用套接字代替IPC,进而简化以后向联网的应用程序转移的工作.2.可移植性.3.性能,在详细的开发环境下运行测试程序,比拟几种IPC的性能差异.4.实时调度.假如需要这一特性,而且所用的系统也支持posix实时调度选项,那就考虑使用Posix的消息传递和同步函数.各种IPC之间的一些主要差异:1.管道和FIFO是字节流,没有消息边界.Posix消息和SystemV消息则有从发送者向接受者维护的记录边界(eg:
10、TCP是没有记录边界的字节流,UDP则提供具有记录边界的消息).2.当有一个消息放置到一个空队列中时,Posix消息队列可向一个进程发送一个信号,或者启动一个新的线程.SystemV则不提供类似的通知形式.3.管道和FIFO的数据字节是先进先出的.Posix消息和SystemV消息具有由发送者赋予的优先级.从一个Posix消息队列读出时,首先返回的总是优先级最高的消息.从一个SystemV消息队列读出时,读出者能够要求想要的任意优先级的消息.4.在诸多的消息传递技术mdash;管道,FIFO,Posix消息队列和SystemV消息队列mdash;中,可从一个信号处理程序中调用的函数只要read
11、和write(适用于管道和FIFO).比拟不同形式的消息传递时,我们感兴趣的有两种测量尺度:1.带宽(bandwidth):数据通过IPC通道转移的速度.为测量该值,我们从一个进程向另一个进程发送大量数据(几百万字节).我们还给不同大小的I/O操作(例如管道和FIFO的write和read操作)测量该值,等待发现带宽随每个I/O操作的数据量的增长而增长的规律.2.延迟(latency):一个小的IPC消息从一个进程到令一个进程再返回来所花的时间.我们测量的是只要一个1个字节的消息从一个进程到令一个进程再回来的时间(往返时间)在现实世界中,带宽告诉我们大块数据通过一个IPC通道发送出去需花多长时
12、间,然而IPC也用于传递小的控制信息,系统处理这些小消息所需的时间就由延迟提供.这两个数都很重要.(五)多进程和多线程的优缺点Linux内核对多进程和多线程的支持方式:线程机制支持并发程序设计技术,在多处理器上能真正保证并行处理。而在linux实现线程很十分,linux把所有的线程都当作进程实现。linux下线程看起来就像普通进程(只是该进程和其他进程分享资源,如地址空间)。上述机制与Microsoftwindows或是SunSolaris实现差异很大。Linux的线程实现是在核外进行的,核内提供的是创立进程的接口do_fork()。内核提供了两个系统调用_clone()和fork(),最终都
13、用不同的参数调用do_fork()核内API。do_fork()提供了很多参数,包括CLONE_VM(分享内存空间)、CLONE_FS(分享文件系统信息)、CLONE_FILES(分享文件描绘符表)、CLONE_SIGHAND(分享信号句柄表)和CLONE_PID(分享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用产生多进程时,内核调用do_fork()不使用任何分享属性,进程拥有独立的运行环境。当使用pthread_create()来创立线程时,则最终设置了所有这些属性来调用_clone(),而这些参数又全部传给核内的do_fork(),进而创立的rdquo;进程rdquo
14、;拥有分享的运行环境,只要栈是独立的,由_clone()传入。即:Linux下不管是多线程编程还是多进程编程,最终都是用do_fork实现的多进程编程,只是进程创立时的参数不同,进而导致有不同的分享环境。Linux线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创立、同步、删除等操作都在核外pthread库中进行。pthread库使用一个管理线程(_pthread_manager(),每个进程独立且唯一)来管理线程的创立和终止,为线程分配线程ID,发送线程相关的信号,而主线程pthread_create()的调用者则通过管道将请求信息传给管理线程。很多朋友都讲使用多线程的好处
15、是资源占用少,其隐含之意就是讲进程占用资源比线程多,对吧?但实际上Linux下多进程能否就真的点用很多资源呢?暂且不讲进程能否比线程占用资源多,就进程占用资源的多少情况而言,Linux确实是做得相当节省的。产生一个多进程时肯定是要产生的一点内存是要复制进程表项,即一个task_struct构造,但这个构造本身做得相当小巧。其它对于一个进程来讲必须有的数据段、代码段、堆栈段是不是全盘复制呢?对于多进程来讲,代码段是肯定不用复制的,由于父进程和各子进程的代码段是一样的,数据段和堆栈段呢?也不一定,由于在Linux里广泛使用的一个技术叫copy-on-write,即写时拷贝。copy-on-writ
16、e意味着什么呢?意味着资源节省,假设有一个变量x在父进程里存在,当这个父进程创立一个子进程或多个子进程时这个变量x能否复制到了子进程的内存空间呢?不会的,子进程和父进程使用同一个内存空间的变量,但当子进程或父进程要改变变量x的值时就会复制该变量,进而导致父子进程里的变量值不同。父子进程变量是互不影响的,由于父子进程地址空间是完全隔开的,变量的地址能够是完全一样的。Linux的rdquo;线程rdquo;和rdquo;进程rdquo;实际上处于一个调度层次,分享一个进程标识符空间,这种限制使得不可能在Linux上实现完全意义上的POSIX线程机制,因而诸多的Linux线程库实现尝试都只能尽可能实
17、现POSIX的绝大部分语义,并在功能上尽可能逼近。Linux的进程的创立是非常迅速的。内核设计与实现一书中甚至指出Linux创立进程的速度和其他针对线程优化的操作系统(Windows,Solaris)创立线程的速度相比,测试结果非常的好,也就是讲创立速度很快。由于异步信号是内核以进程为单位分发的,而LinuxThreads的每个线程对内核来讲都是一个进程,且没有实现rdquo;线程组rdquo;,因而,某些语义不符合POSIX标准,比方没有实现向进程中所有线程发送信号,README对此作了讲明。LinuxThreads中的线程同步很大程度上是建立在信号基础上的,这种通过内核复杂的信号处理机制的
18、同步方式,效率一直是个问题。LinuxThreads的问题,十分是兼容性上的问题,严重阻碍了Linux上的跨平台应用(如Apache)采用多线程设计,进而使得Linux上的线程应用一直保持在比拟低的水平。在Linux社区中,已经有很多人在为改良线程性能而努力,其中既包括用户级线程库,也包括核心级和用户级配合改良的线程库。目前最为人看好的有两个项目,一个是RedHat公司牵头研发的NPTL(NativePosixThreadLibrary),另一个则是IBM投资开发的NGPT(NextGenerationPosixThreading),二者都是围绕完全兼容POSIX1003.1c,同时在核内和核
19、外做工作以而实现多对多线程模型。这两种模型都在一定程度上弥补了LinuxThreads的缺点,且都是重起炉灶全新设计的。综上所述的结论是在Linux下编程多用多进程编程少用多线程编程。IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的criticalsection和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是讲linux不好,而且在经过实际编程之后,综合来看我觉得linux更合适做highperformanceserver,不过在多线程这个详细的领域内,linux
20、还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而windows从头就是多线程的。假如是UNIX/linux环境,采用多线程没必要。多线程比多进程性能高?误导!应该讲,多线程比多进程成本低,但性能更低。在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是讲,UNIX的进程调度效率是很高的。内存消耗方面,二者只差全局数据区,如今内存都很便宜,服务器内存动辄若干G,根本不是问题。多进程是立体交通系统,固然造价高,上坡下坡多耗点油,但是不堵车。多线程是平面交通系统,造价低,但红绿灯过多,老堵车。我们如今都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵
21、车。高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深入的,他们的意见应该具有很大的参考意义。块设备与字符设备区别系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等很多其他块设备。注意,它们都是以安装文件系统的方式使用的mdash;mdash;这也是块设备的一般访问方式。另一种基本的设备类型是字符设备。字符设备根据字符流的方式被有序访问,
22、像串口和键盘就都属于字符设备。假如一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,假如一个设备是随机(无序的)访问的,那么它就属于块设备。简单来讲,块设备能够随机存取,而字符设备不能随机存取,块设备通过系统缓存进行读取,不是直接和物理磁盘读取。字符设备能够直接物理磁盘读取。不经过系统缓存。(如键盘,直接相应中断)什么是虚拟内存?虚拟内存是计算机系统内存管理的一种技术。它使得应用程序以为它拥有连续的可用的内存(一个连续完好的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。别称虚拟存储器(VirtualMe
23、mory)。电脑中所运行的程序均需经过内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)缺乏时,则Windows会用虚拟存储器进行补偿。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为ldquo;分页文件rdquo;的空间中。将数据移入分页文件可释放RAM,以便完成工作。一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因此扩增RAM容量(可加内存条)是最佳选择。看了ldquo;操作系统常见问题解答rdquo;还想看:1.Windows操作系统常见故障解决方法汇总2.Windows7十大常见问题及解决方案3.操作系统常见驱动故障和解决方法4.Unix系统的十大常见故障及解决方法
限制150内