进程,程序的一个执行实例,正在执行的程序
描述进程的是PCB(process control block),进程控制块,本质是个结构体
其中包含内存指针(程序的代码和数据内存的什么地方),程序计数器(),上下文数据(即将执行的指令),
标识符PID(进程ID),进程状态,进程优先级,记账信息(),IO信息(文件信息)
在Liunx下,使用 ps
或者ls /proc
系统文件查看
在代码中使用 getpid()
来查看进程id
pid_t getpid(void)
类型时pid_t 这是一个结构体类型
使用fork()
系统调用创建进程,父进程返回子进程的pid,子进程返回0,创建子进程失败返回-1,这样使用if就可以分辨父子进程,进行分流.
操作系统通过复制父进程创建子进程,因此父子进程数据独有,代码共享
int main()
{
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}
子进程也会执行相同的程序,这样返回值就会出现不同
等会再说代码,先看概念
进程的状态
一般来说可以分为3大类
运行 就绪 阻塞
在Linux下:
1.运行 ( R )
就是在运行
2.可中断休眠(S)
也叫睡眠状态,一个简单的操作就可以唤醒
3.不可中断休眠(D)
磁盘休眠
4.停止状态(T)
5.僵死状态(Z)
6.X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
插播一下查看进程状态命令
ps aux / ps axj
在僵死状态中,会产生僵尸进程,该进程僵死是因为资源泄露
为什么会资源泄露呢,
父进程创建子进程,子进程先与父进程退出,由于要保存退出信息,操作系统要通知父进程获取子进程的退出原因,因此不能直接释放所有资源,要等待父进程获取后才允许操作系统释放资源,但是父进程没有关注这个通知导致资源无法释放,造成僵尸进程
如何避免
进程等待,父进程等待子进程退出
那么要是父进程先于子进程退出怎么办,这样进程就变成了孤儿进程,这个进程会在后台运行,被1号进程领养