操作系统经典问题--转别人面试经验

1. 什么是进程(process)和 线程(thread)? 有何区别

   进程是系统进行资源分配和调度的一个独立单位

  进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体

  线程是进程的一个实体,是CPU调度和 分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和 栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。比如父子进程间的全局变量是独立的,虽然采用了写时复制的策略;但是同一个进程中的线程共享该进程的全局变量,它们的操作相互影响,只有函数中的局部变量才有私有的

 

2. 进程调度的方法

 完全公平(CFS)调度算法、O(1)调度算法、先来先服务、短执行进程优先算法、最高优先级优先调度算法(核心是确定进程的优先级)、时间片轮转法

 

3. 进程同步的方法

 进程间同步的主要方法有原子操作、信号量机制、自旋锁、管程、会合、分布式系统等。

 

4.死锁

 就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

产生死锁的原因主要是:(1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。(3) 资源分配不当等。

 

产生死锁的四个必要条件
 (1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁避免:系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配.这是一种保证系统不进入死锁状态的动态策略 。

常用方法:

1)银行家算法:每个进程申请资源时,系统采用银行家算法先进行判断,即假设我把这些资源分配给该进程,如果后序能找到一个安全区状态(即不会发生死锁的状态),就进行真正的分配,如果找不到,则不分配。具体参考这里

2)鸵鸟算法:它假设出现死锁的概率很小,并且出现之后处理死锁会花费很大的代价,还不如不做处理,OS中这种置之不理的策略称之为鸵鸟算法。

5.用户进程间通信主要哪几种方式

 (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

4)消息队列:消息队列是消息的链接表,包括Posix消息队列、system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

6)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

7)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

 

6.系统调用和库函数的区别

 (1)调用形式不同。过程(函数)使用一般调用指令,其转向地址是固定不变的,包含在跳转语句中;但系统调用中不包含处理程序入口,而仅仅提供功能号,按功能号调用。
(2)被调用代码的位置不同。过程(函数)调用是一种静态调用,调用者和被调用代码在同一程序内,经过连接编辑后作为目标代码的一部份。当过程(函数)升级或修改时,必须重新编译链接。而系统调用是一种动态调用,系统调用的处理代码在调用程序之外(在操作系统中),这样一来,系统调用处理代码升级或修改时,与调用程序无关。而且,调用程序的长度也大大缩短,减少了调用程序占用的存储空间。
(3)提供方式不同。过程(函数)往往由编译系统提供,不同编译系统提供的过程(函数)可以不同;系统调用由操作系统提供,一旦操作系统设计好,系统调用的功能、种类与数量便固定不变了。
(4)调用的实现不同。程序使用一般机器指令(跳转指令)来调用过程(函数),是在用户态运行的;程序执行系统调用,是通过中断机构来实现,需要从用户态转变到核心态,在管理状态执行,因此,安全性好。

7.内核同步(即并发访问)的方法

 

8.什么是中断?中断时CPU做什么工作?

 中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。

9. 内存管理

 

10.虚拟文件系统

posted on 2019-02-27 18:18  积跬步306  阅读(52)  评论(0编辑  收藏  举报