pcb、僵尸进程、孤儿进程

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;
  	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值