【操作系统原理】【实验3】观察进程状态
一、实验目的
设计性|通过Linux下进程的状态理解进程的各种状态,以及状态的转换理解进程的创建、阻塞、撤销等进程控制。
二、实验步骤
step1:通过实例查看状态为“运行”的进程
step2:通过实例查看状态为“暂停”的进程
step3:通过实例查看状态为“不可中断阻塞”的进程
step4:通过实例查看状态为“可中断阻塞”的进程
step5:通过实例查看状态为“僵尸”的进程
三、实验内容
3.1 通过实例查看状态为“运行/暂停”的进程
编译运行如下文件run_status.c
int main()
{
int i, j;
for (i = 1; i <= 1000000; i++)
{
for (j = 1; j <= 1000000; j++)
{
j++;
j--;
}
}
return 0;
}
在终端中查看进程并匹配到上述程序。
我们发现此进程的状态为R。
我们发送停止信号-SIGSTOP给该进程。
我们再次查看该程序的状态码,发现其变为T,此时发送运行信号-SIGCONT给该进程后又变为R。
3.2 通过实例查看状态为“可中断”的进程
编译运行interruptible_status.c文件。
int main()
{
sleep(300);
return 0;
}
我们发现该进程的状态为S。
我们使用Kill命令终止该进程。
再次查看发现其进程已经不存在。
3.3 通过实例查看状态为“不可中断阻塞”的进程
编译运行uninter_status.c文件。
#include <stdlib.h>
int main()
{
if (vfork() == 0)
{
sleep(300);
exit(0);
}
return 0;
}
我们发现该进程的状态码为D。
(centos6.3环境下)我们使用kill命令之后发现其依然存在。
【注意】下图实验结果非本次预期实验结果。
3.4 通过实例查看状态为“僵尸”的进程
编译运行zombie_status.c文件。
#include <unistd.h>
int main()
{
if (fork())
{
sleep(300);
}
return 0;
}
我们发现其进程状态码为S。
4、实验报告
4.1 实验结果
1、我们运行一个程序使程序陷入for循环中,此时我们查看进程的状态为R(TASK_RUNNING)可运行状态。
若此处给该进程发送停止信号-SIGSTOP则其状态变为T,再发送-SIGCONT信号其状态又变为R。
2、我们运行一个程序使其陷入睡眠,此时查看该进程的状态为S(TASK_INTERRUPTIBLE)可中断等待状态。
若此处我们给该进程发送停止信号,则该进程被终止。
3、我们运行一个程序使其陷入子进程的睡眠中,此时查看该进程的状态为(TASK_UNINTERRUPTIBLE)不可中断等待状态。
若此时我们给该进程发送停止信号,该进程并没有被终止(centos7环境下终止了)。
4、我们运行一个程序,使其子进程迅速结束,而父进程进入阻塞。此时该子进程的状态码为Z(TASK_ZOMBIE)僵死状态。
4.2 实验总结
1、正在运行或在可运行进程队列中等待运行的进程处于TASK_RUNNING(可运行状态),
我们发送给该进程暂停信号后,该进程将进入暂停状态,其可接受运行信号继续运行。
2、在等待资源的进程将被阻塞,进入TASK_INTERRUPTIBLE(可中断等待状态),其可以被停止信号终止,
也可以在等待的资源有效时被信号唤醒。
3、处于不可被中断状态的进程不可被其他进程唤醒,也不可被信号终止,只能等待硬件状态。
4、子进程迅速终止而父进程阻塞时,子进程将进入僵死状态,直至父进程退出,其资源也被一并回收。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~