linux下的进程

        +--------------------------------------+ 
        |             ......                   |  ... 省略了一些我们不需要关心的区 
        +--------------------------------------+ 
        |  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值