linux下的进程

来源:互联网 发布:数据中心网络布线方式 编辑:程序博客网 时间:2024/05/16 00:24
        +--------------------------------------+ 
        |             ......                   |  ... 省略了一些我们不需要关心的区 
        +--------------------------------------+ 
        |  env strings (环境变量字串)          | \ 
        +--------------------------------------+  \ 
        |  argv strings (命令行字串)           |   \ 
        +--------------------------------------+    \ 
        |  env pointers (环境变量指针)         |    SHELL的环境变量和命令行参数保存区 
        +--------------------------------------+    / 
        |  argv pointers (命令行参数指针)      |   / 
        +--------------------------------------+  / 
        |  argc (命令行参数个数)               | / 
        +--------------------------------------+ 
        |            main 函数的栈帧           | \ 
        +--------------------------------------+  \ 
        |            func_1 函数的栈帧         |   \ 
        +--------------------------------------+    \ 
        |            func_2 函数的栈帧         |     \ 
        +--------------------------------------+      \ 
        |            func_3 函数的栈帧         |      Stack (栈) 
        +......................................+      / 
        |                                      |     / 
                      ......                        / 
        |                                      |   / 
        +......................................+  / 
        |            Heap (堆)                 | / 
        +--------------------------------------+ 
        |        Uninitialised (BSS) data      |  非初始化数据(BSS)区 
        +--------------------------------------+ 
        |        Initialised data              |  初始化数据区 
        +--------------------------------------+ 
        |        Text                          |  文本区 
        +--------------------------------------+ 

上图为进程数据内存分配图,底端为内存低地址,文本区存放只读程序代码,由fork创建的子进程共享该段代码,而其他数据区则从新开辟。Data段(初始化数据区)为数据分配空间,BSS段只记录数据所需内存大小,不为其分配空间。

进程:进程是一个运行程序并为其提供执行环境的实体,它包括一个地址空间和至少一个控制点,进程在这个地址空间上执行单一指令序列。进程地址空间包括可以访问或引用的内存单元的集合,进程控制点通过一个一般称为程序计数器(program counter,PC)的硬件寄存器控制和跟踪进程指令序列。进程作为分配资源的基本单位,而线程作为独立运行和独立调度的基本单位。
一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语Creat()按下述步骤创建一个新进程。
1) 申请空白PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
2) 为新进程分配资源。为新进程的程序和数据以及用户栈分配必要的内存空间。显然,此时操作系统必须知道新进程所需要的内存大小。
3) 初始化进程控制块。PCB的初始化包括:
①初始化标识信息,将系统分配的标识符和父进程标识符,填入新的PCB中。
②初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式的方式提出高优先级要求。
4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中。
在android系统中发生段错误时可通过PC地址查询段错误发生所对应的源码。

线程中都应具有一个用于控制线程运行的线程控制块TCB,用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
0 0