面试题答案
一键面试进程的三种基本状态
- 就绪态(Ready): 进程已获得除 CPU 之外的所有必要资源,一旦得到 CPU 时间,就可以立即执行。好比运动员在起跑线上做好准备,只等发令枪响(获得 CPU 资源)就可以起跑(执行)。
- 运行态(Running): 进程正在 CPU 上运行,执行其程序代码。这就像运动员已经起跑,正在赛道上奔跑。
- 阻塞态(Blocked): 进程因等待某种事件(如 I/O 操作完成、信号量等)而暂时无法执行,此时即使分配给它 CPU 时间,它也无法运行。例如运动员在比赛中遇到赛道上有障碍物,需要等待障碍物清除才能继续比赛。
状态转换场景
- 从运行态到阻塞态:
- I/O 操作场景:当进程执行如读取文件、网络请求等 I/O 操作时,由于 I/O 设备速度相对较慢,进程需要等待 I/O 操作完成。例如,一个进程要从硬盘读取大量数据,在等待硬盘传输数据的过程中,进程会从运行态转换为阻塞态。
- 等待信号量场景:如果进程需要获取某个信号量(一种用于进程同步的机制),而该信号量当前不可用(已被其他进程占用),进程就会进入阻塞态等待信号量被释放。
- 从阻塞态到就绪态:
- I/O 操作完成:当之前等待的 I/O 操作(如文件读取、网络请求)完成后,进程所等待的事件已经发生,它就不再被阻塞,从而转换为就绪态,等待 CPU 调度执行。例如,硬盘数据读取完成,进程就从阻塞态变为就绪态,等待 CPU 分配时间继续执行后续代码。
- 信号量可用:当进程等待的信号量被其他进程释放,该进程就可以获取信号量,从阻塞态转换为就绪态。
- 从就绪态到运行态:
- CPU 调度:当 CPU 空闲且调度程序从就绪队列中选择一个进程时,该就绪态的进程就会获得 CPU 资源,从而转换为运行态开始执行。例如,系统中有多个进程处于就绪态,调度程序按照一定的调度算法(如先来先服务、优先级调度等)选择一个进程,该进程就进入运行态。
- 从运行态到就绪态:
- 时间片用完:在分时操作系统中,每个进程被分配一个时间片来执行。当进程的时间片用完后,即使它还没有执行完,也会被剥夺 CPU 资源,从运行态转换为就绪态,等待下一次调度。例如,一个进程正在运行,时间片结束后,它就回到就绪队列等待再次被调度执行。
- 更高优先级进程到来:如果系统采用优先级调度算法,当有更高优先级的进程进入就绪队列时,当前运行的进程可能会被抢占 CPU,从运行态转换为就绪态,让高优先级进程先运行。