Liunx下进程概念

进程,程序的一个执行实例,正在执行的程序

描述进程的是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号进程领养

你可能感兴趣的:(Liunx下进程概念)