目录
1.什么是进程
一个已经加载到内存中并且正在运行的程序就是进程。
在Windows中,我们可以通过任务管理器来查看正在运行的进程:
在Linux中,可以通过以下指令查看进程:
top //用于实时监控进程
ps axj //用于查看系统中正在运行的进程的详细信息

1.1写一个进程并进行观测
进程就是一个加载到内存中的可执行程序,通过编译下面的代码并运行可执行程序即可
1 #include<stdio.h>
2 #include<unistd.h>
3 int main()
4 {
5 while(1)
6 {
7 printf("这是一个进程!\n");
8 sleep(1);
9 }
10 return 0;
11 }
我们写完上述代码的保存和编译得到的可执行程序都是存储到磁盘中,只有执行mytest(编译得到的可执行程序)才可以加载到内存中,此时就可以得到一个名为mytest的进程,我们可以通过下面的指令进行查看:
ps axj | grep mytest
//ps axj是查看当前所有的正在运行的进程
//通过管道和指令grep将mytest这一进程过滤出来

2.操作系统如何管理进程
操作系统对硬件的管理是先描述再组织,同样对进程的管理也是先描述再组织。操作系统会建立一个结构体用来存储进程的相关属性,然后再将这些结构体通过某种数据结构组织起来,这样操作系统对进程的管理就变成了对数据结构的管理。
2.1描述进程-PCB
任何可执行程序在加载到内存中形成进程时,操作系统会先创建一个结构体对象用来存储该进程的属性,这个对象也被称为进程控制块。课本上将它称为PCB,由于操作系统是由C语言写的,所以PCB本质上是一个struct结构体,在Linux中的PCB是task_struct
注:所有操作系统中的进程控制块都被称为PCB,但不同系统的实现都有差别
2.2组织进程
上面介绍了操作系统是如何描述进程的,下面要将多个进程组织起来。而所有运行在操作系统中的进程都以PCB的形式存储在内核中。
3.Linux系统下的进程
3.1task_struct
task_struct是Linux系统中的PCB,它是操作系统用于管理和控制进程的核心数据结构,记录了进程的所有关键信息。
3.2task_struct内容分类
- 标识符:描述本进程的唯一标识符,用于区别其他进程
- 状态:任务状态,退出代码,退出信号等
- 优先级:相对于其他进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的地址
- 内存指针:包括程序代码和进程相关数据的指针,还有其他进程共享的内存块的指针
- 上下文数据:进程执行时处理器中的寄存器中的数据
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
- 记账信息:可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等
3.3查看进程的相关属性
ps axj | head -1 ; ps axj | grep mytest
//ps axj | head -1用于打印表头信息

注:最下面的那一行是grep命令的进程,这是因为在运行grep指令时,先要将这条指令变成一个进程,它才能被调度。
ls /proc
//查看系统运行时内核和进程的实时信息

proc是Linux系统下的一个目录,开机时操作系统会自动生成对应的目录和文件,而关机时会将该目录内的信息销毁。该目录里面的信息并不是真实存储在磁盘上,而是有内核在运行时动态生成的,用于提供系统运行时内核和进程的实时信息。如上图中,蓝色文件代表每个进程自己的PID,里面存储了相对应进程的属性。

上图中的exe是该进程实际执行的二进制文件路径,即当前进程所对应的可执行程序的路径。cwd是进程运行时的当前工作目录。


1976

被折叠的 条评论
为什么被折叠?



