一、进程的定义
1. 程序和进程
- 程序是一个被动的实体,例如一个包含存储在磁盘上的指令列表的文件(通常称为可执行文件)。
- 当一个可执行文件被加载到内存中时,一个程序将成为一个进程。
- 进程是一个活动的实体,由一个程序计数器指定下一条指令来执行一组相关的资源。
2. PROGRAM COUNTER
- 程序计数器(PC) 是一个CPU中的寄存器,里面存放下一条要执行指令的内存地址;
- 通常,CPU在取完一条指令之后会将PC寄存器的值加“1”,以计算下条要执行指令的地址;
3. PROCESS IN MEMORY
进程在内存中的状态
注解:
1)text 代码段:我们编写的程序经过编译生成对应的指令,进程内存布局中的 text 段,就是用来存放这些计算机指令的。CPU 不断地从 text 段取走指令,进程就不断地往下执行。
2)data 段:这部分主要存放全局变量和静态变量数据。因为全局变量和静态变量数据的生命周期是伴随着进程开始和结束的,所以 data 段专门用来存放整个进程执行期间都需要保存的数据。
3) stack 段:栈空间,属于进程内存布局的一部分,用于存放局部变量、函数返回地址。
4) heap 段:堆空间,属于进程内存布局的一部分,堆用于程序运行时的动态内存分配,如 malloc 动态申请内存。
5)stack 栈空间在高地址,heap 堆空间在低地址。stack 栈空间的增长方向从高地址往低地址, heap 堆空间的增长方向从低地址往高地址。
二、 一个运行中的进程内存空间
- 首先,我们的程序经过编译得到一系列的二进制计算机指令,这些指令都放在 text 段。
- 程序开始执行
a) main函数中调用了 g函数,g函数中调用了 f函数;
b) 当进行子程序切换(即函数调用)的时候,需要记录函数的返回地址。比如,main函数中调用了 g函数,当 g函数执行结束,下一条指令应该对应的是 main函数中调用 g函数位置的下一处: return 0; 。因此,当发生子程序的调用时,我们应该把子程序调用的下一处地址保存到栈空间,以便从栈空间中取出下一条指令的地址。
c) 在整个程序的执行过程中,出现了全局变量和静态局部变量,因此将其保存到 data 段。同时还出现了 malloc 进行动态内存分配,heap 段也使用到了。
- 最后函数全部运行结束并返回,data/heap/stack 空间都释放
- 进程的定义
三、 并发的进程
1. 并发的概念
Concurrency:the fact of two or more events or circumstances happening or existing at the same time.
并发可以解释为:在同一时间段“发生”或者“存在”。
并行可以理解为:“running at the same time.”。即:在同一时间“运行”。
2. 并发进程共享CPU
四、进程的状态
1. 进程状态(PROCESS STATE)
2. 进程何时离开CPU
3. 进程状态的转换
注:源自B站up主:Y4NGY