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

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

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

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


一、程序、进程、线程


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


内核对象


使用计数器来控制程序对一个共享资源的访问


 


相关文章
|
4天前
|
算法 调度 UED
操作系统中的进程调度策略
在操作系统的核心组件中,进程调度策略是决定系统性能和用户体验的关键因素。本文将深入探讨现代操作系统中常见的进程调度算法,如先来先服务、短作业优先、轮转以及多级队列调度等,并分析它们在不同应用场景下的优缺点。通过对比分析,我们可以理解每种调度策略的设计哲学及其对系统响应时间、吞吐量和公平性的影响。
|
4天前
|
Python
Python线程是操作系统能够进行运算的最小单位
【7月更文挑战第18天】Python线程是操作系统能够进行运算的最小单位
5 1
|
5天前
|
算法 Linux 调度
深入理解操作系统之进程调度策略
【7月更文挑战第17天】本文将带领读者深入探讨操作系统中至关重要的一环——进程调度。我们将从进程调度的基本概念出发,逐步揭示其背后的设计哲学,并对比分析常见的进程调度算法。文章还将通过实例展示这些策略在实际操作系统中的应用,以及它们对系统性能和用户体验的影响。通过本文,读者不仅能获得理论知识,还能了解如何将这些知识应用到实际问题解决中。
|
8天前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
5天前
|
机器学习/深度学习 算法 Linux
操作系统中的进程调度:理论与实践
在操作系统的复杂世界中,进程调度是确保系统效率和响应性的关键。本文深入探讨了进程调度的理论模型、算法及其在实际操作系统中的应用。通过分析先来先服务、轮转、优先级和多级队列等经典调度算法,我们揭示了它们如何适应不同的系统需求。进一步地,文章探讨了现代操作系统如Linux和Windows中进程调度的实现细节,以及它们是如何平衡用户级性能和系统级效率的。最后,考虑到云计算和大数据时代的挑战,本文还展望了进程调度的未来方向,包括自适应调度算法和机器学习在调度决策中的应用潜力。
|
9天前
|
Python
Python的`signal`模块提供了访问底层操作系统提供的信号机制的方式。信号是操作系统用来通知进程发生了某种情况(如用户按下Ctrl+C)的一种机制。
Python的`signal`模块提供了访问底层操作系统提供的信号机制的方式。信号是操作系统用来通知进程发生了某种情况(如用户按下Ctrl+C)的一种机制。
|
10天前
|
API 调度
从操作系统层面描述线程的五种状态
从操作系统层面描述线程的五种状态
|
10天前
|
缓存 Linux 编译器
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
22 0
|
10天前
|
存储 Linux 调度
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
29 0
|
17天前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上