您的位置:首页 > 运维架构 > Linux

Linux系统编程手册-进程-6章

2017-03-21 23:15 183 查看
1.进程是由内核定义的抽象的实体,该实体分配用以执行程序的各种资源。

2.每个进程都有一个进程号pid。有些系统调用可以使用pid作为输入参数,比如kill()系统调用,允许调用者向某一个特定进程发送信号。头函数unistd.h中 pid_t getpid(void)可以返回该进程的pid。

3.每个进程都有一个父进程号ppid。unistd.h中pid_t getppid(void)可以得到父进程的进程号。如果某子进程的父进程退出了,则该子进程就变成了孤儿,他的父进程就会自动变为init进程。

4.进程内存布局:

a.包括文本段,初始化数据段,未初始化数据段,栈, 堆。

文本段:包含了程序运行的程序机器语言指令。只读属性。可以为多个程序共享。这样一份程序的拷贝可以映射到所有这些进程的虚拟地址空间中。

初始化数据段:包含了显示初始化的全局变量和静态变量。

未初始化的数据段:包含了未进行显示初始化的全局变量和静态变量。程序启动之前,系统会将本段内所有的内存初始化未0.之所以要把初始化的和未初始化的数据段分开存放,是因为程序在磁盘上存储时,没有必要为未经初始化的数据分配存储空间,只需记录位置和所需空间大小,等到运行时再分配空间。

栈:由栈帧组成,系统会为当前调用的函数分配一个栈帧。栈帧中存储了函数的局部变量,实参和返回值。

堆:是在运行时可以动态分配内存的一块区域。

5.虚拟内存管理:

a.因为程序访问一般有空间局部性和时间局部性,所以现代操作系统都提供了虚拟内存机制。其规划之一就是讲程序使用的内存划分为小型的,大小固定的页,同时,将ram也划分为相同大小的页。任一时刻,程序仅有部分页存储在ram中,这些页构成了驻留集。其余的放在交换区(swap area),一般在硬盘上。当访问到的页不在ram中时,会从其从交换区加载到ram中。为支持这样一种方式,内核为每个进程维护一个页表,记录了可为进程所用的所有虚拟内存页。表中的每条记录要么指向该虚拟页在ram中的位置,要么表明其当前正在交换区。进程的虚拟地址范围在进程生命周期内可能发生变化。需要硬件的pmmu(分页内存管理单元)的支持,他可以将需要访问的虚拟地址转换为arm中的真实地址。

虚拟内存的优点:

a.将进程与进程,进程与内核相互隔离,不会越界访问。

b.多个进程可以共享一块内存,比如多个进程共享一段代码文本段,还可以通过mmap等实现共享内存来进程ipc。

c.允许每个进程对内存采取不同的保护措施。

d.程序员和编译器,连接器等都无需关注程序在ram中的物理布局。

c.因为需要驻留在ram中的数据只是程序数据的一部分,所以这样可以实现一个进程所占用的内存大小可以超出实际ram的大小。每个进程实际使用的ram变小了,同一时间ram总可以加载的程序个数变多了,提高了cpu的使用率。

6.main函数的命令行参数argc和argv。这两个参数只在main函数中才可得到,还有一些方法可以在其他函数中得到,在书的100页。这里就不写了。

7.环境列表:

每个进程都有与其相关的环境变量,是一个字符串数组。每个字符串都以name=value的形式定义。新进程在创建之时,都会从父进程那里继承一份环境变量的副本。子进程创建完成后,各自修改自己的环境变量不会对父进程造成影响。

a.一般使用export来声明环境变量,export SHELL=/bin/bash

b.可以用evn或者printenv来查看本shell下面的环境变量列表

c.可以通过linux专有的/proc/PID/environ文件来查看任一进程的环境变量。

d.在程序中可以通过全局变量char **environ来访问环境列表。每个数组以NULL结尾。在需要用到的地方extern char **environ, 就可以使用了。

e. stdlib.h 中char *getenv(const char *name)可以从环境变量列表中检索出名称为name的环境变量的value值。如果不存在name,就返回NULL。返回的字符串存在静态存储区,不应该更改,也可能被覆盖,所以如果需要长期保存,最好拷贝出来。

修改环境变量:

进程可以修改环境变量。

stdlib.h中 int setenv(const char *name, const char *value, int overwrite); return 0 success, -1 error.

该函数会利用传入的参数生成一个name=value的字符串,并分配一块内存,如果该name已经存在,就看overwrite的值,如果为0,不修改其值,如果非0,则利用传入的新value来修改原来的值。

int unsetenv(const char *name);用来移除环境变量。

可以通过environ = NULL;来清除整个环境变量列表。

一般打印环境变量

char **ep;
for(ep = environ; *ep != NULL; ep++)
puts(*ep);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux
相关文章推荐