【操作系统】进程与线程


在这里插入图片描述

进程的概念和特征

  1. 进程的概念
    多道程序环境下允许多个程序并发执行,此时这些程序会失去封闭性,并具有间断性以及不可再现性。为此引入了进程(Process)的概念,以便于更好的去描述和控制程序的并发执行,实现操作系统并发性共享性(操作系统最基本的两个特征)。
    为了能使参与并发执行的程序能够独立运行,必须要为之配置一个专门的数据结构,称之为进程控制块(PCB)系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应的,由程序段相应数据段PCB三部分构成了进程映像(进程实体)。所谓创建进程实质上是创建进程映像中的PCB,而撤销进程实质上是撤销进程的PCB

!!!进程映像静态的,进程则是动态的。
!!!PCB是进程存在的唯一标志。

①进程是程序的一次执行过程。
②进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
③进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

  1. 进程的特征
    进程是由多道程序并发执行引出的,它和程序是两个不同的概念,进程的基本特征是对比单个程序的顺序执行提出的,也是对进程管理提出的基本要求。
    ①动态性
    进程是程序的一次执行,它有着创建活动暂停终止等过程,具有一定的生命周期,是动态的产生变化消亡的。动态性是进程最基本的特征
    ②并发性
    并发性是指多个进程实体同时存于内存中,能在一段时间内同时运行。并发性是进程的重要特征,同时也是操作系统的重要特征,引入进程的目的就是为了使程序能与其他进程的程序并发直行,从而提高资源利用率
    ③独立性
    独立性是指进程实体是一个能独立运行独立获得资源独立接受调度的基本单位。
    凡未建立PCB的程序都不能作为一个独立的单位参与运行。
    ④异步性
    由于进程相互制约,使得进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果不可再现性,为此,在操作系统中必须配置相应的进程同步机制
    ⑤结构性
    每个进程都配置一个PCB对其进行描述。从结构上看进程实体是由程序段数据段进程控制块三部分组成。

进程的状态和转换

一个进程在其生命周期中,由于系统各进程之间的相互制约关系以及系统的运行环境的变化,会使得进程的状态也在不断的发生变化(一个进程会经历若干不同的状态),通常情况下会有以下5种状态,前3种是进程的基本状态

  1. 运行态
    进程正在处理机上运行。在单处理机环境下,每个时刻最多只有一个进程处于运行态
  2. 就绪态
    进程获得了除处理机之外的一切所需资源,一旦得到处理机便可立即运行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列称为就绪队列
  3. 阻塞态
    阻塞态又称等待态。进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
  4. 创建态
    进程正在被创建,尚未转到就绪态
    进程创建通常需要多个步骤,首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,然后由系统为该进程分配运行时所必需的资源,最后把该进程转入就绪态
  5. 结束态
    进程正从系统中消失,可能是进程正常结束或者是其他原因中断退出运行。进程需要结束运行时,系统首先必须置该进程为结束态,然后再进一步处理资源释放回收等工作。

注意区别就绪态和等待态:
就绪态是指进城仅仅缺少了处理机,只要获得处理及资源就可以立即运行进程,而等待态是指进程需要其他资源,除了需处理机或等待某一件事件。
之所以将处理机和其他资源划分开,是因为在分时系统的时间片轮转机制中,每个进程分到的时间片是几毫秒,也就是说进程得到处理机的时间很短,而且非常频繁,进程在运行过程中实际上是频繁的转换到就绪态,而其他资源比如说外设的使用和分配或某一事件的发生,如io操作的完成,对应的时间相对来说很长晋城转换到等待的次数也相对较少这样看来就去太和等待是晋城生命周期中两个完全不同的状态需要加以区分。

处于就绪态的进程被调度后获得处理及资源分派处理及时间片于是进程由就绪态转换为运行态。

运处于运行态的进程,在时间片用完后不得不让出处理机,从而进程由调度,由运行态转化为就绪态,此外在可剥夺的初步操作系统中,当有更高优先级的进程就绪时,调度程度将正在执行的进程转化为就绪态,让更高优先级的进程执行。

进程请求某一资源的使用和分配,或等待某一事件的发生时,他就从运行态转换为阻塞态,进程以系统调用的形式请求操作系统提供服务,这是一种特殊的由运行用户态程序调用操作系统内核进过程的程序。

进城等待的事件到来时,如io操作结束或中断结束时中断处理程序,必须把相应进程的状态,有阻塞态转化为就绪态。

一个进程从运行态变为阻塞态是主动行为,而从阻塞态变成就绪态是被动行为,需要其他相关进程的协助。

进程控制

一般把进程控制用的程序段称为言语,言语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

  1. 进程创建
    允许一个进程创建另外一个进程,此时创建者称为附近曾被创建的进程称为紫禁城。紫禁城可以继承附近城所拥有的资源,当紫禁城被撤销时,应将其从附近城那里获得的资源归还给附近城,此外在撤销附近城市必须同时撤销其所有的紫禁城。
    在操作系统中,终端用户登录系统作业调度系统提供服务用户程序的请求,等都会引起新进程的创建操作系统会创建一个新的进程创建原语
    ①为新进城分配一个唯一的进城标志号,并申请一个空白的pcd,若pcb申请失败则创建失败。

②为进程分配资源为新进程的程序和数据及用户站分配必要的内存空间,若资源不足则并不是创建失败,而是处于阻塞态等待内存资源。

③初始化pcb主要包括初始化标志,信息初始化处理及状态信息和初始化处理机控制信息,以及设置进程的优先级等。

④若进城就绪队列能够接纳新进程,则将新进程插入就绪队列等待被调度运行。

  1. 进程终止
    引起进程终止的事件主要有:
    正常结束表示进城的任务已完成,并准备退出运行。
    异常结束表示进程在运行时发生了某种异常事件,使程序无法继续运行。
    外界干预指进程应外界的请求而终止运行。
    ①根据被终止进程的标志符检索pcb,从中读出该进程的状态。

②若被终止进程处于执行状态,立即终止该进程的执行将处理及资源分配给其他进程。

③若该进程还有子孙进程,则应将其所有子孙进程终止。

④将该进程所拥有的全部资源或归还给其父进程或归还给操作系统。

⑤将该pcb从锁在队列链表中删除。

  1. 进程阻塞和唤醒
    正在执行的进程,由于期待的某些事件尚未发生,如请求系统资源失败,等待某种操作完成,新数据尚未到达或无心工作可做时等,由系统自动执行,阻塞原语,使自己由运行态变为阻塞态,可见进程的阻塞态是进程自身的一种主动行为,也因此只有处于运行态的进程才可能将其转为阻塞态,阻塞言语的执行过程如下:
    ①找到将要被阻塞进程的标志号对应的pcb。

②若该进程为运行态,则保护其现场,将其状态转为阻塞态停止运行。

③把该pcb插入相应事件的等待队列,将处理机资源调度给其他就绪进程。

当被阻塞进程所期待的事件发生时,如他所启动的io操作已完成,或其所期待的数据已到达,友友关进程调用换星元与将等待该事件的进程唤醒唤醒原语的执行过程如下:
①在该事件的等待队列中找到相应的进程的pcb。

②将其从等待队列中移出并致其状态为就绪态。

③把该pcb插入就绪队列等待调度程序调度。

Block远语和wake up远语是一对作用刚好相反的言语必须承兑使用block言语是被阻塞进程自我调用实现的,而wake up言语则是由一个被唤醒进程合作或被其他相关的进程调用实现的。

  1. 进程切换
    对于通常的进程来说,其创建撤销及要求和系统设备完成的io操作都是利用系统调用而进入内核,再由内核中的相应处理程序予以完成。进程切换同样是在内核的支持下实现的,可以说任何竞争都是在操作系统内核的支持下运行的,是与内核紧密相关。
    进程切换是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中近程的运行环境产生了实质性的变化,进程切换的过程如下:

①保存处理机上下文,包括程序计数器和其他寄存器。

②更新pcb信息。

③把进程的pcb移入相应的队列,如旧绪在某事件阻塞等队列。

④选择另一个进程执行并更新其pcb。

⑤更新内存管理的数据结构。

⑥恢复处理机上下文。

进程切换与处理机模式切换是不同的模式切换时处理机逻辑上可能还在同一进程中运行,若进程因中断或异常进入核心态运行,执行完后又回到用户台,刚被中断的程序运行,则操作系统只需恢复进程,进入内核时所保存的CPU现场,而无需改变当前进程的环境信息,但若要切换进程,当前的运行进程改变了,则当前进程的环境信息也需要改变。

进程组织

进城是一个独立的运行单位,也是操作系统进行资源分配和调度的基本单位有以下三部分组成,最核心的部分是进程控制块。

  1. 进程控制块
    进城创建时,操作系统为他新建一个pcb,该结构之后常驻内存,任何时刻都可以存储,并在进程结束时删除,pcb是进程实体的一部分,是进程存在的唯一标志,以便对其进行控制和管理进程结束时系统回收其pcb,该进程随之消亡,操作系统通过pcb表来管理和控制进程,当操作系统想要调度某进程运行时,要从该进程的pcb中查出其限行状态及优先级,在调度到某进程后,要根据其pcb所保存的处理及状态信息设置该进程恢复运行的现场,并根据其pcb中的程序和数据的内存地址找到其程序和数据,进程在运行过程中,当需要和与之合作的进程进行同步通信或访问文件时,也需要访问pcb当进程由于某种原因而暂停运行时,又需将其断点的处理及环境保存在pcb中,可见在进程的整个生命期中,系统总是通过pcb对进程进行控制。系统唯有通过进程的pcb才能感知到其进程的存在。
    Pcb主要包括进程描述,信息进程控制和管理信息,资源分配清单和处理及相关信息。
    ①进程描述,信息进程标志符标志各个进程,每个进程都有一个唯一的标志符,用户标志符进程归属的用户用户标志符主要为共享和保护服务。

②进程控制和管理信息进程当前状态描述进程的状态信息作为处理及分配调度的依据,进程优先级,描述进程抢占处理机的优先级优先级高的进程可优先获得处理机。

③资源分配清单用于说明有关内存地址空间或虚拟地址空间的情况,所打开文件的列表和所使用的输入输出设备信息。

④处理及相关信息,主要指处理机中各计算器的值当进程被切换时处理及状态信息都必须保存在相应的pcb中,以便在该进程重新执行时能从断点继续执行。

在一个系统中通常存在着许多进程的pcb,有的处于就绪态,有的处于阻塞态而且阻塞下来的原因各不相同,为了方便进程的调度和管理,需要将各进程的pcb用适当的方法组织起来,目前常用的组织方式有链接方式和索引方式两种。链接方式将同一状态的pcb链接成一个队列不同状态,对应不同的对立,也可把处于阻塞态的进程的pcb根据其阻塞原因,排成多个阻塞队列缩运方式,将统一状态的进程组织在一个索引表中,索引表的项指向相应的pcb,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。
2. 程序段
程序段就是能被进程调度程序调度到CPU执行的程序代码,段程序可被多个进程共享及多个进程可以运行同一个程序。
3. 数据段
一个进程的数据段可以是进程对应的程序,加工处理的原始数据也可以是程序执行时产生的中间或最终结果。

进程通信

进程通信是指进程之间的信息交换,pv操作是低级通信方式,高级通信方式是指以较高的效率传输,大量数据的通信方式,高级通信方法主要有以下三类。

  1. 共享存储
    在通信的进程之间存在一块可直接访问的共享空间,通过这对这片共享空间进行读写操作实现进程之间的信息交换,在对共享空间进行读写操作时,需要使用同步互斥工具,对共享空间的读写操作进行控制,共享存储又分为两种。低级的共享是基于数据结构的共享,高级共享是基于存储区的共享操作系统只负责为通信进程提供可共享使用的存储空间和同步互斥工具,而数据交换则由用户自己安排读写指令完成注意用户进程空间一般都是独立的进程运行期间一般不能访问其他进程的空间要想让两个用户进程共享空间必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的。
  2. 消息传递
    在消息传递系统中进程间的数据交换是以格式化的消息为单位的,如果通信的进程之间不存在可直接访问的共享空间,则必须利用操作系统提供的消息传递方法,实现进程通信进程,通过系统提供的发送消息和接收消息,两个原语进行数据交换
    ①直接通信方式发送进程,直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得信息。

②间接通信方式发送进程,把消息发送到某个中间实体接收进程,从中间实体取得消息,这种中间实体一般称为信箱,这种销通信方式又成为信箱通信方式,该通信方式广泛应用于计算机网络中,相应的通信系统成为电子邮件系统。

  1. 管道通信
    管道通信是消息传递的一种特殊方式,所谓管道是指用于连接一个独进程和一个写进程,以实现它们之间的通信的一个共享文件。有名php文件向管道提供输入的发送进程,以字符流形式将大量的数据送入写通道,而接收管道输出的接收进程则从管道中接收读数据,为了协调双方的通信管道机制,必须提供以下三个方面的协调能力,互斥同步和确定对方存在。
    以Linux中的管道为例进行说明,在Linux中管道是一种使用非常频繁的通信机制,从本质上说管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题:
    ①限制管道的大小,实际上管道是一个固定大小的缓冲区,在Linux中该缓冲区的大小为4,kb,这是它的大小,不像稳健那样不加检验的增长,使用单个固定缓冲区也会带来问题,比如在斜管道时可能变满,这种情况发生时随后对管道的right调用将默认的被阻塞,等待某些数据被读取,以便腾出足够的空间共write调用。

②独进程也可能工作的比写进程快,当所有当前进程数据已被读取时,管道变空,当这种情况发生时,一个随后的read调用将默认的被阻塞,等待某些数据被写入,这解决了瑞的调用返回文件结束的问题。

管道可以理解为共享存储的优化和发展,因为在共享存储中,若某进程要访问共享存储空间,则必须没有其他进程在该共享存储空间中进行写操作,否则访问行为就会被阻塞,而管道通信中存储空间进化成了缓冲区,缓冲区只允许一边写入另一边读出,因此只要缓冲区中有数据进程就能从缓冲区中读出,而不必担心会被其他进程在另一在其中进行写操作而遭到阻塞。因为写进程会先把缓冲区写满,然后才让读进程读,当缓冲区中还有数据时写进程不会往缓冲区写数据,这也决定了管道通信必然是半双工通信。

线程概念和多线程模式

  1. 线程的基本概念
    引入进程的目的是为了更好地使多道程序并发执行,提高资源利用率和系统吞吐量:而引入线程的目的则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

引入线程后,进程的内涵发生了改变,进程只作为除CPU外的系统资源的分配单元,而线程则作为处理机的分配单元。由于个进程内部有多个线程,若线程的切换发生在同一个进程内部,则只需要很少的时空开销。

  1. 线程与进程
    1)调度,在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从个进程内的线程切换到另一个进程中的线程时,会引起进程切换。

2)拥有资源。不论是传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源(也有点儿必不可少的资源) ,但线 程可以访问其隶属进程的系统资源。要知道,若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。

3)并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且多个线程之间也可以并发执行,从而使操作系统具有更好的并发性,提高了系统的吞吐量。

4)系统开销。由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,因此操作系统所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程CPU环境的保存及新调度到进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。

5)地址空间和其他资源(如打开的文件)。进程的地址空间之间互相独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。

6)通信方面。进程间通信(IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。

  1. 线程属性

多线程操作系统把线程作为独立运行(或调度)的基本单位,此时的进程已不再是一个基本的可执行实体,但它仍具有与执行相关的状态。所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。线程的主要属性如下:

1)线程是一个轻型实体, 它不拥有系统资源,但每个线程都应有一一个唯一的标识符和一 一个线程控制块,线程控制块记录了线程执行的寄存器和栈等现场状态。

2)不同的线程可以执行相同的程序,即同-个服务程序被不同的用户调用时,操作系统把它们创建成不同的线程。

3)同一进程中的各个线程共享该进程所拥有的资源。

4)线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。

5)一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞态、就绪态和运行态等各种状态变化。

为什么线程的提出有利于提高系统并发性?可以这样来理解:由于有了线程,线程切换时,有可能会发生进程切换,也有可能不发生进程切换,平均而言每次切换所需的开销就变小了,因此能够让更多的线程参与并发,而不会影响到响应时间等问题。
4. 线程实现方式
线程的实现可以分为两类:用户级线程(User-Level Thread, ULT)和内核级线程(Kermel-Level Thread, KLT)。内核级线程又称内核支持的线程。

在用户级线程中,有关线程管理(线程的创建、城消和切换等)的所有工作都由应用店成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序。序从单线程开始,在该线程中开始运行,在其运行的任何时刻,可以通过调用线程库中的派生例程创建一个在相同进程中运 行的新线程。图251a)说明了用户级线程的实现方式。

在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进行线程管理的代码,只有一个到内核级线程的编程接口。内核为进程及其内部的每个线程维护上下文信息,调度也在内核基于线程架构的基础上完成。图2.5(b)说明了内核级线程的实现方式。

有些系统中使用组合方式的多线程实现。线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于等于用户级线程的数目)内核级线程上。图2.5©说明了用户级与内核级的组合实现方式。

  1. 多线程模式
    5.多线程模型

有些系统同时支持用户线程和内核线程,由此产生了不同的多线程模型,即实现用户级线程

和内核级线程的连接方式。

1)多对一模型。将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。此模式中,用户级线程对操作系统不可见(即透明)。

优点:线程管理是在用户空间进行的,因而效率比较高。

缺点: -个线程在使用内核服务时被阳塞,整个进程都会被阻塞:多个线程不能并行地运行在多处理机上。

2)一-对一模型。将每个用户级线程映射到一个内核级线程。

优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。

缺点:每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能。

3)多对多模型。将n个用户级线程映射到m个内核级线程上,要求m≤n。

特点:多对多模型是多对一模型和一 对一模型的折中,既克服了多对模型 并发度不高的缺点,又克服了- -对一模型的一一个用户进程占用太多内核级线程而开销太大的缺点。此外,还拥有多对一模型和一-对一-模型各自的优点,可谓集两者之所长。

小结

2.1.7本节小结

本节开头提出的问题的参考答案如下。

1)为什么要引入进程?

在多道程序同时运行的背景下,进程之间需要共享系统资源,因此会导致各程序在执行过程中出现相互制约的关系,程序的执行会表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指 令的集合,是一 一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行、何时停顿,也无法看出它与其他执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质乃至更好地支持和管理多道程序的并发执行,人们引入了进程的概念。2)什么是进程?进程由什么组成?

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一 一个活动的实体。它不只是程序的代码本身,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

一个进程实体由程序段、相关数据段和PCB三部分构成,其中PCB是标志一个进程存在的唯一标识,程序段是进程运行的程序的代码,数据段则存储程序运行过程中相关的一些数据。3)进程是如何解决问题的?

进程把能够识别程序运行态的一些变量存放在PCB中,通过这些变量系统能够更好地了解进程的状况,并在适当时进行进程的切换,以避免一些资源的浪费,甚至划分为更小的调度单位一线程来提高系统的并发度。

本节主要介绍什么是进程,并围绕这个问题进行一些阐述和讨论,为下节讨论的内容做垫,但之前未学过相关课程的读者可能会比较费解,到现在为止对进程这个概念还未形成比较清晰的认识。接下来,我们再用一个比较熟悉的概念来类比进程,以便大家能彻底理解本节的内容到底在讲什么,到底解决了什么问题。

我们用“人的生命历程”来类比进程。首先,人的生命历程一定是一一个动态的、过程性的概念,要研究人的生命历程,先要介绍经历这个历程的主体是什么。主体当然是人,相当于经历进程的主体是进程映像,人有自己的身份,相当于进程映像里有PCB;人生历程会经历好几种状态:出生的时候、弥留的时候、充满斗志的时候、发奋图强的时候及失落的时候,相当于进程有创建、撤销、就绪、运行、阻塞等状态,这几种状态会发生改变,人会充满斗志而转向发奋图强,发奋图强获得进步之后又会充满斗志预备下一次发奋图强,或者发奋图强后遇到阻碍会进入失落状态,然后在别人的开导之下又重新充满斗志。类比进程,会由就绪态转向运行态,运行态转向就绪态,或者运行态转向阻塞态,然后在别的进程帮助下返回就绪态。

猜你喜欢

转载自blog.csdn.net/qq_43511405/article/details/107829534