2024年6月11日发(作者:)

IT综合面试题大全

操作系统、计算机网络、设计模

一:操作系统

1.进程的有哪几种状态,状态转换图,及导致转换的事件。

状态:绪(Ready)状态进程已获得除处理机外的所需资源,等待分

配处理机资源,只要分配到CPU就可执行。在某一时刻,可能有若干个进

程处于该状态。2)运行状态占用处理机资源运行,处于此状态的进程的

数目小于等于CPU的数目。3)阻塞状态由于进程等待某种条件(如I/O

操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把

处理机分配给该进程,也无法运行。

转换解释:从状态转换图中,存在四种状态转换。当进程调度程序从

就绪队列中选取一个进程投入运行时引起转换1;正在执行的进程如因时

间片用完而被暂停执行就会引起转换2;正在执行的进程因等待的事件尚

未发生而无法执行(如进程请求完成I/O)则会引去转换3;当进程等待

的事件发生时(如I/O完成)则会引起转换4。

事件:就绪队列非空,则一个进程的转换3会立即引去另一个进程的

转换1。这是因为一个进程发生转换3意味着正在执行的进程由执行状态

变为阻塞状态,这时处理机空闲,进程调度程序必然会从就绪队列中选取

一个进程并将它投入运行,因此只要就绪队列非空,一个进程的转换3能

立即引起一个进程的转换1。2.进程与线程的区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,

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

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更

小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点

在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同

属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间

可以并发执行3.进程通信的几种方式。

管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而

且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程

关系。

有名管道(namedpipe):有名管道也是半双工的通信方式,但是它允

许无亲缘关系进程间的通信。

信号量(emophore):信号量是一个计数器,可以用来控制多个进程对

共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,

其他进程也访问该资源。因此,主

要作为进程间以及同一进程内不同线程之间的同步手段。

消息队列(meagequeue):消息队列是由消息的链表,存放在内核中并

由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载

无格式字节流以及缓冲区大小受限等缺点。

信号(inal):信号是一种比较复杂的通信方式,用于通知接收进程某

个事件已经发生。共享内存(haredmemory):共享内存就是映射一段能被

其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可

以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行

效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来

实现进程间的同步和通信。

套接字(ocket):套解口也是一种进程间通信机制,与其他通信机制

不同的是,它可用于不同及其间的进程通信。

4.线程同步几种方式。(一定要会写生产者、消费者问题,完全消化

理解)临界区(CCriticalSection):通过对多线程的串行化来访问公共

资源或一段代码,速度快,适合控制数据访问。事件(CEvent):为协调

共同对一个共享资源的单独访问而设计的。互斥量(CMute某):为控制

一个具有有限数量用户资源而设计。信号量(CSemaphore):用来通知线

程有一些事件已发生,从而启动后继任务的开始。5.线程的实现方式.(也

就是用户线程与内核线程的区别)

根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用

户线程。

内核线程建立和销毁都是由操作系统负责、通过系统调用完成的,操

作系统在调度时,参考各进程内的线程运行情况做出调度决定,如果一个

进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。

和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用

户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提

供创建、同步、调度和管理线程的函数来控制用户线程。用户线程多见于

一些历史悠久的操作系统,例如Uni某操作系统,不需要用户态/核心态

切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将

使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配

是以进程为基本单位,所以每个线程执行的时间相对减少为了在操作系统

中加入线程支持,采用了在用户空间增加运行库来实现线程,这些运行库

被称为“线程包”,用户线程是不能被操作系统所感知的。引入用户线程,

具体而言,有以下四个方面的优势:(1)可以在不支持线程的操作系统

中实现。

(2)创建和销毁线程、线程切换代价等线程管理的代价比内核线程

少得多。(3)允许每个进程定制自己的调度算法,线程管理比较灵活。

(4)线程能够利用的表空间和堆栈空间比内核级线程多。用户线程的缺

点主要有以下两点:

(1)同一进程中只能同时有一个线程在运行,如果有一个线程使用

了系统调用而阻塞,那么整个进程都会被挂起。

(2)页面失效也会产生类似的问题。

内核线程的优缺点刚好跟用户线程相反。实际上,操作系统可以使用

混合的方式来实现线程。

6.用户态和核心态的区别、7.用户栈和内核栈的区别。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就

称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高

的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使

用当前进程的内核栈。每个进程都有自己的内核栈。当进

程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即

此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程

序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程

的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态

的进程的状态有些类似。

用户态切换到内核态的3种方式:系统调用、异常、外围设备中断。

8.内存池、进程池、线程池。(c++程序员必须掌握)自定义内存池的思想

通过这个池字表露无疑,应用程序可以通过系统的内存分配调用预先一

次性申请适当大小的内存作为一个内存池,之后应用程序自己对内存的分

配和释放则可以通过这个内存池来完成。只有当内存池大小需要动态扩展

时,才需要再调用系统的内存分配函数,其他时间对内存的一切操作都在

应用程序的掌控之中。应用程序自定义的内存池根据不同的适用场景又有

不同的类型。从线程安全的角度来分,内存池可以分为单线程内存池和多

线程内存池。单线程内存池整个生命周期只被一个线程使用,因而不需要

考虑互斥访问的问题;多线程内存池有可能被多个线程共享,因此则需要

在每次分配和释放内存时加锁。相对而言,单线程内存池性能更高,而多

线程内存池适用范围更广。

从内存池可分配内存单元大小来分,可以分为固定内存池和可变内存

池。所谓固定内存池是指应用程序每次从内存池中分配出来的内存单元大

小事先已经确定,是固定不变的;而可变内存池则每次分配的内存单元大

小可以按需变化,应用范围更广,而性能比固定内存池要低。

9.死锁的概念,导致死锁的原因.

死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的

一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统

处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进

程.

原因:系统资源不足、进程运行推进的顺序不合适、资源分配不当等。

10.导致死锁的四个必要条件。

(1)互斥条件:一个资源每次只能被一个进程使用。