Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209450
  • 博文数量: 43
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 485
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-07 21:45
文章分类

全部博文(43)

文章存档

2011年(3)

2010年(1)

2009年(21)

2008年(18)

我的朋友

分类: C/C++

2008-10-14 11:04:01

进程是UNIX乃至操作系统理论的一个重要概念,在UNIX环境中一个进程是一个运行中的程序,它包括执行代码、数据和相关的系统环境。进程环境涉及到进程在的内存布局、执行方式、结束方式等等。

1.进程的生命过程

如图所示,进程开始与fork()和exec()系统调用,fork()产生新进程,exec()载入可执行文件,然后调用main函数开始执行。main函数调用其他函数执行相关任务,进程正常结束主要有三种方式,一是调用_exit()或者_Exit()系统调用直接返回内核,其数据立刻可以被回收;二是调用exit()函数,该函数执行之前注册过的exit handler、清理标准输入输出,然后调用_exit()或者_Exit()返回内核;三是从main函数中返回,这种情况相当于第二种。


2.main函数的完整形式
    main函数是程序执行的入口点,其完整形式是:
    int main(int argc, char *argv[], char * env[])
参数argc是argv的个数,argv是传入的命令行参数数组,这个数组以NULL结束(也就是说argv[argc] == NULL),env是环境变量数组,同样以NULL结束,它的每一项是一个形如name=value的字符串。返回值是整数类型的,从main函数返回时返回值被exit使用。
    env会保存在全局变量environ中,由于环境变量可以通过getenv(),setenv()等函数访问,所以常见的main函数形式中没有env这个参数,形式如下int main(int argc, char *argv[])。环境变量是应用程序级别的东西,常见于shell何其他应用程序中,内核并不理会环境变量。


3.进程的虚拟内存布局

低地址是exec从可执行文件读取的正文段text和初始化数据段,初始化数据段中包含有初值的global和static变量,上面接着是未初始化数据段,包含没有初值的global和static变量,再上面就是堆heap,它的增长方向是朝上,malloc分配的内存就在堆中。高地址是内核空间和命令行参数argv和环境变量env,下面就是进程栈stack,它向下增长,自动变量就在栈中自动创建和销毁。

size(1)工具可以用来查看可执行文件各个section的大小,例如:
[kxiao@fc8 ~]$ size /bin/date /bin/sh

   text    data     bss     dec     hex filename
  46959    2592     388   49939    c313 /bin/date
 708291   19416   19444  747151   b668f /bin/sh

dec和hex分别是以十和十六进制文件总大小。类似的工具还有objdump(1),readelf(1)等。


4.跨函数的goto: setjmp(),longjmp()
    gogo只能在函数范围内实现任意跳转,如果要实现函数间的跳转可以使用setjmp和longjmp,它们在嵌套调用函数处理错误时很有用。
    int setjmp(jmp_buf env)设置一个跳转点,初次调用成功返回0,void longjmp(jmp_buf env, int val)跳转到env对应的setjmp跳转点,导致setjmp再次返回,而且setjmp后面的栈作废,参数val成为setjmp的返回值。这样一个setjmp可以对应多个longjmp,setjmp可以通过返回值区分多个longjmp。
    一般来说env声明成一个全局变量,因为它要在不同的函数中被使用。


5.进程资源限制
    由于系统资源有限,进程执行的时能够使用的资源是有限制的。进程资源限制在进程0中确定,并被后续所有进程所继承,但是进程可以通过getrlimit和setrlimit来获取和调整资源限制,调整必须遵循一下三条规则:
1)进程可以将它的软限制增加到不超过硬限制的值
2)进程可以将它的硬限制减少到不低于软限制的值
3)只有root用户才能提高硬限制的值
    资源限制主要有以下一些类型:
RLIMITS_AS    可用的虚拟内存量,单位字节
RLIMITS_VMEM   同RLIMITS_AS
RLIMITS_RSS    可用的物理内存量,单位字节
RLIMITS_STACK  栈的最大值,单位字节
RLIMITS_DATA   数据段最大值,初始化数据段、未初始化数据段和堆的总和,单位字节
RLIMITS_CPU    CPU时间最大值,超过软限制时进程收到SIGXCPU信号,单位是秒
RLIMITS_NPROC  real uid对应的最大子进程数目
RLIMITS_NOFILE 进程可以打开的文件数
RLIMITS_FSIZE  进程可以创建的当个文件长度单位字节
RLIMITS_CORE   核心转储文件大小
RLIMITS_LOCKS 最多能持有文件锁个数
RLIMITS_MEMLOCKS  最多能持有内存锁个数
RLIMITS_SBSIZE 一次能消耗socket缓存的最大量单位字节



阅读(1190) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~