Linux操作系统从入门到实战(十七)进程与进程基本概念
Linux操作系统从入门到实战(十七)进程与进程基本概念
- 前言
- 一、什么是进程?
- 二、系统里的进程谁来管理?
- 三、管理进程的信息:PCB
- 四、所以,进程到底是什么?
- 五、Linux里的PCB:struct task_struct
- 六、进程“排队”,其实是PCB在排队
- 七、task_struct
- 1. task_struct是什么?
- 1.1 标识符(PID,进程ID)
- 1.2 状态
- 1.3 优先级
- 1.4 程序计数器(PC)
- 1.5 内存指针
- 1.6 上下文数据
- 1.7 I/O状态信息
- 1.8 记账信息:进程的“资源账单”
前言
- 上一篇博客里,我们讲解了冯诺依曼体系结构,操作系统与系统调用和库函数概念
- 这篇博客我们开始讲解进程与进程基本概念
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482
一、什么是进程?
- 我们打开电脑,可能同时在刷浏览器、聊微信、听音乐——这些正在运行的程序,其实就是“进程”。
简单说:进程就是“正在干活的程序”。
比如你双击“微信”图标,程序启动后开始接收消息、显示界面,这时候“微信”就从一个躺在硬盘里的“死程序”,变成了一个“活的进程”。
二、系统里的进程谁来管理?
我们想一下,电脑里可能同时跑着十几个甚至几十个进程:
浏览器开了5个标签页(可能对应5个进程)、后台还有杀毒软件、输入法、云同步工具……这么多“干活的程序”挤在一起,要是没人管,岂不是乱套了?
就像学校里有几百个学生,总得有老师管纪律、安排座位、分配资源(比如教室、操场),不然大家各干各的,肯定一团糟。
- 电脑里管这些进程的“老师”,就是操作系统(比如Windows、Linux)。
- 操作系统的核心工作之一,就是把这些进程管好:谁先运行、谁后运行、谁能用多少内存、谁能访问硬盘……
三、管理进程的信息:PCB
操作系统要管这么多进程,总得记点信息吧?
- 比如:这个进程叫啥?现在运行到哪一步了?用了多少内存?有没有在等什么资源(比如等你输入密码)?
这些信息总得有个地方存,这个“存信息的地方”,就叫PCB(进程控制块)。你可以把它理解成操作系统给每个进程发的“小本本”,上面记着所有管理这个进程需要的关键信息。
那进程本身呢?除了这个“小本本”,进程还有两部分核心内容:
- 代码:就是程序本身的逻辑(比如微信怎么接收消息、怎么显示界面的规则);
- 数据:就是程序运行中产生的临时内容(比如你刚收到的消息文字、正在输入的内容)。
四、所以,进程到底是什么?
进程 = PCB + 代码和数据)
五、Linux里的PCB:struct task_struct
- 刚才说的PCB是个“概念”,在具体的操作系统里,它有具体的形式。
- 比如在Linux系统里,PCB是用一个叫struct task_struct的“结构体”(可以理解成一个固定格式的表格)来实现的。这个“表格”里记着进程ID、状态(运行中/等待中)、占用的内存地址等几十项信息,Linux就是靠它来管理所有进程的。
六、进程“排队”,其实是PCB在排队
-
有时候,多个进程要抢着用CPU(比如你一边听歌一边写文档,两个进程都想让CPU处理自己的任务),这时候操作系统就得让它们“排队”,按顺序来。
-
进程排队,不是代码和数据在排队,而是它们的PCB在排队。
举个例子:
HR招聘时,一堆求职者来面试,HR不会让所有人挤在门口排队,而是把大家的简历(相当于PCB)按顺序排好,按简历顺序叫人。简历上记着每个人的名字、技能、应聘岗位(就像PCB记着进程信息),HR通过管理简历来安排面试,而不是直接拽着人排队。
进程排队也是一样:操作系统把所有进程的PCB(比如Linux里的struct task_struct)放进一个“队列”(数据结构里的排队形式),需要调度时,就从队列里拿出一个PCB,根据上面的信息找到对应的代码和数据,让CPU去运行。
-
本质上,就是把PCB从一个队列移到另一个队列(比如从“等待队列”移到“运行队列”)。
-
进程不只是“运行的程序”,它还带着操作系统给它PCB;操作系统靠这个PCB管着所有进程,包括让它们排队、分配资源。
七、task_struct
1. task_struct是什么?
- 前面我们说过说过,Linux系统里的PCB叫
struct task_struct
。 - 它就像给每个进程建了个“万能档案袋”,里面塞满了管理进程需要的所有信息。
而且,系统里所有进程的task_struct
不是乱堆的,而是像串珠子一样,用双链表串起来(就像把所有档案袋按顺序串成一串)。这样操作系统想找哪个进程的信息时,顺着链表一个个翻就行,特别方便。
- 这个task_struct 里到底有什么?
1.1 标识符(PID,进程ID)
作用:给每个进程发个唯一的“身份证号”,确保系统能精准找到它。
例子:就像班里每个学生都有唯一学号,老师喊“35号”,只有对应学生会应答。你打开电脑的“任务管理器”,里面每个进程后面的数字(比如“微信.exe 1234”)就是PID,系统靠它区分“微信”和“浏览器”,绝不会弄混。
1.2 状态
作用:记录进程当前“在干嘛”,以及结束时的“结果”。
进程状态常见的有:
- 运行中(正在被CPU处理);
- 暂停/等待中(比如等你输入密码,暂时没干活);
- 已结束(程序关闭了)。
结束时还会留下“退出代码”(比如正常结束是0,出错可能是其他数字)或“退出信号”(比如被强行关闭的信号13)。
例子:你用视频软件看剧时,它是“运行中”;最小化到后台暂停播放,就是“暂停状态”;点叉关闭,就是“已结束”。如果闪退,系统会记下“退出信号”,方便查错。
1.3 优先级
作用:给进程排个“紧急程度”,高优先级的先让CPU处理。
例子:就像医院急诊室,救护车送来的重症病人(高优先级)不用排队,先治疗;普通病人(低优先级)按顺序等。电脑里也一样:系统核心进程(比如内存管理)优先级最高,就算你玩游戏时,它也能优先占用CPU,保证电脑不卡。
1.4 程序计数器(PC)
作用:记录进程“下一条要执行的指令在内存中的位置”。
这里得先简单说下CPU、PC和指令的关系:CPU是“干活的工人”,进程的代码是“工作步骤清单”,PC就是“工人当前看到清单的哪一行”。CPU每次按PC指的位置取指令执行,执行完后PC自动跳到下一行。
例子:你写作业时突然被叫去吃饭,用书签夹在当前页(PC的作用),回来就能从书签处继续写。进程被暂停时,PC会记下“下一条指令在哪”,恢复运行时CPU就知道从哪开始,不会乱套。
1.5 内存指针
作用:告诉系统“进程的代码、数据、共享文件存在内存的哪个角落”。
例子:你把课本(代码)放在书桌抽屉A,笔记本(数据)放在抽屉B,和同学共享的复习资料(共享内存)放在抽屉C。内存指针就是这些抽屉的“地址标签”,系统按标签找东西,不会翻错地方。
1.6 上下文数据
作用:保存进程运行时,CPU内部“小盒子”(寄存器)里的临时数据。
寄存器是CPU自带的超高速存储(比内存快得多),进程运行时会用它存临时结果(比如计算到一半的数字)。
- 但CPU的寄存器只有一套,切换进程时必须先把这些“临时笔记”存到
task_struct
里(保存上下文),换另一个进程时再把它的“笔记”读回寄存器(恢复上下文)。
例子:你用计算器算题时,突然被老师叫去黑板做题,得先记下计算器上显示的数字(保存上下文),回来才能接着算。如果不记,回来计算器清零了,之前的步骤全白做了。
1.7 I/O状态信息
作用:记录进程正在用哪些外部设备(键盘、硬盘、打印机),以及打开了哪些文件。
例子:我们用Word写作文时,Word进程会“霸占”键盘(你输入文字时,其他程序抢不走)、占用硬盘(保存文件),并在task_struct
里记下“正在编辑D盘的作文.docx”。
- 这样系统就知道:这键盘和文件正被Word用,别让其他程序捣乱。
1.8 记账信息:进程的“资源账单”
作用:统计进程用了多少系统资源(比如CPU跑了多久、占了多少内存、用了多少流量)。
例子:就像手机会记每个APP用了多少电和流量,系统靠记账信息判断:如果某个进程偷偷占了90%的CPU(比如恶意软件),就可以限制它;如果是付费服务器,还能按“账单”收费。
以上就是这篇博客的全部内容,下一篇我们将继续探索Linux的更多精彩内容。
我的个人主页
欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |