【操作系统原理】【实验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、子进程迅速终止而父进程阻塞时,子进程将进入僵死状态,直至父进程退出,其资源也被一并回收。

有了计划记得推动,不要原地踏步。
原文地址:https://www.cnblogs.com/amnotgcs/p/15523533.html