浅析进程概念以及进程状态

一、进程是什么?

程序:完成特定任务的一系列指令的集合。(官方定义)

进程:

  • (用户角度):程序的一次动态执行过程。
  • 分时系统:时间片轮转
  • (操作系统角度):进程是操作系统分配资源的基本单位,也是最小单位

进程是怎样被操作系统管理起来?
先将进程描述起来,再将进程组织起来。那么问题来了,操作系统怎样去描述进程?这是就轮到我们PCB出场了
PCB就是描述进程的结构体(所有进程控制块的统称),在Linux中,描述进程的结构体叫做task_struct,它会被装载到内存里并包含着进程的信息

task_struct结构体内容

* 标识符:描述进程的唯一标示符,用来区别其他进程
* 状态:任务状态(退出信号......)
* 优先级:相对于其他进程的优先级(意味着那个进程将先进行)
* 上下文数据:进程执行时处理器的寄存器中的数据
* 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块指针
* 程序计数器:程序中即将被执行的下一条指令的地址
* I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
* 其他信息

进程和程序的区别?
答:

* 进程是动态的,程序是静态的
* 进程的生命周期短暂,程序永久
* 进程有重要的数据结构PCB
* 一个进程只能对应一个程序,一个程序可以对应多个进程
* 程序:数据 + 代码;   进程:数据 + 代码 + 堆栈 + PCB(PCB是前三个(数据、代码、堆栈)的粘合剂)

二、创建进程——fork(系统调用)

fork有两个返回值

  • (1)给父进程返回子进程的pid,给子进程返回0.
  • (2)失败返回-1
    why(为什么给父进程返回的是子进程的pid,而子进程就不用返回父进程的pid嘞)?
    因为:父进程必须拿到子进程的pid,这样父进程就可以知道子进程是哪一个;而子进程不用返回pid是因为子进程知道自己的父进程是谁。

fork之后,父子进程共享代码,数据各自开辟空间,私有一份(通过写实拷贝)(因为进程在运行时具有独立性)
并且fork之后一般需要用if分流

如图:父进程fork出子进程,代码共享
这里写图片描述
代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

int main()
{
        printf("beforn fork");

        pid_t pid = fork();

        if(pid == -1)
        {
                printf("%s\n",  strerror(errno));
                exit(1);
        }

        if(pid > 0)
        {
                printf("I  am  parent\n");
        }
        else
        {

                  printf("I  am  child\n");
        }
        printf("finish\n");
        return 0;
}

读者可以自行验证

二、进程状态
进程状态反映了进程执行过程的变化。这些状态随进程的执行和外界条件的变化而转换。 在三态模型中,进程状态分为三个基本状态:

* 运行态: 进程占有处理器正在处理
* 阻塞态:进程不具备运行条件,正在等待某个事件的完成
* 就绪态:进程具备运行条件,等待系统分配处理器以便运行


Linux下进程的六种状态

* R运行状态(running):并不意味着进程一定正在运行,它表明进程要么是在运行要么是在运行队列里
* S睡眠状态(sleeping):意味着进程在等待事件的完成
* D磁盘休眠状态(Disk sleep):有时候也叫作不可中断睡眠,在这个状态的进程通常会等待IO的结束
* T停止状态(stopped):可以通过发送SIGSTOP信号来停止进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行
* X死亡状态(dead):这个状态只有一个返回状态,你不会在任务列表里面看到这个状态
* Z僵尸状态(zombies):它是一种较为特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

进程状态在用户态和内核态之间的转换图:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值