pcb的引出:
程序运行起来被加载到内存中,且计算机可能运行很多进程,而且每个进程之间又相互独立互不影响;那么操作系统又是如何管理这些进程的;这是因为操作系统将进程的信息都存放在一个结构体中;而操作系统通过这个结构体对进程的信息的描述来管理进程;这个结构体叫pcb;
pcb --进程信息块(process control block) 在Linux 操作系统中的pcb是struct task_struck结构体(双向链表组织的);task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
pcb中都包含了哪些进程信息:
- 进程ID:每个进程都有唯一的进程ID,计算机可能存在多个进程,这些进程都有唯一标识符。
- 内存描述符:mm_struct结构体的地址
- 程序计数器:保存代码如今运行到哪个位置,下步即将运行代码指令位置。
- 上下文数据:多个进程之间可能会相互进行切换,但是又必须记住该进程切换之前的相关信息,所以需要有上下文记录它。
- 进程优先级:.操作系统会调度进程执行相关操作,调度这些进程先后顺序,所以里面应该含有表示进程优先级的数据。
- 进程状态:进程如今是哪种状态
- I/O状态信息;
- 信号相关信息;
- 记账信息:
僵尸进程:
僵尸进程:处于僵死状态的进程,进程退出了,但是资源没有完全释放会产生资源泄露;
僵尸进程产生原因:子进程先于父进程退出,因为pcb中还保存退出原因,因此操作系统不能直接释放所有资源,通知父进程获取退出原因,允许操作系统释放资源,但是父进程没有关注这个通知导致子进程退出后无法释放。
孤儿进程:
父进程先与子进程退出(这时子进程跑到后台运行变成孤儿进程),孤儿进程的父进程变成1号进程(1号进程相当于孤儿院;接纳所有的孤儿进程;孤儿进程退出后不会变成僵尸进程)。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid==0)
{//子进程
printf("i am chile:%d\n",getpid());
sleep(10);
exit(0);//形成僵尸进程
}
else
{//符进程
printf("i am parent:%d\n",getpid());
sleep(10);
//exit(0);//父进程退出;形成孤儿进程
}
return 0;
}
来源:https://blog.csdn.net/weixin_44862316/article/details/100121101