1. 进程基本概念
当一个可执行程序被加载到内存当中,并由操作系统将其管理起来,此时这个程序就被称之为进程。也就是下方的:
程序的一个执行实例,正在执行的程序等
担当分配系统资源(CPU时间,内存)的实体
这样解释相信大家也只是看看,对于其本质并没有什么理解,所以我用一个问题的方式来为大家解惑。
首先,我们知道一个或者多个可执行程序被存储在磁盘当中,然后我们执行这个可执行程序,这个程序的数据和信息被加载到了内存当中,那么此时,这和程序变为了进程吗?
没有!记得我开始说的吗?可执行程序被加载到内存当中,这个操作系统被管理起来才算是进程,而我们刚才的操作只完成了第一步,也就是将程序加载到内存当中,那么这个程序当然还不是进程。
那么重点就来了,这个被管理的过程是如何做的呢?
其实操作系统会对每一个被加载进入程序抽象化,并提取进程的属性,形成一个结构,并将这些结构以特定的数据结构组织起来进行管理。这里抽象描述进程的东西就是->PCB。
也就是说进程 = 内核关于进程的相关数据结构 + 当前进程的代码和数据。
2. 描述进程-PCB
所有被描述的程序信息都被存放到了一个叫做进程控制块的数据结构当中,我们可以理解为进程属性的集合。
我们都知道每一个程序也就是文件都是由内容和属性组成,而每一个PCB结构体都是通过描述这些程序的数据和信息而得来的,那么文件的属性和进程属性有关联吗?
答案是,有关联但是并不大,其实进程属性是由操作系统为了管理这些结构体主动为其添加的,并不是从文件属性中获取的,但是也不是所有信息都没有记录,它里面记录了文件的名字和路径这些信息,所以说他有关联但是不大。
在Linux操作系统下的PCB是task_struct。它里面记录的信息大致为下:
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
透过里面的信息我们可以更清楚地了解为什么要有PCB的存在,那就是为了更好的描述进程的属性和更好的管理起来。
下图为一个程序变为进程的过程:
3. 查看进程
首先我们先在Liunx中写一个简单的C语言程序。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4 int main()
5 {
6 while(1)
7 {
8 printf("hello world\n");
9 sleep(1);
10 }
11
12 return 0;
13 }
然后运行起来。效果如下
另外开辟一个页面,输入指令
ps axj | head -1 && ps axj | grep myproc
便可得到下方的信息。
可以看到我们的进程正在执行,记住上面的PID,我们去Linux根目录下的/proc目录中查找这个PID。
当然这个进程的PID并不是固定的,它是随时更改的。
当我重新运行这个程序,它的PID也随之而改变,那么也就证明了进程是动态的。
以上就是我对进程的初步理解,说实话这一部分是真的很难,我写这篇博客也只是我对于这一片知识的理解,能够帮到大家最好,希望大家一起努力。