前言
- 前面的博客中,我们探讨了计算机操作系统的基本概念。
- 本节将深入解析进程的组成、特性,以及状态与转换机制。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的操作系统博客专栏
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482
一、进程的组成
1. 什么是“进程”?
先打个比方:你打开电脑上的“计算器”程序,这个程序开始运行的过程,就是一个 “进程”。
进程就像一个“正在干活的工人”,而它的组成部分,就是这个工人干活时需要的“工具包”“任务清单”和“材料”。
2. 进程的三个核心组成部分
2.1 PCB(进程控制块)—— 进程的“身份证+户口本”
是什么?
PCB是操作系统给每个进程单独创建的一个“小档案”,里面记录了这个进程的所有关键信息,比如:- 进程的“名字”(PID)、当前状态(是在运行、暂停还是排队等着?)
- 它的“优先级”(比如重要的进程优先干活)
- 它占用了哪些“资源”(比如用了多少内存、有没有占用打印机)
- 下一步该执行哪行代码(类似书签,记录进度)。
作用:
操作系统全靠这个“档案”来管理所有进程,比如决定先让哪个进程运行、怎么暂停/恢复进程。类比: 就像老师手里的“学生档案”,记录了每个学生的学号、成绩、座位号,老师靠档案管理学生。
2.2 程序段—— 进程的“任务清单”
是什么?
程序段就是这个进程要执行的“代码”,也就是程序的逻辑步骤。
比如计算器程序的程序段,里面写着“如何计算加法”“如何显示数字”等具体的指令。作用:
告诉计算机“该做什么”,是进程的“灵魂”。不管进程运行多少次,程序段的内容都是固定的(比如计算器的加法逻辑不会自己变)。
类比: 就像工人手里的“操作手册”,上面写着“第一步拧螺丝,第二步插电线”等具体步骤。
2.3 数据段—— 进程的“材料箱”
是什么?
数据段是进程运行时用到的“临时数据”,比如:- 计算器输入的数字(比如你输入的“1+2”)
- 程序运行中的中间结果(比如计算到一半的数值)
- 临时存储的用户设置(比如计算器的“主题颜色”)。
作用:
程序段执行时需要“数据”才能干活,数据段就是存放这些数据的地方。不同进程的数据段是隔离的(比如计算器和微信的数据不会混在一起)。
类比: 就像工人干活时用的“材料箱”,里面装着螺丝、电线、零件等,用完就清空(进程结束后数据段就没了)。
总结
- 当你打开“计算器”程序时,操作系统会创建一个 进程。
- 同时生成一个 PCB(记录这个进程的“身份信息”)。
- 把计算器的“程序代码”(程序段)加载到内存,告诉计算机“按这个逻辑干活”。
- 开辟一块内存空间作为 数据段,用来存放你输入的数字、计算结果等临时数据。
- 操作系统通过PCB管理这个进程,比如你最小化计算器时,PCB会记录它的“暂停状态”,等你恢复时继续运行。
二、进程的特征
1. 动态性
是什么?
进程不是“死的”,而是一个“动态变化的过程”。- 它会“出生”:比如你打开一个软件(程序运行,创建进程)。
- 会“干活”:在内存里执行代码、处理数据。
- 会“死亡”:关闭软件时,进程结束,资源被回收。
- 状态会变:比如从“运行中”变成“暂停”(你最小化窗口时),再变回“运行”。
和程序的区别:
程序是硬盘里的“静态文件”(比如微信安装包),而进程是程序“运行起来的实例”(打开的微信窗口就是一个进程)。
类比: 程序像“剧本”(静态不变),进程像“演员演剧本”(动态表演,有开始和结束)。
2. 并发性
是什么?
多个进程可以“同时存在”于内存中,一起运行(虽然CPU同一时间只能执行一个,但操作系统让它们“轮流快速切换”,看起来像同时进行)。
比如你一边用微信聊天(微信进程),一边用浏览器看网页(浏览器进程),一边听音乐(音乐进程),它们同时在内存里“活着”,只是CPU在它们之间快速切换执行。作用:
让电脑能“一心多用”,提高效率。
类比: 就像老师同时管多个学生:一会儿给A讲题,一会儿给B批改作业,一会儿让C自己做题。虽然同一时间只处理一个,但快速切换,看起来像同时在做。
3. 独立性
是什么?
每个进程都是“独立的个体”,有自己的“私人资源”,互不干扰。- 资源隔离:比如微信进程的内存数据、打开的文件,计算器进程绝对碰不到(操作系统保证它们互相隔离)。
- 地位平等:每个进程都是操作系统分配资源的“基本单位”(比如分配内存、网络权限,都是以进程为单位)。
好处:
一个进程崩溃(比如微信卡死),不会影响其他进程(浏览器还能正常用)。
类比: 每个进程像“独立的房间”,房间里的东西(数据、资源)只有自己能用,别人进不来,也不会被别人的房间影响。
4. 异步性
是什么?
进程按自己的“节奏”运行,操作系统不确定它们的执行顺序,但最终结果正确。- 比如你同时下载文件(下载进程)和写文档(文档进程):
- 下载可能时快时慢(取决于网络),文档编辑也随时可能暂停/继续。
- 操作系统会根据规则(比如优先级)调度它们,但具体先执行谁、执行多久,进程自己不知道(“异步”就是“不同步”,没有严格的顺序)。
- 比如你同时下载文件(下载进程)和写文档(文档进程):
为什么没问题?
操作系统通过PCB记录每个进程的“进度”(比如执行到哪行代码),随时能暂停和恢复,保证最终结果正确。
类比: 像排队买奶茶,每个人点单、制作的速度不同(有人点复杂的奶茶慢,有人点简单的快),店员按规则(比如先来后到)处理,虽然顺序不确定,但最后每个人都能拿到自己的奶茶。
5. 结构性
是什么?
每个进程都必须“标配”三个部分:- PCB(进程控制块):相当于进程的“身份证”,记录它的所有信息(状态、资源、进度等),没有PCB的话,操作系统根本不知道这个进程存在。
- 程序段:进程要执行的代码(做事的逻辑)。
- 数据段:进程运行时用的临时数据(比如你输入的内容、中间结果)。
重点:PCB是进程存在的“唯一标志”!
只要操作系统里有一个进程,就一定有对应的PCB;反之,没有PCB的东西,就不是进程(比如普通的文件、数据)。
类比: 每个进程像一个“完整的人”,必须有“身份证(PCB)”+“大脑(程序段,指挥做事)”+“身体(数据段,存储临时信息)”,缺一不可。
总结:
- 动态性:进程是“活着的、会变的”,有出生、运行、死亡的过程。
- 并发性:多个进程能“同时存在”,一起在电脑里干活(轮流执行)。
- 独立性:每个进程有自己的“私人资源”,互不干扰、互不侵犯。
- 异步性:进程按自己的节奏运行,顺序不确定,但结果正确。
- 结构性:每个进程都必须有“PCB+程序段+数据段”三件套,PCB是它的“身份象征”。
三、进程的状态
1. 创建态
发生了什么?
当你打开一个程序(比如微信),操作系统开始“生”这个进程,分两步:
① 初始化PCB:给进程办“临时身份证”(记录PID、初始状态等基本信息),就像老师给新学生登记学号、座位号。
② 分配资源:给进程分“课桌”(内存空间)、“课本”(程序段代码)、“草稿纸”(数据段临时存储区),但还没让它“正式上课”(占用CPU)。状态特点:
进程刚“诞生”,还没准备好运行,就像学生刚进教室,书包还没放好,老师还没让他开始做题。
2. 就绪态
发生了什么?
进程已经“万事俱备”:PCB办好,资源(内存、文件等)都拿到了,只差CPU“点名”让它运行。
就像学生坐在座位上,课本、笔都摆好了,举手等着老师说:“你来回答问题”(分配CPU时间片)。关键:为什么不直接运行?
因为CPU同一时间只能“辅导”一个学生(执行一个进程),其他准备好的进程只能在“就绪队列”里排队,等CPU轮到自己。
3. 运行态
发生了什么?
CPU选中了这个进程,开始执行它的程序段代码,处理数据段里的数据。
就像老师叫到某个学生的名字,让他上台做题,此时这个学生“独占”老师的注意力(单核CPU下,同一时间只有一个进程在运行)。两种情况会“下讲台”:
① 时间片用完:老师说“你先下去,下一个同学来”(CPU分配的时间到了,进程回到就绪态排队)。
② 主动“请假”:比如进程需要等用户点击按钮(进入阻塞态)。
4. 阻塞态
为什么会阻塞?
进程运行时遇到“等事件”的情况,比如:- 等用户输入(比如你在微信里还没打字,进程没法继续发消息)。
- 等文件读取(比如打开一个大文件,还没读完数据)。
- 等网络响应(比如网页还没加载完)。
这时进程“卡住了”,无法继续执行,只能“暂停”,把CPU让给其他就绪态的进程。
状态特点:
进程就像学生做题时发现“没草稿纸了”,举手跟老师说:“我等你拿纸来,现在先不做了”,然后放下笔,坐在座位上干等(不占用CPU,但保留PCB和资源)。
注意:阻塞态和就绪态的区别:就绪态是“能干活但没轮到”,阻塞态是“想干活但干不了,得等事件发生”。
5. 终止态
为什么会终止?
两种情况:
① 正常结束:进程完成任务(比如你关闭计算器,程序正常退出)。
② 异常终止:进程出错崩溃(比如微信突然卡死,操作系统强制结束它)。操作系统在终止态做什么?
最重要的事:回收资源!- 归还内存(把“课桌”让给其他进程)。
- 关闭打开的文件(把“课本”放回书架)。
- 删除PCB(注销“学生档案”,操作系统不再知道这个进程存在)。
如果不回收,就像学生放学不收拾书包,占着课桌不放,时间长了教室会堆满垃圾(内存泄漏、资源浪费)。
6.状态转换图:
创建态 → 就绪态(准备好,等CPU)
就绪态 → 运行态(CPU选中,开始干活)
运行态 → 就绪态(时间片用完,回去排队)
运行态 → 阻塞态(等事件,被迫暂停)
阻塞态 → 就绪态(事件发生了,比如用户输入了,重新排队等CPU)
运行态/阻塞态 → 终止态(干活结束或出错,放学回家)
总结
- 创建态:进程刚“出生”,正在办身份证、分资源,还没准备好上课。
- 就绪态:进程万事俱备,在“就绪队列”里举手等CPU点名。
- 运行态:进程正在CPU上执行,就像学生在老师面前做题。
- 阻塞态:进程遇到“等事件”卡住了,暂时放下活,等事件好了再继续。
- 终止态:进程下课放学,操作系统回收它的所有资源,从此消失。
四、进程的转换
1.创建态 → 就绪态
- 条件:系统完成创建进程的所有准备(初始化PCB、分好资源)。
- 类比:你走进奶茶店,店员登记完你的信息(创建态),给你号码牌(10号),你去等待区坐着(就绪态)。
2. 就绪态 → 运行态
- 条件:CPU“调度”选中这个进程(店员喊:“10号顾客来点单!”)。
- 关键:就绪态是“排队等CPU”,运行态是“正在用CPU”,必须通过“调度”才能转换(就像必须等店员喊号才能去点单)。
3. 运行态 → 就绪态
- 两种情况:
① 时间片用完:CPU分配给进程的“时间配额”到了(比如店员说:“你先讲到这里,下一位!”),进程回到就绪队列重新排队。
② 主动让步:比如高优先级进程来了,当前进程被迫暂停(比如突然来了VIP顾客,店员让你稍等,先服务VIP)。 - 类比:你点单时,店员说:“你前面还有更急的顾客,先去后面重新排队吧!”你回到等待区(就绪态)。
4. 运行态 → 阻塞态
- 条件:进程需要“等待某个事件”(比如等用户输入、等文件读取、等网络响应)。
- 类比:你点单时发现“忘记带钱包”,只能对店员说:“我等回家拿钱包再来,现在先不买了”,然后站到旁边(阻塞态,不占用店员时间)。
5. 阻塞态 → 就绪态
- 条件:等待的事件发生了(比如你拿到钱包、文件读完了、网络通了)。
- 类比:你拿到钱包回来,店员给你新的号码牌(15号),你回到等待区重新排队(就绪态)。
- 注意:不能直接从阻塞态回到运行态!必须先到就绪态排队,等CPU再次调度(就像你拿完钱包回来,不能直接插队,必须重新排队等喊号)。
6. 运行态 → 终止态
- 两种情况:
① 正常结束:进程跑完所有代码(你点完单、付完款、拿到奶茶,离开店铺)。
② 异常终止:进程遇到错误无法修复(比如点单时系统崩溃,店员说:“今天没法帮你点了,下次再来”)。 - 关键:一旦进入终止态,进程“彻底消失”,资源被回收(你的排队记录被删除,座位被其他顾客占用)。
7. 为什么就绪态不能直接到阻塞态?
- 因为阻塞态的前提是“进程正在运行时遇到了等待事件”,就绪态的进程还没拿到CPU(没开始点单),根本没机会“卡住”。
- 类比:你在等待区排队(就绪态),还没轮到你点单,怎么会中途因为“没带钱包”卡住呢?只有轮到你点单(运行态)时,才可能遇到问题进入阻塞态。
状态转换图:
创建态 → 就绪态(办手续完毕,开始排队)
就绪态 → 运行态(被店员喊号,开始点单)
运行态 → 就绪态(时间到/让步,回去重新排队)
运行态 → 阻塞态(等事件,暂停点单,站到旁边)
阻塞态 → 就绪态(事件完成,重新拿号排队)
运行态 → 终止态(点单结束/出错,离开店铺)
五、进程的组织–链接方式和索引
- 每个进程都有一个PCB(进程控制块,相当于“学生档案”),当电脑运行很多进程时,操作系统需要把这些“档案”有条理地管起来,不然就会乱成一锅粥。
- 主要有两种“管理方法”:链表链接(按状态分组排队)和索引表查找(快速定位某个档案)。
1.PCB的“组织方式”:
1.1 链表链接:给PCB“分组排队
就像学校把学生按“状态”分成“上课组”“排队组”“等待组”,每个组用“链表”串起来,方便按组管理:
1. 执行态PCB:(唯一)
- 特点:同一时间只有一个进程在运行(单核CPU下),操作系统用一个“指针”直接指向这个PCB(比如老师手里的“当前答题学生”牌子)。
- 类比:全班只有一个学生在黑板上做题,老师一眼就能看到他,不需要排队。
2. 就绪队列:
- 结构:所有就绪态的PCB用“指针”连成一个“链表”(每个PCB里有一个“下一个就绪PCB”的地址)。
- 作用:操作系统要选下一个运行的进程时,直接从这个队列里按规则(比如优先级)挑一个,就像老师从“排队名单”里喊下一个学生。
- 类比:等待区的学生每人手里拿一张纸条,上面写着“下一个学生的学号”,连成一条“排队链”,老师按顺序喊人。
3. 阻塞队列:
- 特点:阻塞原因不同(比如等磁盘、等网络),会分成多个阻塞队列。
- 比如“等待磁盘读取”的PCB组成一个队列,“等待用户输入”的组成另一个队列。
- 结构:每个PCB里有一个“阻塞队列指针”,指向同类型阻塞队列的下一个PCB。
- 类比:等待取快递的学生,按“快递类型”分组(比如等课本的一队,等零食的一队),每队用链表连起来,方便快递到了之后统一通知。
2. 索引方式:给PCB“建花名册”,快速查找
光有排队的链表还不够,操作系统需要快速找到某个特定的PCB(比如通过进程ID找对应的档案),这时候就需要“索引表”:
1. 索引表是什么?
- 相当于一个“花名册”,按进程ID(PID,类似学号)排序,每个条目记录“PID”和“对应PCB的地址”。
- 类比:老师手里的班级花名册,按学号排好,每个学号对应一个学生的座位号,老师喊“学号3号”,马上就能找到对应的学生。
2. 为什么需要索引?
- 链表适合“按组管理”(比如就绪队列按顺序调度),但如果要找“某个特定PID的进程”,链表需要从头开始一个个找,很慢。
- 索引表就像“字典”,可以通过PID直接“查字典”找到PCB的位置,速度飞快(比如查学号3号,直接翻到花名册第3页)。
3. 两种方式如何配合?
举个例子:你打开了微信(进程A,PID=100)、浏览器(进程B,PID=200)、音乐播放器(进程C,PID=300)
链表分组:
- 假设当前微信在运行(执行态),浏览器和音乐播放器在就绪队列里排队(链表:B→C)。
- 如果浏览器需要等网络加载网页(进入阻塞态),会被移到“等待网络”的阻塞队列,链表变成:C(就绪),B(阻塞-网络队列)。
索引表查找:
- 操作系统维护一个索引表,条目是:
- PID=100 → PCB_A的地址(微信)
- PID=200 → PCB_B的地址(浏览器)
- PID=300 → PCB_C的地址(音乐播放器)
- 当你想终止浏览器进程时,通过PID=200直接在索引表找到PCB_B,不管它在哪个队列,都能快速定位并操作。
- 操作系统维护一个索引表,条目是:
以上就是对本次关于操作系统博客内容的总结,后续我们将深入探讨操作系统更多知识。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的操作系统博客专栏
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |