--------------------------------------------------------------------------------------------------------------------------------
每日鸡汤:心有多大,舞台就有多大,只有想不到的,没有做不到的。
--------------------------------------------------------------------------------------------------------------------------------
目录
前言
通过前期冯诺依曼的概述,了解计算机所有的软硬件资源都可以通过“先描述,再组织”来对各种资源进行操作,那么操作系统是怎么进行进程管理的呢?当然也是先把进程描述起来(进程结构体),再把进程组织起来(数据结构[链表、二叉树...])。
一:进程概念
一个已经加载到内存中的程序,叫做进程,也叫做任务。
使用 ps ajx 命令查看Linux中所有的任务/进程。
在文件没有运行时,该文件都被存放在磁盘中。例如操作系统,在电脑没有开机时,操作系统存储在磁盘中,开机后,就将操作系统从外设搬到内存中。
即:
可执行程序还没有运行时,这些文件都在磁盘中。当运行myprocess可执行文件(./myprocess)时,就将该可执行文件加载到了内存中,形成进程。
执行该进程,死循环打印Hello Linux
查看该进程:ps ajx | grep myprocess
显示首行查看该进程:ps ajx | head -1 && ps ajx | grep myprocess
并且,一个操作系统,不仅仅只能运行一个程序,可以同时进行多个进程(多道操作系统),所以操作系统必须得将进程管理起来。那么操作系统是怎样将进程管理起来的呢?
二:操作系统管理进程
2.1:描述进程PCB
任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建进程( 属性 )的结构体对象——PCB(process ctrl block)【进程控制块】
就像一个人是怎样辨别认识一个事情或者对象的?答:都是通过属性认识的。当属性足够多,这一堆属性的集合,就是目标对象。【这就是面向对象】
所以,PCB就是进程属性的集合,使用 struct 结构体描述出来。
struct PCB
{
进程编号
进程的状态
优先级
//...
struct PCB* next;
struct PCB* queue;
struct PCB* XXX;
//相关的指针信息 //找到自己对应的代码和数据信息
}
一旦创建进程时,一定要做的核心工作:根据进程的PCB类型,为该进程创建对应的PCB对象。
所以进程包括:1.描述进程的struct结构体(操作系统自动生成的);2.该进程的代码和数据
即所谓的进程 = 内核PCB数据结构对象(描述这个进程的所有的属性值) + 你自己的代码和数据(加载到内存中的可执行程序)
“以学生在学校为例:PCB:学生个人基本信息;代码和数据:学生(人)” 。
2.2:组织系统内进程
对进程管理的本质,就是对创建的PCB数据结构对象进行管理。
即:系统想调度某一个进程时,其实只要找到该进程的PCB,根据PCB内部的“特定指针”找到对应的代码和数据,将其交给CPU中运行。
操作系统内部可能含有多个进程,
所以在操作系统内:
组织:在操作系统中,对进程进行管理,变成了对单链表数据结构的增删改查!即就完成了操作系统对进程的建模。
所以,要让进程进行队列排列,实际上就是对该进程的PCB结构体对象进行排列。
三:Linux系统管理进程
3.1:task_struct(PCB)
Linux操作系统下的PCB是 task_struct。
task_struct是Linux内核的一种数据结构类型(自定义类型),它会被装载到RAM(内存)里并且内部包含有进程的信息。
task_struct 结构体内部的属性非常多。
task_struct内部属性分类:
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
即:
struct task_struct
{
// 标示符: 描述本进程的唯一标示符,用来区别其他进程。
// 状态: 任务状态,退出代码,退出信号等。
// 优先级: 相对于其他进程的优先级。
// 程序计数器: 程序中即将被执行的下一条指令的地址。
// 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
// 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
// I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
// 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
// 其他信息
}
所以之后的学习进程就是学习进程PCB的各个属性。
那么Linux中是如何组织进程的呢?
3.2:Linux中的组织进程
组织进程:Linux内核中,最基本的组织进程task_struct的方式,采用双向链表组织的(主要),还有一些struct PCB* queue(队列)等等
即对进程进行哪种管理工作,取决于将其放入哪种组织的管理队列。
3.3:Linux系统查看进程指令
3.3.1:ps ajx 和ls /proc
在Linux中,`ps ajx` 命令和 `ls /proc` 命令都与进程管理有关,但它们的作用和输出信息的方式有所不同。
3.3.1.1:ps ajx:
主要用途:查看Linux内所有的任务进程,显示当前系统中所有进程的状态。
ps 命令用于显示当前系统中的进程状态。`ajx` 是 `ps` 命令的一组选项,具体含义如下:
- - `a`:显示所有用户的进程(不仅仅是当前用户)。
- - `j`:使用作业控制格式显示进程信息。
- - `x`:显示没有控制终端的进程。
输出情况:包含每个进程的详细信息,如用户、PID、CPU使用率、内存使用率、虚拟内存大小、常驻内存大小、控制终端、进程状态、启动时间、占用的CPU时间以及启动该进程的命令。输出是格式化的表格,易于阅读和理解。
3.3.1.2:ls /proc:
主要用途:ls /proc 查看系统当中所有的进程,列出 `/proc` 文件系统中的所有条目。(在该目录中,每一目录文件的数字就叫做当前进程的PID)。
输出情况:显示 `/proc` 目录下的所有文件和子目录。每个条目通常对应一个进程或其他系统信息(如内核参数、硬件信息等)。输出是简单的文件列表,不包含详细的进程信息。
进入某个进程,查看相应的信息:ls /proc/1552
3.3.2:cwd说明
cwd(current work dir):当前进程的工作目录
先死循环打印Hello Linux,来显示进程后台。
进入该进程,查看相应信息:
发现:cwd -> /home/alin/Linux_2024/2024-10_Linux-study/2024-10-28_Linux-F.neumann
即 cwd 表述的是当前路径。 进程在启动时默认出现 cwd,在当前的路径下。
所以,cwd 功能实例:
本来该文件内部是没有test.txt文本文件的.
当运行该进程时:默认在cwd当前目录下创建该test.txt文件。
标签:ps,操作系统,学习,PCB,Linux,进程,struct From: https://blog.csdn.net/2302_78684687/article/details/143647557