操作系统面试之一——程序、进程、线程

194 阅读8分钟

操作系统面试之一——程序、进程、线程

题注:《面试宝典》操作系统部分错误、漏洞较多,笔者对此参考相关书籍和自己观点进行了重写,供大家参考。

一、程序、进程、线程

1.程序和进程.

进程由两个部分组成:1)操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。2)地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。

 定义使用系统运行资源情况
程序计算机指令的集合,它以文件的形式存储在磁盘上。程序是静态实体(passive Entity),在多道程序系统中,它是不能独立运行的,更不能与其他程序并发执行。不使用【程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源】。 
进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。定义:进程是进程实体(包括:程序段、相关的数据段、进程控制块PCB)的运行过程,是系统进行资源分配和调度的一个独立单位。使用【进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源。】

2. 进程与线程

如果说操作系统引入进程的目的是为了提高程序并发执行,以提高资源利用率和系统吞吐量。那么操作系统中引入线程的目的,则是为了减少进程并发执行过程中所付出的时空开销,使操作系统能很好的并发执行。

       进程process定义了一个执行环境,包括它自己私有的地址空间、一个句柄表,以及一个安全环境;线程则是一个控制流,有他自己的调用栈call stack,记录了它的执行历史。

线程由两个部分组成:1)线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。2)线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。

       进程与线程的比较如下:

比较进程线程
活泼性不活泼(只是线程的容器)活泼
地址空间系统赋予的独立的虚拟地址空间(对于32位进程来说,这个地址空间是4GB)在进程的地址空间执行代码。线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。因为线程需要的开销比进程少
调度仅是资源分配的基本单位独立调度、分派的基本单位
并发性仅进程间并发(传统OS)进程间、线程间并发
拥有资源资源拥有的基本单位基本上不拥有资源
系统开销创建、撤销、切换开销大仅保存少量寄存器内容,开销小。

      

3. 进程同步

进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

       同步机制遵循的原则:

(1)           空闲让进;

(2)           忙则等待(保证对临界区的互斥访问);

(3)           有限等待(有限代表有限的时间,避免死等);

(4)           让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。

由于进程同步产生了一系列经典的同步问题“生产者-消费者”问题,“哲学家进餐”问题,“读者-写者”问题。

      

4. 进程间的通信是如何实现的?

       进程通信,是指进程之间的信息交换(信息量少则一个状态或数值,多者则是成千上万个字节)。因此,对于用信号量进行的进程间的互斥和同步,由于其所交换的信息量少而被归结为低级通信。

所谓高级进程通信指:用户可以利用操作系统所提供的一组通信命令传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节。或者说,通信过程对用户是透明的。

高级通信机制可归结为三大类:

(1)           共享存储器系统(存储器中划分的共享存储区);实际操作中对应的是“剪贴板”(剪贴板实际上是系统维护管理的一块内存区域)的通信方式,比如举例如下:word进程按下ctrl+c,在ppt进程按下ctrl+v,即完成了word进程和ppt进程之间的通信,复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,然后显示在ppt窗口上。

(2)           消息传递系统(进程间的数据交换以消息(message)为单位,当今最流行的微内核操作系统中,微内核与服务器之间的通信,无一例外地都采用了消息传递机制。应用举例:邮槽(MailSlot)是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。

(3)           管道通信系统(管道即:连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读))。实际操作中,管道分为:匿名管道、命名管道。匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信。

 同一机器两个进程间通信跨网络通信
剪贴板Clipboard可以不可以
匿名管道Pipe可以不可以
命名管道(点对点单一通信,数据量可较大)Namedpipe可以可以
邮槽(一对多,数据量较小,424字节以下)Mailslot可以可以

**
**

在Win32下提供的进程间通信方式有以下几种:

1)剪贴板Clipboard:在16位时代常使用的方式,CWnd类中提供了支持。
2)COM/DCOM:通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
3)Dynamic Data Exchange (DDE):在16位时代常使用的方式。
4)File Mapping:文件映射,在32位系统中提供的新方法,可用来共享内存。
5)Mailslots:邮件槽,在32位系统中提供的新方法,可在不同主机间交换数据,分为服务器方和客户方,双方可以通过其进行数据交换,在Win9X下只支持邮件槽客户。
6)Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。
7)RPC:远程过程调用,很少使用,原因有两个:复杂而且与UNIX系统的RPC并不完全兼容。但COM/DCOM的调用是建立在RPC的基础上的。
8)Windows Sockets:网络套接口,可在不同主机间交换数据,分为服务器方和客户方。
9)WM_COPYDATA:通过发送WM_COPYDATA消息并将数据放在参数中来传递数据给其他进程。

\

5. 线程同步

       根据用户模式及内核模式下的同步方式的不同,分类及对比如下: 

 内核对象/非内核对象含义缺点适用
关键代码段(临界区)CriticalSection非内核对象,工作在用户方式下,为用户模式对象从程序代码的角度来控制线程的并发性1.因为在等待进入关键代码段时无法设定超时值,所以其很容易进入死锁状态。2.不能跨进程使用。单个进程中线程间的同步(同步速度快)
事件对象Event内核对象所有内核对象中最基本的。速度较慢(相比用户模式实现线程同步)多个进程间的各个线程间实现同步
互斥对象Mutex内核对象代表对一个资源的独占式访问
信号量Semaphore内核对象使用计数器来控制程序对一个共享资源的访问