linux系统之进程相关概念小结

1、进程环境

(1)export命令查看环境变量

(2)进程环境表介绍

每一个进程中都有一份所有环境变量构成的一个表格,也就是说我们当前进程中可以直接使用这些环境变量。进程环境表其实是一个字符串数组,用environ变量指向它。

(3)程序中通过environ全局变量使用环境变量实例

#include <stdio.h>

int main(void)
{
	extern char **environ; //定义一个二重指针,指向字符串数组,environ是一个全局变量,声明就能使用
	int i = 0;
	
	while(NULL != environ[i])
	{	
		printf("%s \n",environ[i]);
		i++;	
	}
	 
	return 0;
}

 

2、进程运行的虚拟地址空间的意义:进程隔离,提供多线程同时运行

 

3、什么是进程

(1)动态过程而不是静态实物。

(2)进程就是程序的一次运行过程,一个静态的可执行程序a.out的一次运行过程(./a.out开始运行到结束)就是一个进程。

(3)进程控制块PCB(process control block),内核中专门用来管理一个进程的数据结构。

 

4、多进程调度原理

(1)操作系统同时运行多个进程

(2)宏观上的并行和微观上的串行

(3)实际上现代操作系统最小的调度单元是线程而不是进程

 

5、为什么要创建子进程

(1)每一次程序的运行都需要一个进程

(2)多进程实现宏观上的并行

 

6、进程的分裂生长模式

(1)如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个现有的进程来复制生成一个新进程。老进程叫父进程,复制生成的新进程叫子进程。

(2)fork函数可以创建子进程,该函数调用一次会返回2次,返回值等于0的就是子进程,而返回值大于0的就是父进程。

(3)典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,等于0时就是子进程。

 

7、关于子进程

(1)子进程和父进程的关系

(2)子进程有自己独立的PCB

(3)子进程被内核同等调度

(4)父进程在没有fork之前自己做的事情对子进程有很大影响,但是父进程fork之后在自己的if里做的事情就对子进程没有影响了。本质原因就是因为fork内部实际上已经复制父进程的PCB生成了一个新的子进程,并且fork返回时子进程已经完全和父进程脱离并且独立被OS调度执行。

(5)子进程最终目的是要独立运行另外的程序

 

8、进程的消亡

(1)正常终止和异常终止。

(2)进程在运行时需要消耗系统资源(内存、IO),进程终止时理应完全释放这些资源(如果进程消亡后仍然没有释放相应资源,则这些资源就丢失了)。

(3)linux系统设计时规定:每一个进程退出时,操作系统会自动回收这些进程涉及到的所有资源(譬如malloc申请的内存没有free时,当前进程结束时这个内存会被释放,譬如open打开的文件没有close的,在程序终止时也会被关闭)。但是操作系统只是回收了这个进程工作时消耗的内存和IO,而并没有回收这个进程本身占用的内存(主要是task_struct和栈内存)。

(4)因为进程本身的内存,操作系统不能回收,需要别人来辅助回收,因此我们每个进程都需要一个帮助它收尸的人,这个人就是这个进程的父进程。

 

9、僵尸进程

(1)子进程先于父进程结束。

子进程结束后父进程此时并不一定立即就能帮子进程“收尸”,在这一段期间(子进程已经结束且父进程尚未帮其收尸)子进程就被称为僵尸进程。

(2)子进程除task_struct和栈外其余内存管理皆已清理。

(3)父进程可以使用wait或waitpid以显式回收子进程的剩余待回收内存资源并且获取子进程退出状态。

(4)父进程也可以不使用wait或者waitpid回收子进程,此时父进程结束时一样会回收子进程的剩余待回收内存资源。(这样设计是为了防止父进程忘记显式调用wait/waitpid回收子进程,从而造成内存泄漏)

 

10、孤儿进程

(1)父进程先于子进程结束,子进程成为一个孤儿进程。

(2)linux系统规定:所有孤儿进程都自动成为一个特殊进程(进程1,也就是init进程)的子进程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章