进程的概念

用户空间包括以下几个功能区域
进程是一个独立的可调度的任务,是程序的一次可执行的过程,是操作系统进行资源分配和调度的基本单元;
程序可以作为一种
软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
进程更能真实地描述并发,而程序不能;
进程具有创建其他进程的功能,而程序没有。
同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
//简单的说程序是存放在磁盘上的指令集,是一个静态的概念;进程是一个动态的概念,有创建、调度、消亡等过程。
进程的状态
- 运行状态(TASK_RUNNING):进程当前正在运行,或者正在运行队列中等待调度。
- 可中断的阻塞状态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态,正在等待某件事发生或能够占用某些资源。处在这种状态下的进程可以被信号中断。接受到信号或被显示地唤醒呼叫(如调用wake_up、wake_up_interruptible等),进程将会转换成TASK_RUNNING状态。
- 不可中断的阻塞状态(TASK_UNINTERRUPIBLE):与第二个相似,只是它不会被信号中断。这种状态很有用。只有在它所等待的事件发生时,进程才被显示地唤醒呼叫唤醒。
- 暂停状态(TASK_STOPPED):进程的执行被暂停,当进程受到SIGSTOP、SIGSTP、SIGTTIN、SIGTTOU等信号。就会进入暂停状态。
- 僵尸状态(EXIT_ZOMBIE):子进程运行结束,父进程尚未使用wait函数族等系统调用收回退出状态。处在改状态下的子进程已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调回,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其父进程收集。
下面是进程的状态图(网上盗来的):
每一进程的用户空间都是完全独立互不相干的。进程是由正文段、程序段、数据段三部分组成;
该图是进程的虚拟内存空间地址
内存虚拟内核 |
堆栈 |
Linux动态链接 |
共享库的内存映射区 |
堆 |
数据段(.data .bss) |
只读段 (.init .text .rodata ) |
|
- 只读段:包含了代码段(.init .text)和只读数据段(.rodata)
- 数据段:存放全局变量和静态变量。可读可写(.data)段存放了已经初始化的全局变量和静态变量,BSS(.bss)段存放的是未初始化的全局变量和静态变量
- 栈:由系统自动分配和释放。存放函数值、局部变量、返回值等。
- 堆:存放动态分配的数据。
- 共享映射区:这是linux动态链接和其他共享代码的映射区域。