【Linux进程一】进程的概念
1.认识PCB(系统如何管理进程?)
冯诺依曼体系中讲到,管理的本质是管理数据,要先描述再组织
在内存中,系统如何管理进程呢?
- 先描述:创建一个结构体,将进程的数据储存进去
struct data
{
//id
//代码地址
//状态
//优先级
struct data next*;
}
这样的一个结构体叫做PCB(进程控制块)
PCB是这样的结构体的总称,在Linux系统下,PCB具体叫做struct task_struct
- 再组织:用链表等数据结构将结构体链接起来
系统对进程的管理就变成了对链表的增删查改
2.进程队列
当进程在链表中时,会等待CPU寻找PCB处理,而CPU不能同时处理多个进程,因此需要进程排队,这就是进程队列
在内存中,一个PCB进程控制块可同时位于多个数据结构中
比如PCB既在管理PCB的链表上,又在进程队列中
3.进程标识符pid
为了观察一个进程,我们先写一个死循环
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
{
printf("我是一个进程\n");
sleep(1);
}
return 0;
}
再将此会话打卡第二个窗口,登陆后输入
ps ajx | head -1 && ps sjx | grep mybin
便可观察到进程的pid了(左边窗口会执行死循环一直打印,右窗口观察)
可以看到这个死循环mybin的pid是735589
第二个红色mybin是grep指令形成的mybin文件
4.终止进程
平时我们常用ctrl + c
来终止进程,这只能在运行程序的地方使用,并且只能在前台结束进程,对后台进程无效
因此我们可以用进程pid直接杀掉进程:kill -9 pid
(将pid替换为进程的pid即可)
5.自动获取pid
写代码时,想要运行的程序自动获取自己的pid,就不能用ps指令了
c语言中有一个函数是getpid()
,可以获取本身进程的pid
6.父进程
当使用ps指令查看进程的pid时,我们还可以在首列看到一个ppid,这就是父进程
在程序中想查看本身的父进程ppid,可使用函数getppid()
我们发现每次进程的ppid是不变的,因为在命令行中父进程一般是命令行解释器bash
命令行中启动的进程都是由bash为父进程模拟创建子进程的
将在下章详细讲述父子进程的关系