1 、什么是进程
我们可以通俗地把进程看作是正在运行着的二进制程序,占用内存空间消耗系统资源,例如使用 vim 命令编辑文件内容就会生成一个进程。进程是 OS 资源分配的基本单位,每个进程在操作系统中都执行着特定的任务。如网络服务/etc/init.d /network 是管理各个以太网接口的守护进程。
进程启动后,系统会为它分配一个唯一的数值,用于标识该进程,这个数值就称为进程号 PID,每个进程都有自己的用户、工作目录、进程状态、父子关系、内存结构、启动命令、文件句柄等情况,都记录在/proc/PID/目录下,通常使用 ps 命令和 top 命令查看。
2、c 语言的 main()函数
C 程序总是从 main 函数开始执行,通常情况下,对一个大型的软件项目,有几个 main()
就有几个进程。main()函数的原型是:int main(int argc,char* argv[1],char *env[]); argc 是命令行参数的个数,程序文件路径自身是第一个参数。 argv 字符指针数组中保存了指向各个参数字符串的指针,argv[0]就指向程序文件。
env 字符指针数组中保存了指向当前系统中每个环境变量字符串的指针,也就是环境表的首地址,环境表以 null 结尾,和命令 env 的输出一致。
void main ( int argc , char *argv[] ,char *env[] ) { int i ;
fprintf ( stdout , ” 参数个数 argc = %d\n ” , argc ) ;
for ( i = 0 ; i < argc ; i++ ) printf ( “ 参数 argv[%d] = %s \n ” , i , argv[i] ); for ( i = 0 ; env[i] ; i++ ) puts ( env[i] ) ; //逐个打印环境变量
}
3、Linux 进程的内存管理机制
Linux 进程内存管理的对象都是虚拟内存,每个进程先天就有 0-4G 的各自互不干涉的虚拟内存空间,0—3G 是用户空间执行用户自己的代码, 高 1GB 的空间是内核空间执行 Linu x 系统调用,这里存放在整个内核的代码和所有的内核模块。用户所看到和接触的都是该虚拟地址,并不是实际的物理内存地址。虚拟内存不能直接存储数据,必须要先映射真实物理内存,C 语言中内存动态分配函数 malloc 严格来说不是分配内存,而是用这先天就存在虚拟内存映射物理内存的。
Linux 内存分配和回收以内存页为单位,一页是 16 的 3 次方共 4096 个字节。进程的内存结构都保存在/proc/$(pid)/maps 文件中,下图为 Linux 进程典型存储器安排: