【linux进程(三)】进程有哪些状态?--Linux下常见的三种进程状态

简介: 【linux进程(三)】进程有哪些状态?--Linux下常见的三种进程状态

1. 前言

很明显,进程状态的本质就是进程

PCB结构体中的一个变量,它可能

是用宏定义来实现的,也可能是其他方式

#define NEW 1
#define RUNNING 2
#define BLOCK 3
strcut PCB
{
  ...其他信息
  int state;//进程状态
}
if(PCB->state==NEW)
{将进程放入运行队列}
else if(PCB->state==BLOCK)
{将进程放入阻塞队列}
......

本章重点:

本篇文章着重讲究操作系统中的
三种进程状态:运行状态,阻塞状态
挂起状态.并且讲解Linux操作系统
中具体的进程状态,其中R状态(运行状态)
和S状态(睡眠状态)最常见!

Linux中常见的六种状态:

还有一种状态就是z状态(僵尸状态)


2. 操作系统中进程的运行状态

现在我们使用的电脑,手机有四核的
有八核,十二核的,也就是有多个CPU
然而不管有多少个CPU,每一个CPU
都有一个对应的运行队列,CPU会去
此队列中寻找数据来做处理

只要一个进程在运行队列中,它就是运行状态

不管一个进程是否正在被处理,只要它在

运行队列中,那么它就是处于运行状态!


3. 操作系统中进程的阻塞状态

我先来描述一下进程会阻塞的情况:

当CPU处理一个PCB时,我们写的
代码中或多或少会去访问操作系统
里的某些资源,比如:磁盘,键盘,网卡

最简单的例子,当代码出现scanf

或者cin时,系统会等待用户输入,只要

不输入,要访问的资源就没有就绪

此时代码就无法运行!

此时进程就处于阻塞状态了吗?

对!但是不完全对!

我想给大家阐述的更细致一点

我们知道,系统中的硬件是通过
管理硬件数据来间接被操作系统
管理起来的,所以操作系统是很清楚
硬件现在是否具备访问条件,那么
操作系统是怎样知道的呢?
其实每一个设备的结构体中,都有
变量:PCB* wait_queue,也就是
等待队列,请看下图仔细分析:

将一个进程从运行队列移动至设备
的等待队列中,再将状态改为阻塞
此时这个进程就处于阻塞状态

每个CPU或是设备都有自己的队列
进程状态变化的本质就是:

  1. 更改PCB中status的整数变量
  2. 将PCB链接到不同的队列中!

4. 操作系统中进程的挂起状态

想象一下以下情况

如果现在有很多进程被阻塞(不同设备)
注定了这些进程在它所等待的资源没有
就绪的时候,该进程是无法被调度的,如果
此时,恰好操作系统的内存资源已经严重不足
那么现在应该这样做才能拯救操作系统呢?

答案是,因为此时进程处于阻塞
状态,并且内存已严重不足,所以
OS会将PCB对应的数据和代码
弄到磁盘,为内存腾出一部分空间
此时,进程就被挂起了!

注意,将内存数据换到外设上
这一操作是针对所有阻塞进程的
不用担心与外设频繁交互会降低
操作系统的效率,因为此时要关心
的是操作系统还能不能存活下去!
注意,swap分区是磁盘中真实存在的
它的大小往往是很小的,这个部分专门
用于内存严重不足时和内存进行交互
并且当内存情况缓解后,曾经被置换
出去的代码和数据又会重新加载进来!

5. Linux下特定的进程状态

先来看看我在库中找的状态的定义:

今天的主角是R和S状态

先来写一段程序来看看效果:

#include <stdio.h>    
#include <unistd.h>    
int main()    
{    
    while(1)    
    {    
        sleep(1);    
        printf("hello hdu\n");    
    }                                                                                                                                                                   
    return 0;    
}

运行此程序后查看进程状态:

按照常理来说,一个正在运行的程序

应该是处于R状态的,但是这个程序

为什么处于S状态呢(+号先不管,后面会讲)

这是因为循环打印时,IO输出是很慢的
打印字符会和外设屏幕交互,所以大
部分时间进程都处于阻塞状态,可能
只有百分之1的时间在打印,所以查看
进程状态时,大部分都是S状态,只有很少
一部分是R状态但是如果while(1)中
什么代码都没有,则程序一直处于R状态


6. 前台进程和后台进程的区别

我先给出概念再来解释:

  • 前台进程:运行时无法使用bash外壳的指令
    并且可以被CTRL C强制终止掉

  • 后台进程:运行时可输入指令,不能被CTRL C掉
    只能使用kill指令来杀掉进程.

将程序变成后台程序:

运行进程时加上: &

如: ./mybin &

先来对比观察一下前后台进程:

前台进程和后台进程区别


7. 休眠状态和磁盘休眠状态

细心的同学可能已经发现了

这几种状态中有两个很相似的状态:

S被称为浅度睡眠
D被称为深度睡眠

想象一下下面的这种情况:

我们从QQ,微信上下载一个文件
本质上就是将数据拷贝至磁盘,但是
目前这个文件很大,需要拷贝很久
但是此时操作系统的内存恰恰不足了
需要干掉一些进程来保证操作系统存活
此时若恰好将正在拷贝到磁盘的进程杀掉
了,那么也就是拷贝失败了,如果文件非常
的重要,那么操作系统就要背锅了,所以
OS创造了D状态:磁盘休眠状态!

所以我们得出一个重要的结论:

  1. S(sleeping):浅度休眠,浅度睡眠,可以被终止
  2. D(disk sleep):深度休眠,为了防止向磁盘写入
    重要资源时被杀掉而专门创建的一个分类!

8. 总结以及拓展

了解Linux中进程的分类可以更进一步

的了解进程在操作系统中的运行关系

所以进程状态是学习进程中必不可少的

一课!我们和进程的故事还远远没有结束!

拓展阅读:什么是僵尸进程?

什么是僵尸进程



相关文章
|
13天前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
26 0
|
8天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
12 1
|
13天前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
16 0
Linux c/c++之IPC进程间通信
|
13天前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
15 0
Linux c/c++进程间通信(1)
|
13天前
|
Linux C++
Linux c/c++之进程的创建
这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。
17 0
Linux c/c++之进程的创建
|
1月前
|
Linux Shell
6-9|linux查询现在运行的进程
6-9|linux查询现在运行的进程
|
13天前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
15 0
|
1月前
|
存储 监控 安全
探究Linux操作系统的进程管理机制及其优化策略
本文旨在深入探讨Linux操作系统中的进程管理机制,包括进程调度、内存管理以及I/O管理等核心内容。通过对这些关键组件的分析,我们将揭示它们如何共同工作以提供稳定、高效的计算环境,并讨论可能的优化策略。
37 0
|
1月前
|
Unix Linux
linux中在进程之间传递文件描述符的实现方式
linux中在进程之间传递文件描述符的实现方式
|
2月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
65 0