进程的状态的学习

进程的状态

  • 就绪
  • 运行
  • 僵尸
  • 暂停
  • 睡眠
    • 深度睡眠
    • 浅度睡眠

进程状态转换为了加深印象,我自己画了一个图:

进程状态转换图

进程是什么?进程是 Linux 系统的最小资源分配单元。
这里面有一个关键字是“资源”,一台计算机的资源有哪些呢?有一下几个:

  • cup
  • memory
  • file
  • I/O 设备

所有一定会有一种数据结构来描述这些资源。这就是 task_struct

task_struct {
 pid , 
 ...
 mm , -- 内存地址
 fs , -- 和进程相关的路径
 files -- 文件资源
}

为了加深对线程状态的理解,举个小例子。

第一个小练习:

main()
{
        while(1){
          printf("hello\n");
        }
}

在这个例子中,我们使用 kill 的来改变进程的状态。ctrl+z 让进程进入停止状态,ctrl+c让进程进入终止状态。然后使用 fg 或者 bg 让进程在起来。

fork

第一个练习:

main()
{
        fork();
        printf("hello\n");
        fork();
        printf("hello\n");
        while(1);
}

这个小程序的运行时序图如下图:

fork1 的时序图
第二个小练习:

#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
        pid_t pid,wait_pid;
        int status;

        pid = fork();

        if (pid==-1)    {
                perror("Cannot create new process");
                exit(1);
        } else  if (pid==0) {
                printf("a\n");
        } else {
                printf("b\n");
        }

        printf("c\n");
        while(1);
}

fork2 的时序图

总结一下

  • 就绪状态:等待执行的进程,此时进程的没有获取到 cpu 资源。其他的内存资源应该有。
  • 运行态: 排队,排上了,获得了 cpu 的资源。
  • 睡眠态: 也可以叫阻塞,因为进程没有除 cpu 以外的资源了,进程有不能站着茅坑不拉屎,那就先去睡一觉,等资源来再接着执行。
  • 僵尸态:处在僵尸态的进程已经是死了,用 kill -9 也杀不死,不是杀不死,而是只剩下一具尸体了,这具尸体就是 task_struct 。处在僵尸态的进程,只有等着它的父进程收尸。才能在进程列表中消失。主要是要返回给父进程一个死亡原因。给人家一个交代。
  • 停止态:是人为的让进程停下来,让其进入停止态。明显的例子就是 cpulimit 的例子,周期性的发 ctrl+z 这种信号,然后再发 fg bg 这种信号。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值