操作系统常见面试题目

来源:互联网 发布:盈建科三维软件停止 编辑:程序博客网 时间:2024/05/29 14:59

1. 进程和线程的联系和区别

(1)进程是操作系统分配计算机资源的最小单元。线程是操作系统调度(CPU)的最小单元。

(2)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文。进程也有自己的私有属性进程控制块PCB。这些私有属性是不被共享的,用来标示一个进程或一个线程。

(3)一个进程可以包括多个线程,这些线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

(4)线程可视为轻量级的进程,它的创建和销毁所需要开销比进程小很多。所有操作系统中的执行功能都是创建线程去完成的。线程的创建调用pthread_create。进程的创建调用fork或者vfork。进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。

(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源。

2. 死锁

何为死锁:如果一个进程集合中,每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么,该进程集合就是死锁的。

原因:系统资源不足、相互竞争资源、请求资源顺序不当。

死锁产生的四个必要条件:

1)互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。
2)占有和等待条件。已经得到了某个资源的进程,可以再请求新的资源。
3)不可抢占条件。已经分配给一个进程的资源不能强制性的被抢占,它只能被占有它的进程显式的释放。
4)环路等待条件。死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。

如何处理死锁?

死锁避免:从安全状态出发执行任务。

死锁预防:破坏四个条件。开始就请求所有资源,对资源编号等,可抢占式。

3. 进程的状态

这里写图片描述

僵尸状态:子进程先于父进程结束,但父进程没有调用wait或waitpid来回收子进程的资源,所以子进程就成了僵尸进程。如果父进程结束后任然没有回收子进程的资源,那么1号进程(init)将回收。

4. IPC方式

linux常用的进程间的通讯方式

(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)内存映射:内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。

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

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

5. 虚拟内存

每个程序拥有自己的地址空间,这些空间被分割为许多块,每一块叫做一页或页面。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才可运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。当程序引用到不在物理内存中的地址空间时,由OS负责将缺失的部分装入物理内存并重新执行失败的指令。

(1)逻辑地址

逻辑地址(Logical Address) 是指由程式产生的和段相关的偏移地址部分。例如C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址。它是相对于当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定代码段、数据段如果完全相同)。应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的,仅由系统编程人员涉及。应用程式员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。

在Linux0.11内核中,给每个进程都划分了总容量为64MB的虚拟内存空间。因此程式的逻辑地址范围是0x0000000到0x4000000。有时我们也把逻辑地址称为虚拟地址

(2)线性地址(Linear Address)

逻辑地址到物理地址变换之间的中间层。程式代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址,就生成了一个线性地址。如果启用了分页机制,那么线性地址能再经变换以产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。

(3)物理地址(Physical Address)

CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,则线性地址会使用页目录和页表中的项变换成物理地址。如果没有启用分页机制,那么线性地址就直接成为物理地址了。

原创粉丝点击