程序:静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
进程:动态的,是程序的一次执行过程。(同一个程序多次执行会对应多个进程)
1.进程的内存结构🍊
【程序分析题】
#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.进程的状态
三状态
进程何时离开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)、进程状态、优先级、打开的文件列表等。
通过系统调用创建新进程:system(),fork(),exec()
4.进程通讯
什么是进程通信?进程通信是指在操作系统中,不同的进程之间交换数据和信息的方式。其主要目的是为了在多进程环境中实现同步、资源共享和数据共享。
Linux常见的进程通信机制
①管道:匿名管道,命名管道(FIFO)
②消息队列
③共享内存
④信号量和 PV 操作
⑤信号
⑥套接字