多进程图像的起源与核心地位
上节课我们开启了对操作系统核心概念------多进程图像的学习,探讨了其产生的原因。操作系统的核心职责之一是管理CPU,CPU作为实现取指执行的硬件自动化部件,只有执行取指操作(即取出并执行程序指令 )才能开始工作。由于执行中的程序与静态程序存在本质差异,我们引入"进程"概念。简单来说,启动一个进程让CPU运行,CPU便开始工作,但为提升CPU工作效率,需多个进程交替执行,这种交替执行的状态就是多进程图像。
上节课已明晰多进程图像的基本形态与成因,今天将深入探究操作系统如何支持多进程图像,主要涵盖两个方面:其一,多进程图像的具体模样,能否以图形呈现,如何观察与捕捉,稍后将通过实例展示操作系统中的多进程图像;其二,操作系统为实现多进程图像需完成的关键任务,我们先简要概述,后续课程详细展开。多进程图像作为操作系统核心,若得到有效支持,操作系统的主体功能便得以实现,后续诸多内容将围绕此核心展开,今天先做宏观铺垫。
多进程图像的直观呈现
接下来,我们认识一下操作系统中多进程图像的具体形态。从直观角度,多进程图像即多个进程同时运行的状态,可用图形简单示意。例如,绘制三条直线分别代表三个进程,每个进程标注唯一ID与对应名称 ,如下图所示:
从上层用户视角,系统中存在ID为1、2、3的三个进程,用户可将其与具体应用关联,如ID为1的进程对应PPT程序,ID为2的对应Word程序,ID为3的对应MP3播放器。用户使用计算机的过程,本质就是启动这些进程,这便是多进程图像给用户的直观感受。
在操作系统底层,启动进程后需对其进行管理与记录。操作系统通过创建PCB(进程控制块)结构体实现这一目的,每个PCB记录对应进程的运行状态、执行进度等关键信息。基于这些信息,操作系统能合理有序推进进程,例如MP3播放结束后及时切换到PPT演示。
底层操作系统借助PCB有序推进多个进程,使用户感知到多进程同时运行,计算机得以高效利用,满足用户需求,这便是多进程图像的完整呈现。用户通常关注进程执行效率,若进程运行缓慢或卡顿,将影响使用体验。因此,多进程图像对用户与操作系统至关重要,是操作系统的核心所在。此外,多进程图像贯穿系统启动到关机的整个生命周期,进一步佐证了其核心地位。
系统启动时,最后执行main.c中的main函数,随后执行fork函数。main函数完成初始化并执行一系列init函数后,通过fork系统调用启动新进程,新进程执行init,最终执行shell(Windows系统中则是启动桌面 )。用户使用计算机时,每输入一条命令,操作系统便创建新进程执行该任务,如执行ls命令就创建对应进程。用户执行任务的过程,本质是操作系统创建进程完成任务,任务结束后,shell继续等待下一个任务,期间可能启动更多进程。计算机解决实际问题依赖进程的启动与执行,进程推进效果直接决定任务执行优劣。
以Windows系统为例,打开任务管理器,可直观看到众多进程,每个进程名称对应启动的程序或任务,如explorer对应浏览器,taskmgr对应任务管理器(任务管理器本身也是一个进程)。在此界面中,能清晰观察到系统中进程的运行状态,它们不断推进、执行,新进程持续创建,部分后台系统服务进程也在运行。当计算机运行缓慢时,通过任务管理器查看CPU利用率高的进程,是排查问题的有效方式,这也体现了多进程图像在操作系统中的核心地位------用户使用计算机本质是多进程协同工作,计算机性能问题常与进程运行状态相关。用户使用计算机时无需关注硬件细节,启动相应进程即可完成任务,结束进程则可停止操作,操作系统通过管理进程实现对计算机使用的控制。
操作系统支持多进程图像的关键任务
进程的组织与状态管理
操作系统对进程的感知与组织完全依赖PCB,通过PCB构建队列等数据结构实现多进程管理。合理组织进程是确保其有序推进、计算机正常运行的基础。不同状态的进程,其PCB存放在不同队列,如就绪队列、等待队列。由于CPU同一时间仅能执行一个进程,其他进程要么在就绪队列等待调度,要么处于等待状态(如等待磁盘读写 )。
可依据进程状态将其分为运行态、就绪态和等待态(阻塞态),类比食堂打饭场景:正在打饭的人对应运行态进程,排队等待的人对应就绪态进程,因寻找饭卡等原因暂停的人对应等待态进程。通过绘制进程状态转化图 ,可清晰呈现进程状态变化过程:就绪态进程经操作系统调度变为运行态;运行态进程遇资源等待情况(如找不到饭卡 )转变为阻塞态;阻塞态进程在等待事件完成后,被操作系统放回就绪队列,在合适时机再次进入运行态,实现进程持续推进。
进程的交替与调度
多个进程交替推进是多进程图像的关键,切换机制则是核心。若无进程切换,多进程图像便失去意义。以进程启动磁盘读写为例,启动后进程需等待磁盘操作完成,此时变为阻塞态,操作系统将其放入阻塞磁盘等待队列。
进程切换的核心是schedule函数,负责完成上下文切换。切换时,先从就绪队列选择下一个进程,再依据当前进程与下一个进程的PCB进行操作。从就绪队列选择进程的过程称为调度,后续课程将详细讲解调度策略,此处先介绍两种简单方法:一是先来先服务(FIFO)调度,如同食堂排队,先到者先接受服务;二是优先级调度,例如银行中短任务可优先执行。
进程切换类似看书时被打断,需先保存当前进程执行现场(存入结构体 ),如同记住书看到的位置,再恢复下一个进程状态信息到CPU,完成切换。因需精确控制,此过程通常需使用汇编代码,C代码难以实现。
进程间的相互影响与处理
多个进程同时存在于内存中,只有内存中的进程可被CPU取指执行,但这会引发一系列问题。例如,进程一代码将ax置为100,该地址可能与进程二内存地址冲突,导致进程二数据被修改甚至崩溃。由于用户态程序中dpi(数据项指针)和cpi(控制项指针)访问无限制,无法通过常规方式解决。
解决内存冲突的方法是通过映射表实现地址分离,每个进程拥有独立映射表。
例如,进程一逻辑地址100对应物理内存地址780,进程二逻辑地址100对应物理内存地址1260,即便进程中地址相同,映射到物理内存后也相互独立,实现内存分离,确保多进程安全共存与交替执行。
此外,多进程间有时需合作,如打印进程。Word程序将打印内容写入打印队列,打印进程再从队列读取内容打印,这便是进程间合作。若缺乏有效管理,多进程交替执行可能引发混乱。例如,进程一和进程二同时发现打印队列第7个位置空闲并写入内容,将导致数据混乱。
此问题可抽象为生产者 - 消费者问题,生产者进程向共享缓冲区写入内容,消费者进程从中读取。为确保二者有序合作,引入共享变量counter记录缓冲区状态。当缓冲区满(counter等于buffsize )时,生产者进程进入死循环等待;缓冲区未满时,生产者可写入并更新counter。
多进程交替执行时,counter操作易出现问题。例如,初始counter等于5,生产者执行counter加1,消费者执行counter减1,因进程执行可能被中断切换,可能导致counter实际值与预期不符。
解决此问题需使用进程同步机制,如生产者操作counter前上锁,确保操作期间不被其他进程中断,操作完成后解锁,此时消费者方可进行操作,实现进程间有序合作。
本次课程介绍了多进程图像的概念、表现形式,阐述了操作系统通过PCB感知与管理进程的方式,明确其在操作系统中的核心地位,并结合Windows系统任务管理器实例展示。同时,探讨了操作系统支持多进程图像需解决的关键问题,包括进程组织、交替调度、地址分离和同步合作等,这些内容将在后续课程深入讲解。