进程:
可以简单理解为运行中的程序
程序无非就是一些代码和数据,那运行起来之后的程序呢,在操作系统中是如何存在的?
程序一经运行,成为进程,带上原有的代码段和数据段开始在操作系统中运转起来
形象的来说,不妨比作一个人呱呱坠地后,带着自己的肉体和精神开始在世界上旅行,在这个社会体系之下,每个人都会有自己的一份档案,记录着关于自己的信息。
对于进程来说,这个档案就是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进程