【Linux】你知道你的电脑为你做了哪些事吗?

det365娱乐官网登录 🌸 2026-02-11 00:36:41 🎨 admin 👁️ 1214 ❤️ 240
【Linux】你知道你的电脑为你做了哪些事吗?

目录

​编辑

一、概念

二、task_struct

三、总结

前言:

⏩️本文全文都在谈论操作系统的进程,围绕着什么进程?,进程是怎么来的?进程是怎么创建的三个问题来讲述,内容有点干,请准备好水!不过可以肯定是看完这篇博客你对进程的理解会更深一层;好了把你的大脑调动起来,本文开始咯!!

一、概念 ⏩️书本概念进程:运行起来的程序,内存中的程序。

⏩️程序和可执行文件是一回事,指令的本质也是程序。

⏩️什么是进程?

💡答:我们的操作系统内能同时运行多个程序,每个都要加载到内存,那么一定会同时存在很多个进程(分配内存、网络等),这些进程会被操作系统管理起来,既然是管理,那么一定要先描述,再组织,也就是说在操作系统内先描述(用结构体)一个进程,最后用STL管理起来;总结:程序先加载到内存,这时候操作系统为了完成程序任务创建一个描述该进程的结构体(包含进程的所有信息),这个结构体一定能找到可执行程序(代码数据),这时候可能存在多个进程,真正把你的程序组织起来不是把你的程序组织起来而是把你的结构体组织起来,选择一个进程不是选择程序而是选择一个结构体,所以:进程 = 内核数据结构(PCB) + 自己程序的代码和数据!!而用结构体来描述的对象称之为PCB,在 Linux 中是 struct task_struct。

❌️注意:struct task_struct 是 PCB 中的一种。我们在手机上点击软件或者在电脑上双击软件本质上就是启动进程。

⏩️什么不是进程?

💡答:在磁盘中的程序(文件)不是进程。

⏩️那么 task_struct 里面有些什么呢?我们接着往下看。

二、task_struct⏩️task_struct 包含:

🚩• 标⽰符: 描述本进程的唯⼀标⽰符,⽤来区别其他进程。

🚩• 状态: 任务状态,退出代码,退出信号等。

🚩• 优先级: 相对于其他进程的优先级。

🚩• 程序计数器: 程序中即将被执⾏的下⼀条指令的地址。

🚩• 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

🚩• 上下⽂数据: 进程执⾏时处理器的寄存器中的数据。

🚩• I/O状态信息: 包括显⽰的I/O请求,分配给进程的I/O设备和被进程使⽤的⽂件列表。

🚩• 记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。

🚩• 其他信息 。

⏩️问题:为什么存在优先级?💡答:因为资源是有限的。

⏩️问题:程序计数器的作用是什么?

💡答:CPU内有大量的寄存器,这些数据会保存程序执行过程中的各种临时数据。请看下面⏩️代码:

int add(int x,int y) { int z = x + y; return z; } int main() { int ret = add(1,4); return 0; } ⏩️问题:z 是临时变量,只在 add 内有效,那么 ret 是怎么接收 z 的值的?

💡答:CPU 会把 x 和 y 保存在寄存器中,这时CPU知道进行的是加法运算,就把 x + y 的结果也存储到寄存器中,return时就会把 z 的值 mov 给 ret。

⏩️问题:在执行代码中CPU是不是一口气直接执行完的,可以暂停、切换等,那么CPU暂停之后再回来执行代码它是怎么知道执行到哪一行的呢?

💡答:CPU存在一个寄存器:EIP/PC(程序计数器),它指向执行下一条指令的地址。

⏩️问题:一个进程执行代码占用CPU资源会把自己的代码执行完才放弃CPU吗?什么是上下文数据?

💡答:不是。原因:当代的计算机都会给每个进程分配一个时间片,时间片执行完毕就会自动让出 CPU,让另一个进程执行。就是说假设有十个进程,给每个进程分配10ms的时间片,当一个进程在CPU中执行10ms就会被CPU剥离下来,让下一个进程执行,这种现象是基于时间片的轮转调度。所以一个进程时间片用完了就会存在进程切换和调度的动作。那么当一个进程时间片用完之后进行进程切换,过了一会又执行该进程是不会重新执行这个进程的,因为进程在切换时就会保存对应的CPU内的寄存器的临时数据,这些临时数据就是上下文数据(包含EIP)。

❌️注意:上下文数据指的是:进程切换时保存对应的CPU的寄存器的临时数据,不是寄存器,保存的不是寄存器!!!是数据。因为CPU的寄存器硬件只有一套,这些寄存器可以在不同的时间段保存不同进程的数据!结论:CPU内的寄存器只有一套,但上下文数据可以有多套分别对应不同的进程。就是说这一套寄存器可以存储不同进程的临时数据。

⏩️问题:一个进程是怎么获取自己的标志符的?

💡答:通过系统调用获取自己的 task_struct 结构内部的属性值。如图:

⏩️程序运行起来:

⏩️我们可以在 xshell 里面查看:

⏩️在xshell里面输入命令:

ps axj | head -1;ps axj | grep process⏩️如果停止该进程之后再运行 pid 跟之前是不一样的:

三、总结 ⏩️看到这里的博友非常厉害了,全文全都是文字讲解,换我都不一定有耐心看完。相信看到这里的博友还意犹未尽,当然本文还没有讲解完,剩下的知识留到下篇博客来讲解。

⏩️哦!对了,各位优秀的程序员觉得我博客给你带来帮助或者让你学到了知识,记得给博主一个关注哦~❤️❤️❤️

各位博友,下篇博客见🍁🍁🍁

相关推荐

熬夜必追!10部超燃兄妹档动漫,每一部都让人欲罢不能
det365娱乐官网登录

熬夜必追!10部超燃兄妹档动漫,每一部都让人欲罢不能

📅 08-10 👁️ 9257
9月1日是什么星座
det365娱乐官网登录

9月1日是什么星座

📅 08-05 👁️ 4465