Page cover image

第二章进程

2.1 概念,组成,特征

1.进程的概念

进程可以被理解为程序的一次执行过程。在操作系统中,它是资源分配和调度的基本单位。每个进程都拥有独立的虚拟地址空间、执行堆栈、程序计数器等,能够确保程序在多任务环境中稳定运行。

  • 程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。

  • 进程(Process):是动态的,是程序的一次执行过程。

2.进程的组成

一个进程通常由以下几部分组成:

  1. 程序代码:程序执行所需的指令集合。

  2. 数据集合:程序在执行过程中需要处理的数据。

  3. 进程控制块(PCB,Process Control Block):包含进程的描述信息和控制信息,是进程存在的唯一标志。

    1. 操作系统要记录PID,进程所属用户ID(UID),(当进程被创建时,操作系统会为改进程分配一个唯一的,不重复的“身份证号”--PID(Process ID,进程ID)。

    2. 记录给进程分配了,那些资源(分配了多少内存,正在使用那些I/O设备,正在使用那些文件)。

    3. 记录进程的运行情况(CPU使用时间,磁盘使用情况,网络流量使用情况等)。

  4. 栈空间:用于存放函数调用时的局部变量、返回地址等。

  5. 堆空间:用于动态分配的内存空间。

3.进程的特征

  1. 动态性:进程的实质是程序在多道程序系统中的一次执行过程,它是动态产生、动态消亡的。

  2. 并发性:多个进程可以在单个处理器上交替执行,也可以在多处理器系统上并行执行。

  3. 独立性:每个进程都拥有自己的地址空间和执行状态,不会受到其他进程的直接影响。

  4. 异步性:由于进程间的相互制约,每个进程的执行顺序和速度都是不可预测的。

  5. 交互性:进程在执行过程中可能需要与其他进程进行通信和同步。

  6. **结构性:**每个进程都会配置PCB。结构上看,进程由程序段,数据段,PCB组成。

操作系统通过进程管理,实现了对计算机系统中各种资源的有效调度和使用,从而提高了计算机系统的效率和用户满意度。

2.2 进程的状态与转换

1.进程的状态

进程在其生命周期中可以处于以下几种状态:

  1. 运行状态(Running):进程正在处理器(CPU)上执行。

  2. 就绪状态(Ready):进程已具备运行条件,但由于处理器忙,暂时不能运行,等待系统调度。

  3. 阻塞状态(Blocked):进程因等待某个事件(如I/O操作完成、信号量、网络数据到达等)的发生而暂时停止运行。

  4. 创建状态(New):进程正在被创建,尚未进入就绪状态。(进程分配资源,初始化PCB)

  5. 终止状态(Terminated):进程执行完毕,等待系统回收其资源。

2.状态间的转换

以下是进程状态之间的一些常见转换:

  1. 就绪 -> 运行:当处理器空闲时,操作系统调度器会选择一个就绪状态的进程来执行,使其进入运行状态。

  2. 运行 -> 就绪:在分时系统中,运行时间片到期的进程会被系统调度器暂停,状态转换为就绪;或者当有更高优先级的进程变为就绪状态时,当前运行的进程也会转换为就绪状态。

  3. 运行 -> 阻塞:当进程执行到某个操作需要等待(如等待I/O)时,它将从运行状态转换为阻塞状态。

  4. 阻塞 -> 就绪:当进程等待的事件发生(如I/O完成),它将从阻塞状态转换为就绪状态,等待调度器调度。

3.进程的组织方式

进程控制块(PCB)是进程存在的唯一标志,操作系统通过PCB来管理和控制进程。以下是几种常见的进程组织方式:

  1. 链表:操作系统可以维护一个或多个链表来组织PCB。例如,可以有一个就绪链表、一个阻塞链表和一个运行链表。

    • 单链表:所有PCB都链接在一个链表中。

    • 双链表:每个PCB有两个指针,分别指向前一个和后一个PCB,便于双向遍历。

    • 索引表:结合链表和数组,使用数组索引来快速定位到不同的链表。

  2. 索引数组:使用数组来存储指向PCB的指针,通过索引可以快速访问任何一个进程的PCB。

  3. 散列表(哈希表):根据进程ID或其他关键字通过哈希函数计算得到散列地址,将PCB存储在散列表中,可以快速查找和访问。

  4. 树结构:例如,可以使用树结构来表示进程的层次关系,如进程的父子关系。

操作系统根据具体的实现和需求选择最合适的组织方式,以优化进程的创建、终止、调度和同步等操作的性能。

2.3 进程控制

1.进程控制的基本概念

什么是进程控制: 进程控制是指操作系统对进程的创建、调度、同步、通信和终止等活动的管理。进程控制确保了进程能够正确、高效地在系统中执行,并且能够合理地使用系统资源。

如何实现进程控制: 进程控制主要通过以下几个步骤实现:

  1. 进程控制块(PCB):操作系统为每个进程创建一个PCB,用于存储进程的状态信息、控制信息和管理信息。

  2. 进程状态转换:操作系统通过状态转换机制来控制进程的执行流程。

  3. 进程调度:操作系统根据一定的调度算法,从就绪队列中选择一个进程来执行。

  4. 同步与通信:操作系统提供同步机制(如信号量、互斥量)和通信机制(如消息队列、共享内存)来控制进程间的协作。

2.进程控制相关的原语

进程控制原语是操作系统提供的一组原子操作,用于实现进程控制。这些原语在执行过程中不会被中断,保证了操作的完整性和正确性。以下是常见的进程控制原语:

  • 通过关中断和开中断指令实现,一般没执行完条指令都会检查是否有中断信号,但是关中断以后不在检查中断信号,开中断以后才会继续检查。

  • 关开中断指令是特权指令只有内核可以调用。

  1. 创建原语(Create)

    • 功能:创建一个新的进程。(用户登录,作业调度,提供服务,应用请求。)

    • 实现:分配一个新的PCB,初始化PCB,将新进程置为就绪状态或运行状态。

  2. 终止原语(Terminate)

    • 功能:结束一个进程的执行。

    • 实现:回收进程所占用的资源,释放PCB,更新系统状态。

  3. 阻塞原语(Block)

    • 功能:将正在运行的进程转变为阻塞状态。

    • 实现:保存当前进程的状态,将其从运行状态转换为阻塞状态,调度另一个进程运行。

  4. 唤醒原语(Wake Up)

    • 功能:将阻塞状态的进程唤醒,转变为就绪状态。

    • 实现:将进程从阻塞队列移至就绪队列,等待调度器调度。

  5. 切换原语(Switch)

    • 功能:在处理器上从一个进程切换到另一个进程。

    • 实现:保存当前进程的上下文(如程序计数器、寄存器等),加载新进程的上下文,并开始执行新进程。

  6. 撤销原语(Abort):

    • **功能:**终止一个进程的执行。回收进程所占用的资源,包括内存、打开的文件、网络连接等。从系统的进程表中移除该进程的进程控制块(PCB)。如果有必要,通知父进程或其他相关进程关于被终止进程的状态。

    • **实现:**保存上下文,资源回收(内存回收:释放进程所占用的内存空间。文件关闭:关闭进程打开的所有文件。设备释放:释放进程所占用的设备资源。网络资源释放:断开进程的所有网络连接。)更新进程表:从进程表中移除被撤销进程的PCB。通知相关进程:如果系统支持进程间通信,可能需要通知父进程或其他相关进程该进程已被撤销。调度决策:如果被撤销的进程是正在运行的进程,操作系统需要调度另一个进程来运行。

这些原语通常由操作系统的内核提供,并且它们的执行是受到保护的,以确保系统的一致性和稳定性。在多任务操作系统中,进程控制原语是管理进程执行的基础。

2.4 进程通信

1.共享存储

共享存储是进程通信的一种方式,分为两种基本形式:

  1. 基于数据结构的共享

    • 允许多个进程共享特定的数据结构,如数组、列表、树等。

    • 为了同步对共享数据结构的访问,通常需要使用同步原语,如互斥锁(mutexes)、信号量(semaphores)等。

    • 这种方式要求共享的数据结构在设计时就要考虑并发访问的问题。

  2. 基于存储区的共享

    • 提供一个共享的存储区域,如共享内存页面,供多个进程读写。

    • 进程可以通过映射同一块物理内存到它们的虚拟地址空间来实现共享。

    • 同样需要同步机制来防止竞态条件。

2.消息传递

消息传递是另一种进程通信方式,分为直接通信方式和间接通信方式:

  • 进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的:”发送消息/接收消息“两个原语进行数据交换。

  1. 直接通信方式

    • 进程通过发送和接收消息直接与另一个进程通信。

    • 操作系统提供发送(send)和接收(receive)原语。

    • 常见的通信模式包括同步通信(发送方阻塞直到接收方接收消息)和异步通信(发送方发送后立即继续执行)。

  2. 间接通信方式

    • 进程通过一个中间实体(如消息队列)进行通信。

    • 任何进程都可以向队列发送消息,也可以从队列接收消息。

    • 消息队列充当了消息的暂存区,允许发送方和接收方不必同时活跃。

3.管道通信

管道是用于连接两个进程之间的一个单向数据流,通常用于父子进程间的通信:

  • 无名管道

    • 只能在具有亲缘关系的进程之间进行通信。

    • 数据在管道中的流动是先进先出的。

    • 一旦数据被读出,它就从管道中被抛弃,无法再次读取。

  • 有名管道(FIFO)

    • 可以在任意两个进程之间进行通信,只要它们知道对方创建的管道名称。

    • FIFO在文件系统中作为特殊文件存在,即使没有亲缘关系的进程也可以通过它进行通信。

  • 注意点

    • 管道只能采用半双工通信,某一段时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。

    • 各进程要互斥地访问管道(由操作系统实现)

    • 当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。

    • 当管道读空时,读进程将阻塞,直到写进程网管道中写入数据,即可唤醒读进程。

    • 管道中的数据一旦被读出,久彻底消失。因此,当多个进程读同一个管道时,可能会错乱。对此,通常有俩种解决方案:(1)一个管道允许多个写进程,一个读进程;(2)允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据。

每种通信机制都有其适用场景和优缺点。共享存储通常用于需要快速通信的场合,但需要复杂的同步机制;消息传递提供了更清晰的接口,但可能比共享存储慢;管道通信是最简单的方式,但它的通信范围和灵活性相对有限。操作系统通常提供了这些机制的不同实现,以便开发者根据具体需求选择合适的通信方式。

Last updated