pcb、僵尸进程、孤儿进程

一个人想着一个人 提交于 2019-11-28 20:12:30

pcb的引出:
程序运行起来被加载到内存中,且计算机可能运行很多进程,而且每个进程之间又相互独立互不影响;那么操作系统又是如何管理这些进程的;这是因为操作系统将进程的信息都存放在一个结构体中;而操作系统通过这个结构体对进程的信息的描述来管理进程;这个结构体叫pcb;
pcb --进程信息块(process control block) 在Linux 操作系统中的pcb是struct task_struck结构体(双向链表组织的);task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
pcb中都包含了哪些进程信息:

  1. 进程ID:每个进程都有唯一的进程ID,计算机可能存在多个进程,这些进程都有唯一标识符。
  2. 内存描述符:mm_struct结构体的地址
  3. 程序计数器:保存代码如今运行到哪个位置,下步即将运行代码指令位置。
  4. 上下文数据:多个进程之间可能会相互进行切换,但是又必须记住该进程切换之前的相关信息,所以需要有上下文记录它。
  5. 进程优先级:.操作系统会调度进程执行相关操作,调度这些进程先后顺序,所以里面应该含有表示进程优先级的数据。
  6. 进程状态:进程如今是哪种状态
  7. I/O状态信息;
  8. 信号相关信息;
  9. 记账信息:

僵尸进程:

僵尸进程:处于僵死状态的进程,进程退出了,但是资源没有完全释放会产生资源泄露;

僵尸进程产生原因:子进程先于父进程退出,因为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;
  	}


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!