聊聊进程与线程,以及他们俩之间的关系

在聊进程与线程之前说说程序中的一点内容吧。 

在早期的未配置操作系统和单道批处理系统中,程序的执行方式是顺序执行,在前趋图中就可以发现,程序顺序执行时是存在前趋关系的。其顺序执行的特征是:

  • 顺序性:每一操作必须在下一操作开始之前结束。
  • 封闭性:程序在运行时独占全机资源,资源的状态只有本程序才能改变它,并且程序一旦开始执行,外界的因素是影响不了其执行结果的。
  • 可再现性:若程序执行时的环境和初始条件都相同,在当程序重复执行时,都可以获得相同的结果。

程序的顺序执行我们可以用一个简单的前趋图表示

当程序进行并发执行时,并不全存在前趋关系,即只有不存在前趋关系的程序之间才有可能之间并发执行。程序间引入并发执行功能后提高了系统的吞吐量和资源利用率,但并发执行的程序之间也会存在相互制约的关系。其特征和程序顺序执行时从字面上意思看来两者的特征是恰恰相反的:

  • 间断性:程序的顺序执行是具有顺序性的,而程序的并发执行是间断性的,因为程序在并发执行时,它们是共享系统的资源的,这样的情况下就会形成制约关系。因此相互制约的关系将导致并发程序具有“执行-暂停-执行”的规律。
  • 失去封闭性:程序并发执行,系统中的各种资源将为它们所共享。
  • 不可再现性:因为程序并发执行,失去了封闭性,那么也将导致其失去可再现性。


进程

为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,引入“进程”的概念。在操作系统中是利用PCB(进程控制块)描述进程的基本情况和活动过程,进而控制和管理进程。既由程序段、相关的数据段和PCB三部分组成了进程实体(进程映像)。

我们将进程可以定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

进程特征:

进程和程序是两个不同的概念,进程有着程序并不具有的进程控制块,并且还具有其它一些程序所不具有的特征。

  • 动态性:进程实体具有一定的生命期,由创建而产生,由调度而执行,由撤销而消亡。而程序是一组有序指令的集合,并存放在某种介质上,其本身没有活动的含义是静态的。
  • 并发性:多个进程实体同存于内存中,且能在一段时间内同时运行。
  • 独立性:进程实体是一个能独立运行、独立获得资源和独立接收调度的基本单位。
  • 异步性:是指进程是按异步的方式运行的(即按各自独立的、不可预知的速度向前推进)。为了使进程在并发运行时在具有异步性下,仍能保证进程并发执行的结果是可再现性的,因此在操作系统中引入了进程的概念,并且配置了响应的进程同步机制。

进程的三种状态

  • 就绪状态:指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有必要资源后,只要再获得CPU便可立即执行。
  • 执行状态:进程已获得CPU,其程序正在执行的状态。
  • 阻塞状态:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。

三种状态的转换

  • 处于就绪状态的进程,在调度程序为之分配了处理机后便可执行,相应的,其状态就由就绪状态转为执行状态;
  • 正在执行的进程(当前进程)如果因分配给它的时间片已完成而被剥夺处理机暂停执行时,其状态便由执行态转为就绪态;
  • 若因发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,则该进程状态有执行态转为阻塞态。

进程同步

我们在前文讲到进程异步特征时,能保证进程并发执行的结果是可再现性的,我们引入进程并配置了响应进程的同步机制。那么进程的同步机制是什么呢?

进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的各进程之间能按照一定的规则(或时序)共享系统资源,并能很好的相互合作,从而使程序的执行具有可再现性

 同步机制遵循的规则

  • 空闲让进:当无进程处于临界区,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
  • 忙则等待:当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
  • 有限等待:有限代表有限的时间,避免死等。
  • 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入”忙等“状态。

 进程通信

进程通信是指进程之间的信息交换。

由于进程的互斥与同步,需要在进程间交换一定的信息,但只能将其称为低级进程通信:效率低、通信对用户不透明。

在进程之间要传送大量的数据时,应当利用操作系统提供的高级通信工具:使用方便、高效地传送大量数据。

类型:

共享存储器系统

在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信

  • 基于共享数据结构的通信方式:在这种通信方式中,要求各进程公用某些数据结构,借以实现各进程间的信息交换。这种通信方式适于传递相对少量的数据,通信效率低下,属于低级通信。
  • 基于共享存储区的通信方式:为了大量的数据传输,在内存中划出了一块共享存储区域,各进程可通过对该共享区的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是由进程负责而不是OS。属于高级通信。

管道通信系统

这里的所谓的“管道”,指的是用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件(pipe文件)

管道机制需要提供以下三点的协调能力

  1. 互斥:即当一个进程正在对pipe执行读/写操作时,其它进程必须等待。
  2. 同步:当一个进程将一定数量的数据写入,然后就睡眠等待,直到读进程将数据取走,再去唤醒。
  3. 确定对方是否存在,只有确定了对方已存在时才能进行通信。

管道分为无名管道(pipe)和命名管道(fifo)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的,它们都是通过内核缓冲区实现数据传输。

  • 无名管道:用于相关进程之间的通信,例如父进程和子进程,它通过pipe()系统调用来创建并打开,当最后一个使用它的进程关闭对它的引用时,pipe将自动撤销。
  • 命名管道:在磁盘上有对应的节点,但没有数据块,即只是拥有一个名字和相应的访问权限,通过mknode()系统调用或mkfifo()函数来建立。当建立后,任何进程都可以通过文件名将其打开和进行读写,而不局限于父/子进程(前提:进程对FIFO有适当的访问权)。

消息传递系统

在消息传递机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。

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

从上所介绍的消息传递系统:其属于高级通信方式,我们可以将其因实现方式的不同进一步分为两类:

  • 直接通信方式:发送进程利用OS所提供的发送命令(原语),直接把消息发送给目标进程。
  • 间接通信方式:指发送和接收进程,都通过共享中间实体(邮箱)的方式进行消息的发送和接收,完成进程间的通信。

客户机-服务器系统

客户机-服务器系统的通信机制,是在网络环境的各种应用领域已成为当前主流的通信实现机制,其主要的实现方法为:套接字、远程过程调用和远程方法调用。在此文着重介绍其中的套接字。

 套接字

是UNIX操作系统下的网络通信接口。在一开始,套接字是用在同一台主机上多个应用程序之间的通信(进程间的通信),主要是为了解决多对进程同时通信时端口和物理线路的多路复用问题,如今其已成为流行的网络通信程序接口之一。

套接字通常包括两类:

  • 基于文件型:通信进程都在同一台机器的环境中,是基于本地文件系统支持的,一个套接字关联到一个特殊的文件,通信的双方对这个特殊的文件进行读写实现通信,其原理类似于管道。
  • 基于网络型:非对称方式通信,发送者需要提供接收者命令。通信双方的进程运行在不同主机环境下被分配了一堆套接字,一个属于发送进程,一个属于接收进程。

优势:

  • 套接字适用于同一台计算机内部和网络环境中不同计算机间的进程通信。
  • 因套接字号唯一(套接字标识符),能够很方便的区分对不同应用程序进程或网络连接的通信。

远程过程调用和远程方法调用

远程过程调用RPC是一个通信协议,用于通过网络连接的系统。负责处理远程过程调用的进程一个是本地客户进程,另一个是远程服务器进程。


线程

线程是进程的最小运行单元。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性

进程是一个资源的拥有者,因而在创建、撤消和切换中,系统必须为之付出较大的时空开销;这样就限制了系统中进程的数目,并且进程的切换也不宜频繁,从而限制了并发程度的进一步提高。

线程运行的是三个状态

  • 执行状态:表示线程已获得处理机而正在运行。
  • 就绪状态:表示线程已具备了各种执行条件,只须再获得CPU便可立即执行。
  • 阻塞状态:指线程在执行中因某事件受阻而处于暂停状态(比如当一个线程执行从键盘读入数据的系统调用时,该线程就被阻塞)。

进程与线程之间的区别

  • 进程有自己的独立地址空间,而线程没有。
  • 进程上下文切换开销大,线程上下文切换开销小。
  • 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  • 进程和线程通信方式不同:线程之间的通信比较方便。同一进程下的线程共享数据(比如全局变量、静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。

 线程和进程的关系

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段(又叫运行时段),用来存放所有局部变量和临时变量。
  • 处理机分给线程,即真正在处理机上运行的是线程。
  • 线程在执行过程中,需要协作同步,。不同进程的线程间要利用消息的通信的办法实现同步。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值