操作系统面试难点

上传人:ji****72 文档编号:45771286 上传时间:2018-06-19 格式:PDF 页数:17 大小:468.52KB
返回 下载 相关 举报
操作系统面试难点_第1页
第1页 / 共17页
操作系统面试难点_第2页
第2页 / 共17页
操作系统面试难点_第3页
第3页 / 共17页
操作系统面试难点_第4页
第4页 / 共17页
操作系统面试难点_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《操作系统面试难点》由会员分享,可在线阅读,更多相关《操作系统面试难点(17页珍藏版)》请在金锄头文库上搜索。

1、目录: 1. 进程的有哪几种状态,状态转换图,及导致转换的事件。 2. 进程与线程的区别。 3. 进程通信的几种方式。 4. 线程同步几种方式。 5. 线程的实现方式. (用户线程与内核线程的区别) 6. 用户态和核心态的区别。 7. 用户栈和内核栈的区别。 8. 内存池、进程池、线程池。 9. 死锁的概念,导致死锁的原因,导致死锁的四个必要条件,处理死锁的四个方式,预防死锁的方法、避免死锁的方法。 10. 进程调度算法。 11. Windows内存管理的方式(块式、页式、段式、段页式). 12. 内存连续分配方式采用的几种算法及各自优劣。 13. 动态链接及静态链接. 14. 基本分页、请求

2、分页储存管理方式。 15. 基本分段、请求分段储存管理方式。 16. 分段分页方式的比较各自优缺点。 17. 几种页面置换算法,会算所需换页数。(LRU用程序如何实现?) 18. 虚拟内存的定义及实现方式。 19. 操作系统的四个特性。 20. DMA。 21. Spooling。 22. 外存分配的几种方式,及各种优劣。 操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。 操作系统上运行的计算机程序通常由

3、一个或一组进程组成。因此,本文便从进程开始说起! 1.进程的有哪几种状态,状态转换图,及导致转换的事件。 程序员的自我修养(1)操作系统篇 - 第1张 | 快课网 如上图所示,进程包括三种状态:就绪态、运行态和阻塞态。详细说明如下: 注意:创建和退出不是进程的状态。阻塞也叫等待,等待和就绪的区别:等待是等待除CPU以外的资源,而就绪等待的是CPU资源。 1)就绪执行:对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态; 2)执行等待:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为等待状态,如进程提出输入/输出

4、请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等; 3)等待就绪:处于等待状态的进程,在其等待的事件已经发生,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态; 4)执行就绪:正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。 2.进程与线程的区别。

5、 详见快课之前分享的文章: 进程与线程的图文描述 进程和线程的区别 3.进程通信的几种方式。 以linux操作系统为例(window也类似),linux下进程间通信方式如下: 1管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 2信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数si

6、gaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数); 3报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 4共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥

7、。 5信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 6套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。 4.线程同步几种方式。 线程同步的方式主要有以下四种:临界区(CriticalSection)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别。 他们的主要区别和特点如下: 1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意

8、时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。 2)互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。 3)信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。 4)事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程

9、的优先级比较的操作。 5.线程的实现方式.(换种方式说即:用户线程与内核线程的区别) 线程的实现可以分为两类:用户级线程(User-LevelThread)和内核线线程(Kernel-LevelThread),后者又称为内核支持的线程或轻量级进程。在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程。 用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包

10、括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。 内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。 以下是用户级线程和内核级线程的区别: 1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。 2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。 3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内

11、核支持线程执行系统调用指令时,只导致该线程被中断。 4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。 5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。 6.用户态和核心态的区别。 在讲述用户态和核心态的区别之前,我们先要说说“特权级”的概念。 熟悉Unix/Linux系统的人都知道,我们创建一个子进程时,是通过调用fork函数来实现的。事实上,fork的工作实际上是以系统调用的方式

12、完成进程创建功能的,具体的工作是由sys_fork负责实施。对于任何操作系统来说,创建一个新的进程都是属于核心功能,因为它要做很多底层细致地工作,消耗系统的物理资源,比如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等,这些显然不能随便让哪个程序就能去做,于是就自然引出特权级别的概念,显然,最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。 特权级显然是非常有效的管理和控制程序执行的手段,因此在硬件上对特权级做了很多支持,就Intelx86架构的CPU来说一共有03四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特

13、权级做相应的检查,相关的概念有CPL、DPL和RPL,这里不再过多阐述。硬件已经提供了一套特权级使用的相关机制,软件自然就是好好利用的问题,这属于操作系统要做的事情,对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有了CPU能提供的最高权力,而一条工作在3级特权级的指令具有CPU提供的最低或者说最基本权力。 OK,有了上面对“特权级”概念的了解,就能更直观的了解用户态和核心态的区别。内核态与用户态是操作系统的两种运行级别,,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运

14、行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。通常来说,以下三种情况会导致用户态到内核态的切换: 1)系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放

15、的一个中断来实现,例如Linux的int80h中断。 2)异常 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。 3)外围设备的中断 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。 这3种方式是系统在运行时由用户态转到内核态的最主要

16、方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。 7.用户栈和内核栈的区别。 操作系统中,每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。 内核栈是内存中属于操作系统空间的一块区域,其主要用途为: 1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; 2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。 用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。 PS:那么为什么不直接用一个栈,何必浪费那么多的空间呢? 1)如果只用系统栈。系统栈一般大小有限,如果中断有16个优先级,那么系统栈一般大小为15(只需保存15个低优先级的中断,另一个高优先级中断处理程序处于运行),但用户程序子程序调用次数可能很多,那样15次子

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号