Linux进程的基本知识


进程的内存布局

进程从逻辑上可以分为

1.Text:程序的指令

2.Data:程序使用的静态变量

3.Heap:程序能够动态分配额外储存空间的区域

3.Stack:当调用函数和返回函数是这片内存空间增长和缩小,用来给局部变量和函数调用s时有关的信息分配空间的内存区域

进程的创建和执行

1.创建:一个进程通过调用fork()系统调用创建一个子进程(调用fork()的是父进程)

        调用fork()时,创建的子进程复制父进程的data,heap,stack段,共享父进程的Text段(Text段只读)

2.执行:子进程可以通过调用execve()函数来载入和运行另一个程序,这时子进程的Text,Data,Heap,Stack将被新程序对应的东西替换

        C library里面有一些exec开头的函数作用是差不多的

进程的终止和终止状态

1.自杀:调用_exit()(或者相关的library中的exit()函数)

2.他杀:给进程传送某种signal

_exit()可以指定终结的状态(终结的状态通常就是一个很小的整数)

通过某种signal终结进程,终结的状态根据signal的种类而不同

父进程通过wait()系统调用函数可以获取子进程终结后的终结状态

进程自己的两种ID

1.每一个进程都有一个process identifier(PID)和parent process identifier(PPID)

进程与用户和组相关的一些ID

1.Real user id 表明进程属于哪个用户

  Real group id 表明进程属于哪组群组

2.Effective user id 根据这个用户id,进程对某些资源的权限

  Effective group id 根据这个群组id,进程对某些资源的权限

  这两个通常与real xxx id是一样的值,这两个值可以改变的

3.Supplementary IDs 这些ids表示一些额外的群组,而进程属于这些群组

  (以上3种这些IDs值继承自父进程)

privileged process(特权进程) 和 unprivileged process

1.privileged process:Effective user id 值为0的进程,id的值为0意味着是超级用户,能够绕开权限的限制

2.unprivileged process:Effective user id 的值非0的进程,要根据权限来执行

capabilities(能力)

从kernel2.2开始,Linux将privileges分成一系列截然不同的单元叫做capabilities.每一个privileged operation关联到一个具体的capability,每一个进程能够执行某个操作仅当这个进程有对应的capability。传统的super process具有所有的capabilities。

init process

当启动操作系统的事后内核创建一个叫init的进程,它是所有进程的父进程,init是程序的路径为/sbin/init(在Fedora15中 /sbin/init是一个链接 真正文件为/bin/systemd) init进程具有super user权限并且进程号为1。init进程只有在shut down时才能被干掉,即使super user也杀不了它。

daemon process

和其它进程差不多,有两个特征

1.通常长时间生存,一般情况下与系统同生共死。(当然可以kill掉)

2.在后台运行,没有控制终端让它输入或输出

如syslogd进程

environment list

每一个进程都有一个environment list,它是在进程的用户空间中被维护的集合environment variables。每一个元素是 名字和值 组成的,通过fork()创建一个新进程时,environment list继承自父进程。当通过exec()系列的函数替换进程的程序时,可以通过指定environment list来替换本来的,或者不指定则保留原来进程的。C语言程序可以通过使用外部变量char **environ来获取environment list或者修改它。

resource limits

每一个进程都要消耗一些资源如打开文件,内存,cpu时间。通过调用系统调用setrlimit(),一个进程能够限制消费各种资源的上限。每一种资源限制有两个相关的值:一个是soft limit,这个限制进程消耗资源的数量;另一个是hard limit,这个是一个允许调整的soft limit的值的上限。一个unprivileged process仅仅能调整soft limit的值在0-hard limit之间,只能减少hard limit的值,不能增加。fork()一个新进程,这个新进程的resource limits继承自父进程。shell可以通过ulimit改变limits的值。

相关内容