Linux学习日记之进程相关概念

进程:

        可以简单理解为运行中的程序

        程序无非就是一些代码和数据,那运行起来之后的程序呢,在操作系统中是如何存在的?

程序一经运行,成为进程,带上原有的代码段和数据段开始在操作系统中运转起来

形象的来说,不妨比作一个人呱呱坠地后,带着自己的肉体和精神开始在世界上旅行,在这个社会体系之下,每个人都会有自己的一份档案,记录着关于自己的信息。

对于进程来说,这个档案就是PCB(Process Control Block)进程控制块,这个进程控制块包含着对这个进程的描述信息

PID:进程的ID号,可以类比人的身份证号

处理机的信息(通用寄存器,指令计数器,PSW,用户的栈指针)

进程调度信息(进程状态进程的优先级,进程调度所需的其它信息,事件)

进程控制信息(程序的数据的地址,资源清单,进程同步和通信机制,链接指针)

PCB是进程存在的唯一标识,系统通过PCB的存在而感知进程的存在,一旦PCB回收了,那么进程也就消亡了

进程的状态:

就绪态、运行态和阻塞态

Linux下的进程状态:

运行态:包含了就绪态和运行态,正在运行的和拿到时间片就可运行的都称为运行态

可中断休眠态:休眠态,一种暂时不需要被调度运行的状态(休眠状态是可以被打断进入运行态,或条件满足自动唤醒进入运行态)

不可中断休眠态:休眠态,一种暂时不需要被调度运行的状态(休眠状态不可以被打断进入运行态,只能等待条件满足自动唤醒进入运行态)

停止状态:一种能被调度,但是什么都不做的状态

僵尸态:进程运行退出了,进程资源没有被完全释放的一种状态

僵尸进程:僵尸态的进程,进程退出了但是进程资源没有完全释放,是一种待处理状态

僵尸进程危害极大:资源泄露:内存资源,占用的进程数量资源

僵尸进程的产生:子进程先于父进程退出,退出前通知父进程,但是父进程没有对子进程的退出前通知做出响应处理,子进程的资源无法被完全释放,处于僵尸态称为僵尸进程
以下代码实现僵尸进程:

#include<unistd.h>//fork的头文件
  3 #include<stdlib.h>//exit的头文件
  4 using namespace std;
  5 int main()
  6 {
  7   int value=0;
  8   cout<<"This is a Zombie process"<<endl;
  9   pid_t ret=fork();//fork创建子进程,通过返回值进行代码分流
 10   if(ret>0)//对于父进程返回子进程的进程ID
 11   {
 12     value=999;
 13     cout<<"This is parent"<<endl;
 14     cout<<"parent value:"<<value<<endl;
 15   }
 16   else if(ret==0)//对于子进程返回0
 17   {
 18     value=111;
 19     cout<<"This is child"<<endl;
 20     cout<<"child value:"<<value<<endl;
 21     exit(0);//令子进程退出
 22   }
 23   else {//否则创建失败
 24     cout<<"子进程创建失败"<<endl;
 25   }
 26   cout<<"hello hello"<<endl;
 27   while(1)//父进程继续向下执行这个死循环                                                                                                                    
 28   {
 29     sleep(1);
 30   }
 31   return 0;
 32 }

进程查看指令:ps-ef 或 ps-aux ps(process show)显示进程信息

UID:用户ID

PID:进程ID

PPID:parent PID 父进程ID

STAT:进程状态

 

僵尸进程的处理:退出父进程则子进程就会自动释放,这么做就可以避免进程等待

使用kill命令杀死父进程

kill -9 +PID:强制杀死

孤儿进程:父进程先于子进程退出,子进程就成为了孤儿进程

特性:孤儿进程运行在后台,父进程变为1号进程---->systemd进程

以下代码实现孤儿进程:

1 #include<iostream>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 using namespace std;
  5 int main()
  6 {
  7   cout<<"This is a orphan process"<<endl;
  8   pid_t ret=fork();//fork创建子进程
  9   if(ret==0)
 10   {
 11     cout<<"This is child"<<endl;
 12   }
 13   else if(ret>0)
 14   {
 15     cout<<"This is parent"<<endl;
 16     exit(0);//父进程退出
 17   }
 18   else{
 19     cout<<"error"<<endl;
 20   }
 21   //子进程继续向下执行这个死循环                                                                                            
 22   while(1)
 23   {
 24   cout<<"hello"<<endl;
 25   }
 26   return 0;
 27 }

特性:孤儿进程运行在后台,父进程变为1号进程---->systemd进程

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值