1.进程的内存结构🍊
-
程序加载到内存之后就变成了一个进程,进程在内存当中的一个结构有:
文本段(text section):存放程序代码
栈(stack):存放局部变量和函数返回地址
数据段(data section):存放全局变量和静态变量(static)
堆(heap):程序运行时的动态内存分配
SP(Stack Pointer):堆栈指针
PC(Program counter):程序计数器
【程序分析题】
#include <stdio.h>
#include <stdlib.h>int global = 100;void f(int x, int y) {int local = 50;int *p = (int *)malloc(100);// 假设在此处进行一些操作free(p);
}int main() {static int s = 20;int a = 30;f(a, global);return 0;
}
①全局变量global
存储在内存的哪个区域?
全局变量global
存储在数据段(Data Segment)。
②函数f
中的局部变量local
存储在内存的哪个区域?
函数f
中的局部变量local
存储在栈(Stack)中。
③函数f
中通过malloc
分配的内存位于哪个区域?
函数f
中通过malloc
分配的内存位于堆(Heap)。
④函数main
中的静态变量s
存储在内存的哪个区域?
函数main
中的静态变量s
存储在数据段(Data Segment)。
⑤在函数f
执行过程中,当调用malloc
时,栈指针(SP)和程序计数器(PC)会如何变化?
当函数f
调用malloc
时,栈指针(SP)会向低地址方向移动(因为栈是从高地址向低地址生长),为局部变量local
和指针p
在栈上分配空间;程序计数器(PC)会指向malloc
函数在内存中的代码位置(位于文本段,Text Segment),执行malloc
函数的二进制指令,然后在堆上分配 100 字节的内存,堆指针会相应调整以指向新分配的内存块。
2.进程的状态
三状态
运行态 / 执行态(Running):此时进程的代码在CPU上运行
就绪态(Ready):进程具备运行条件,等待分配CPU
等待态 / 阻塞态(Waiting/Blocked):进程在等待某些事件的发生(比如IO操作结束或是一个信号),不具备运行条件
进程何时离开CPU
内部事件:进程主动放弃(yield)CPU,进入等待/终止状态;使用I/O设备,(非)正常结束(除零异常)。
外部事件:进程被剥夺CPU使用权,进入就绪状态,这个动作叫抢占(preempt);时间片到达,高优先权进程到达。
五状态
七状态
挂起状态可以分为两种:
阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
就绪挂起状态:进程在外存(硬盘),但只要进入内存,即刻立刻运行。
【简答题】进程的三状态/五状态/七状态具体是什么?
三状态模型是最简单的进程状态模型,包括:
(1)运行(Running): 进程正在使用CPU,其指令正在执行。
(2)就绪(Ready): 进程具备执行条件,可以获得CPU执行,但当前未被分配CPU。
(3)阻塞(Blocked/Waiting): 进程正在等待某个事件发生(如I/O操作完成),暂时不能执行。
五状态模型增加了对进程创建和终止的支持,包括:
(1)新建(New):进程正在被创建,系统尚未对其进行完全初始化。
(2)就绪(Ready):已准备好运行,但未获得CPU。
(3)运行(Running):正在使用CPU执行。
(4)阻塞(Blocked/Waiting):等待事件(如I/O)完成。
(5)终止(Terminated/Exit):进程执行完成或被终止,等待操作系统进行清理。
七状态模型详细描述了进程切换的多个转变状态,具体状态可能因设计而异,一般包括:
(1)新建(New):进程正在被创建,系统尚未对其进行完全初始化。
(2)就绪(Ready):已准备好运行,但未获得CPU。
(3)运行(Running):正在使用CPU执行。
(4)阻塞(Blocked/Waiting):等待事件(如I/O)完成。
(5)终止(Terminated/Exit): 进程执行完成或被终止,等待操作系统进行清理。
(6)挂起就绪(Ready Suspended): 进程已被挂起,但若从挂起中恢复即可直接运行。
(7)挂起阻塞(Blocked Suspended): 进程处于阻塞状态,并已被挂起。
3.进程的切换
中断是触发事件,可能会导致上下文切换,而进程切换是上下文切换在进程层面的一种体现。
进程切换是上下文切换的一种特殊情况,它特指 CPU 从一个进程的执行切换到另一个进程的执行。而上下文切换是指在多任务操作系统中,CPU 从一个进程(或线程)的运行环境切换到另一个进程(或线程)的运行环境的过程。
切换时机
进程需要进入等待状态(主动)
进程被抢占CPU而进入就绪状态(被动)
切换过程
保存被中断进程的上下文信息(Context)
修改被中断进程的控制信息(如状态等)
将被中断的进程加入相应的状态队列
调度一个新的进程并恢复它的上下文信息
【简答题】进程的上下文都包含哪些具体的内容?
进程的上下文主要包含以下两个方面:
(1) 运行实体: 栈、堆、数据段和文本段以及与之相关联的程序计数器(PC)、栈指针(SP)、通用寄存器等。
(2) 进程控制块(PCB)信息: 进程标识符(PID)、进程状态、优先级、打开的文件列表等。
4.通过系统调用创建新进程
system()
fork()
exec()
5.进程通讯
什么是进程通信?进程通信是指在操作系统中,不同的进程之间交换数据和信息的方式。其主要目的是为了在多进程环境中实现同步、资源共享和数据共享。