你必须非常努力,才能看起来毫不费力。
文章目录
- 进程的基本概念
- 描述进程——pcb
- test_struct pcb的一种
- task_struct 内容分类
- 组织进程
- 查看进程
- 通过系统调用获取进程标示符
- 总结
进程的基本概念
课本概念:进程是一个执行实列,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体
上面两个观念呢我们同学们可能会比较难以理解想着那到底什么是进程呢?这里我们要指出首先一个正在被执行的程序是进程,一个正在后台运行的软件也是进程,他们其实都是进程。在这里我想说其实进程真正概念应该是。
***进程=内核pcb的数据结构对象+你自己写的代码。***那么什么是pcb呢?pcb其实就是描述进程的所有属性值的结构,我们的操作系统他是用c语言实现的所以pcb本质上就是一个结构体。在这个pcb结构体中包含着一个指针这个指针用来指向着进程的前后关系那么我们用图画出来就是下图这个关系
首先pcb描述的是一个进程的属性这个属性里面包括了代码和数据,并且有一个指针表述了一个运行的链表,那么最终进程的调度就变成了对链表的增删改查。相信同学们看到这里头脑还是比较懵的但是没有关系我们在接下来会一个一个的解决疑惑。这里同学们只需要记住首先进程的管理也是先描述在组织的,而描述进程的是用一个结构体进行描述的这个结构体的统称为pcb(进程控制模块)在Linux下pcb这个结构体的名字是叫test_strcut(pcb是课本上的一个概念)也就是说test_strcut是pcb的一种不同系统下的不同叫法而已。而进程的调度会转化为数据结构的一种列如栈啊链表啊最终转化为对某一个数据结构的增删改查。
描述进程——pcb
上面一直提到pcb这个名词这里我们做一个系统的学习。
首先我们在上篇文章提到过对任何事务进行管理都是先描述在组织进程也不例外,那么对进程的管理,也是先描述,在描述的时候我们要描述进程的哪些特点呢?这些描述出来的内容放在哪儿呢?这就是我们重点要说的pcb中文名称进程控制块。其实这个进程控制块就是一个进程属性值的集合。
test_struct pcb的一种
在Linux中描述进程的结构体叫做task_struct
tash_struct是Linux内核的一种数据结构,它会被装在RAM(内存)里并且包含着进程的信息。
task_struct 内容分类
- 标示符:描述本进程的唯一标示符,用来区别其他进程。
- 状态:任务状态,退出代码,退出信号等。
优先级:相对于其他进程的优先级。- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块和指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括现实的I/O请求分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息:可能包括处理器时间的总和,使用的时钟数总和,时间限制记帐号等。
- 其他信息
组织进程
可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
查看进程
进程的信息可以通过 /proc 系统文件夹查看
列如想获取pid为1的进程信息你需要查看/proc/1这个文件夹。
大多数进程信息同样可以使用top和ps这些户级工具来获取。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
while(1){
sleep(1);
}
return 0;
}
通过系统调用获取进程标示符
进程id(pid)
父进程的id(ppid)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
总结
通过上面的陈述我们可以知道进程其实就是我们写的代码加上操作系统为描述该进程信息创建的pcb。这两个东西,而我们这里对进程管理的思路正是先描述再组织,也正因此我们的操作系统才会创造pcb进行描述,然后通过组织pcb来实现对进程的管理,就像校长管理学生一样,校长不需要认识所有学生只需要管理描述这个学生的数据就可以了,而不同的进程会有不同的进程描述符也就是pid,pid。