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

news2024/11/23 7:53:20

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

Linux进程

  • 1. 前言
  • 2. 操作系统中进程的运行状态
  • 3. 操作系统中进程的阻塞状态
  • 4. 操作系统中进程的挂起状态
  • 5. Linux下特定的进程状态
  • 6. 前台进程和后台进程的区别
  • 7. 休眠状态和磁盘休眠状态
  • 8. 总结以及拓展

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中进程的分类可以更进一步
的了解进程在操作系统中的运行关系
所以进程状态是学习进程中必不可少的
一课!我们和进程的故事还远远没有结束!

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

什么是僵尸进程


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1071802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录极致CMS非富文本标签调用不改变格式

问题 在前台如何输出这三行是换行的 前台调用{$jz[hhl]}就变成这样了“这是第一行这是第二行这是第三行” 除了富文本还有没有什么可以实现这样的呢&#xff1f; 方法 {foreach explode("\n",$jz[hhl]) as $v} {if($v)} {$v} {/if} {/foreach}

国内就能使用的chatgpt网页版,包含AIGC应用工具

Chatgpt的出现在多个领域带来了重要的影响。它能够显著提高我们的工作效率&#xff0c;无论是编写文案代码还是回答常见问题&#xff0c;都能在短时间内完成任务。通过Chatgpt&#xff0c;我们能够迅速获取所需答案。随着人工智能技术的不断发展&#xff0c;相信在未来AI能够带…

这个物业管理技巧,你一定不能错过!

在现代社会中&#xff0c;安全是至关重要的问题&#xff0c;特别是在多层建筑、住宅社区和商业物业等繁忙场所。火灾是一种常见的灾害&#xff0c;可能对人员生命和财产造成严重威胁。 为了及早检测火灾风险并采取迅速有效的应对措施&#xff0c;烟感监控系统应运而生&#xff…

Linux搭建我的世界MC服务器 【Minecraft外网联机教程】

目录 前言 1. 安装JAVA 2. MCSManager安装 3.局域网访问MCSM 4.创建我的世界服务器 5.局域网联机测试 6.安装cpolar内网穿透 7. 配置公网访问地址 8.远程联机测试 9. 配置固定远程联机端口地址 9.1 保留一个固定tcp地址 9.2 配置固定公网TCP地址 9.3 使用固定公网…

laravel9 from验证,中文提示

用的软件包官网文档地址&#xff1a;Getting Started | Laravel Lang 由于用的php8.0,所以 1.composer require --dev laravel-lang/common:v2.0.0 2.php artisan lang:add zh_CN 3. 完成&#xff0c;看下效果

Altium design 经验补充2

1. 改变现有板子的尺寸 1&#xff09;选择要更改的PCB&#xff0c;点击LS选择mechanical(机械层)&#xff0c; 2) 点击工具栏---放置---线条&#xff0c;线条最终必须是全闭合的。 3&#xff09;板子大小画完以后&#xff0c;放置原点&#xff0c;在工具栏点击 edit--origin--…

ArcGIS Pro地图可视化—双变量关系映射

原址链接ArcGIS Pro地图可视化—双变量关系映射https://mp.weixin.qq.com/s/g-pPBHPXMOEF5NHm06JcrA 这个方法很早很早以前就有了&#xff0c;可能大家早就知道了&#xff0c;可我昨天刚看到这个东西 https://en.wikipedia.org/wiki/Multivariate_map 像是上图&#xff0c;美国…

笔记本CPU温度多少正常?这些知识不可忽视!

“我的笔记本电脑使用的时候我总感觉好像很热&#xff0c;不知道正常使用电脑时&#xff0c;CPU温度应该是多少呢&#xff1f;有没有大佬可以讲解一下呀&#xff1f;” 随着电脑的使用越来越日常&#xff0c;关于电脑的相关问题也越来越受关注。今天小编将给大家分享一些关于电…

HTML+CSS跑马灯/流光字效果实例代码

简介 HTMLCSS跑马灯/流光字效果实例代码 演示 代码 css <style type"text/css">body {margin: 0;padding: 0;background-color: #2f2424;}div {margin: 400px auto;font-size: 40px;text-align: center;}p {margin: 0;background: -webkit-linear-gradient(…

面试字节跳动国际电商部,凉了。。。

大家好&#xff0c;我是程序员小灰。 最近&#xff0c;小灰的一位读者在秋招提前批的时候&#xff0c;面试了字节的国际电商部门。这场面试考察得非常全面&#xff0c;涉及到了项目经验、数据结构、设计模式、数据库、Spring等等。 为了能帮助到更多程序员朋友&#xff0c;这位…

如何恢复微信过期文件?用这4招,轻松解决!

如今&#xff0c;无论是学习还是工作我们都离不开微信&#xff0c;微信的出现改变了人们的社交方式。也正是因为微信&#xff0c;人们之间的交流变得更加便捷与多样化。 微信有很多方便的功能&#xff0c;我们可以通过微信来传输许多重要的文件。但是有时候可能由于自己的疏忽…

【表情包分享】国庆假期结束了,该上班了,来分享一下你的表情包吧!

文章目录 每日一句正能量前言正文后记 每日一句正能量 国庆结束了&#xff0c;但快乐留下了&#xff1b;长假远走了&#xff0c;但开心到来了&#xff1b;八天过去了&#xff0c;但好运来临了&#xff1b;工作开始了&#xff0c;故祝福来到了。祝&#xff1a;收假快乐&#xff…

Python 接口测试之接口请求方法封装

引言 既然我们接口测试用例写好了&#xff0c;测试数据也拿到了&#xff0c;那么就是模拟调用接口的方法了&#xff0c;方法有get,post,put,delete&#xff0c;具体是选择哪种&#xff0c;我们需要根据不同接口规定好请求方法来调用。为了方便&#xff0c;将四种方法封装到一个…

访问Apache Tomcat的管理页面

配置访问Tomcat管理页面的用户名、密码、角色 Tomcat安装完成后&#xff0c;包含了一个管理应用&#xff0c;默认安装在 <Tomcat安装目录>/webapps/manager 例如&#xff1a; 要使用管理页面的功能&#xff0c;需要在conf/tomcat-users.xml文件中配置用户、密码及角色…

AutoDL百川大模型体验

文章目录 镜像克隆模型下载测试效果AutoDL自定义服务 感谢AutoDL和CodeWithGPU这两个平台&#xff0c;让我们能低成本&#xff0c;低门槛地部署体验这些大模型 镜像克隆 我是在CodeWithGPU上克隆的这个镜像 模型下载 codewithgpu有介绍 注意这三个文件都需要下载 把那个&quo…

Mac navicat连接mysql出现1045 - Access denied for user ‘root‘

Mac navicat连接mysql出现1045 - Access denied for user ‘root’ 前提&#xff1a;如果你的mac每次开navicat都连接不上&#xff0c;推荐试试我这个方法 1.打开设置–>找到左下角最下面的MySQL–>点击Stop MySQL Server 2.开启一个终端&#xff0c;依次输入以下命令&a…

九大高效的前端测试工具与框架

前言&#xff1a; 在每个Web应用程序中&#xff0c;作为用户直接可见的应用程序外观&#xff0c;“前端”包括&#xff1a;图形化的用户界面、相应的功能、及其整体站点的可用性。我们可以毫不夸张地说&#xff1a;如果前端无法正常工作&#xff0c;您将无法“拉新”网站的潜在…

uniapp中使用编辑器editor

1.需求&#xff1a; 开发小程序时&#xff0c;想要在手机上添加编辑内容&#xff0c;使用u–textarea时&#xff0c;换行操作不显示&#xff0c;为此使用了uniapp自带的组件editor来实现&#xff1a; 2.使用&#xff1a; <template><view class"">&l…

UniAD 论文学习

一、解决了什么问题&#xff1f; 当前的自动驾驶方案大致由感知&#xff08;检测、跟踪、建图&#xff09;、预测&#xff08;motion、occupancy&#xff09;和规划三个模块构成。 为了实现各种功能&#xff0c;智驾方案大致包括两种路线。一种是针对每个任务都部署一个模型&a…

Go 复合类型之切片类型介绍

Go 复合类型之切片类型 文章目录 Go 复合类型之切片类型一、引入二、切片(Slice)概述2.1 基本介绍2.2 特点2.3 切片与数组的区别 三、 切片声明与初始化3.1 方式一&#xff1a;使用切片字面量初始化3.2 方式二&#xff1a;使用make函数初始化3.3 方式三&#xff1a;基于数组的切…