当前位置: 首页 > news >正文

Linux 下进程的状态

操作系统中常见进程状态

在操作系统中有六种常见进程状态:

  1. 新建状态: 进程正在被创建. 此时操作系统会为进程分配资源, 如: 内存空间等, 进行初始化
  2. 就绪状态: 进程已经准备好运行了, 只需要等待被调度, 获取 CPU 资源就可以执行了, 操作系统中可能同时存在多个进程处于就绪状态, 都在排队等待获取 CPU 资源
  3. 运行状态: 进程获得了 CPU 资源, 正在执行指令
  4. 阻塞状态: 进程因为需要等待某个条件而进行暂停执行
  5. 终止状态: 进程已经完成了任务或者因为一些错误结束了运行, 操作系统会回收进程占用的资源.
  6. 挂起状态: 挂起是一种特殊操作, 当系统内存资源紧张时, 一些暂时没有运行的进程会被暂时交换到外存中挂起.

运行状态

CPU 会维护一个运行队列.
CPU 会从这个队列中寻找数据来进行处理.

当一个进程被放在了运行队列中, 那么这个进程的状态就是运行状态.
无论这个基础是否正在被处理.

阻塞状态

进程因为需要等待某个条件而进行暂停执行

进程在运行过程中或多或少都会去访问一些操作系统的资源: 如硬盘里的数据, 网卡接受的数据 ...

最常见的: 我们在学习 C 或 C++ 时, 都写过从键盘上获取两个数据, 然后打印出这两个数据之和.
当我们这个程序运行起来之后, 就会在控制台中要我们输入数据, 如果我们一直不输入数据, 那么这个程序就不会向后执行. 这就是一种阻塞状态, 进程在一直在等待键盘的资源.

那么操作系统是怎么知道, 哪个进程需要键盘的数据的呢?

我们之前了解到: 操作系统是管理软硬件资源的, 并且是通过软硬件的信息来了解软硬件对应的状态, 从而管理. 

键盘也是一个硬件资源, 所以操作系统也会收集键盘的信息, 存放在一个 struct 结构体中.

像键盘, 硬盘这样的设备的 结构体中, 都会维护一个等待队列

需要这个设备资源的进程都会被链入这个队列中,

这样当资源来临时, 就可以将资源给到对应的进程

 

那么进程状态从 运行状态 到 阻塞状态, 都经历了什么:
将进程的 PCB 从运行队列移动到设备的等待队列, 将状态修改为阻塞状态. 自此状态的修改完成.

进程状态变化本质: 

  1. 更改进程 PCB 中的 status 字段
  2. 将进程 PCB 链入到等待队列中

挂起状态

挂起又分为:

  • 就绪挂起
  • 阻塞挂起

这两种状态之前的区别就是: 进程在挂起之前的状态.

当相同的内存严重不足的时候: 
就绪状态 和 阻塞状态的 进程此时因为资源没有就绪, 所以都还没有调度.

与其放在内存中继续占用内存, 不如先将这些进程的代码和数据弄到硬盘中,

为操作系统腾出一部分空间.

在硬盘中, 这部分用来存储挂起进程代码和数据的空间, 称为 swap分区.
swap分区通常很小, 这个部分专门用与这种情况.

问题: 频繁的和硬盘这种外设交互, 那么操作系统的效率不就变得很低? (相较于 CPU 访问内存, 访问硬盘这样的外设, 速度是非常慢的)

此时的操作系统正处于内存严重不足的情况, 如果再不腾出一部分空间, 可能下一秒就会直接宕机了.

此时, 操作系统更关心的是能否存活下去, 而不是效率, 如果操作系统直接宕机, 那么所有的进程都会直接结束, 哪还谈什么效率.

以上说的是通用的状态, 在 Linux 中进程的状态又有些不同.

 Linux中六种常见状态

  1. R 运行状态 (running)
  2. S 睡眠状态 (sleeping), 也称为可中断睡眠状态. 意味着进程在等待事件的完成
  3. D 磁盘休眠状态 (Disk sleep), 也可称为不可中断睡眠状态.
  4. T 停止状态 (stopped) 通过发送 SIGSTOP 信号给进程来停止 (T) 进程, 这个被暂停的进程可以通过接收 SIGCONT 信号, 让进程运行起来
  5. X 死亡状态 (dead): 表示一个进程已经完成其执行并即将被销毁. 这个状态只是一个返回状态,意味着进程已经结束其生命周期,但还没有被完全清除出系统. 这个状态下的进程不会在任务列表中出现. 而且这个状态非常短暂, 几乎不可能通过 ps 命令捕捉到.
  6. z 僵尸状态: 僵尸状态(Zombie State)是一种特殊的进程状态,它表示一个进程已经完成执行,但其父进程尚未回收其终止状态

 R 和 S状态

我们运行下面这段程序

#include <iostream>
#include <unistd.h>
int main()
{while(1){std::cout << "hello world" << std::endl;}return 0;
}

 使用 ps命令观察 ./a.out 这个进程.

 S+: 中的 + 号和前后台进程有关. 这个在文章后面来讲解.

我们会发现: 这个正在运行的进程没有处于 R 状态, 而是处于 S 状态. 为什么?

上面说过, 访问外设的速度非常慢, printf 会将内容打印到屏幕上,

屏幕就是一种外设, 与屏幕交互的速度很慢, 程序的大部分时间内,

都处于 阻塞状态, 在等待外设将内容显示到屏幕上.

真正处于运行的事件很少.

当然, 我们只需要将 cout 语句去掉, 一直循环, 那么就能观察到, 程序一直处于 R 状态

S 和 D状态

S 和 D 都是睡眠状态, 这两个睡眠状态有什么差别?
S: 可以被比作浅度睡眠
D: 可以被比作深度睡眠

当我们从 QQ 上下载一个文件时, 这个文件是需要被拷贝到硬盘中的

如果这个文件非常的大, 而此时操作系统的内存又不足了, 需要杀死一些进程,

腾出一些空间, 如果此时 QQ 就被杀死了, 那么文件的下载也就失败了,

这些数据可能是非常重要的, 而操作系统杀死了进程, 导致我的文件丢失了,

这是很麻烦的事情.

所以, 操作系统就提供了一个 D 状态, 当进程处于 D 状态时, 操作系统就不会杀死这个进程.
因为 D 代表此时进程正在和磁盘交互, 为了不如数据丢失, 不要杀掉这个进程.

结论: 

S (sleeping): 浅度睡眠, 可以被终止

D (disk sleep): 深度睡眠, 防止像硬盘写入数据时被杀掉而专门创立的状态

 

Z 僵尸状态

僵尸状态的出现和父子进程有关.

僵尸状态: 

僵尸状态是一种特殊的进程状态, 它表示一个进程已经完成执行, 但其父进程尚未回收其终止状态.

我们知道创建子进程, 是为了去完成任务, 那么这个任务是否完成, 完成的结果如何等信息, 都应该要告诉父进程. 

当子进程结束后, 而父进程没有没有接收子进程返回的信息, 那么子进程就不会被操作系统回收, 这时子进程就加入了僵尸状态.

前台/后台进程

在上面观察进程的 R / S 状态时, 我们可以看到进程的状态是 R+ / S+.
这个 "+" 是什么意思?

这个 "+" 代表这个进程是在前台运行的.
那什么叫前台进程, 什么叫后台进程?

前台进程: 可以在终端直接交互
后台进程: 不会接收终端的输入, 要结束后台进程通常使用 kill 命令.

代码:

#include <iostream>
#include <unistd.h>
int main()
{while(1){sleep(1);std::cout << "hello world" << std::endl;}return 0;
}

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

可以看到, 当进程在前台运行时, 我向终端输入 ls 命令, 并没有打印出当前目录下的文件.
此时我们只能和这个前台进程进行交互, 无法向命令行解释器发送指令.

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

在命令后面加上一个 &

./a.out &

可以看到, 我输入 ls 指令依然可以查询当前目录下的文件. Ctrl C 也无法终止这个进程

相关文章:

Linux 下进程的状态

操作系统中常见进程状态 在操作系统中有六种常见进程状态: 新建状态: 进程正在被创建. 此时操作系统会为进程分配资源, 如: 内存空间等, 进行初始化就绪状态: 进程已经准备好运行了, 只需要等待被调度, 获取 CPU 资源就可以执行了, 操作系统中可能同时存在多个进程处于就绪状…...

【计算机网络】核心部分复习

目录 交换机 v.s. 路由器OSI七层更实用的TCP/IP四层TCPUDP 交换机 v.s. 路由器 交换机-MAC地址 链接设备和设备 路由器- IP地址 链接局域网和局域网 OSI七层 物理层&#xff1a;传输设备。原始电信号比特流。数据链路层&#xff1a;代表是交换机。物理地址寻址&#xff0c;交…...

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性&#xff0c;极大简化了开发流程。本文将以实战为核心&#xff0c;从基础到高级&#xff0c;全面探讨 Spring Boot 的应用开发。 一、Spring B…...

pyshark安装使用,ubuntu:20.04

1.容器创建 命令 docker run -d --name pyshark -v D:\src:/root/share ubuntu:2004 /bin/bash -c "while true;do sleep 1000;done" 用于创建并启动一个新的 Docker 容器。 docker run -d --name pyshark -v D:\src:/root/share ubuntu:2004 /bin/bash -c "w…...

基本功能实现

目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…...

《那个让服务器“跳舞”的bug》

在程序的世界里&#xff0c;bug 就像隐藏在暗处的小怪兽&#xff0c;时不时跳出来捣乱。而在我的职业生涯中&#xff0c;有一个bug让我至今难忘&#xff0c;它不仅让项目差点夭折&#xff0c;还让我熬了无数个通宵。这个故事发生在一个风和日丽的下午&#xff0c;我们正在开发一…...

Python 网络爬虫进阶:动态网页爬取与反爬机制应对

在上一篇文章中&#xff0c;我们学习了如何使用 Python 构建一个基本的网络爬虫。然而&#xff0c;在实际应用中&#xff0c;许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此&#xff0c;本篇文章将深入探讨以下进阶主题&#xff1a; 如何处理动态加载的网…...

创建可直接用 root 用户 ssh 登陆的 Docker 镜像

有时候我们在 Mac OS X 或 Windows 平台下需要开发以 Linux 为运行时的应用&#xff0c;IDE 或可直接使用 Docker 容器&#xff0c;或 SSH 远程连接。本地命令行下操作虽然可以用 docker exec 连接正在运行的容器&#xff0c;但 IDE 远程连接的话 SSH 总是一种较为通用的连接方…...

wordpress 中添加图片放大功能

功能描述 使用 Fancybox 实现图片放大和灯箱效果。自动为文章内容中的图片添加链接&#xff0c;使其支持 Fancybox。修改了 header.php 和 footer.php 以引入必要的 CSS 和 JS 文件。在 functions.php 中通过过滤器自动为图片添加 data-fancybox 属性。 最终代码 1. 修改 hea…...

数据结构 (7)线性表的链式存储

前言 线性表是一种基本的数据结构&#xff0c;用于存储线性序列的元素。线性表的存储方式主要有两种&#xff1a;顺序存储和链式存储。链式存储&#xff0c;即链表&#xff0c;是一种非常灵活和高效的存储方式&#xff0c;特别适用于需要频繁插入和删除操作的场景。 链表的基本…...

库的操作.

创建、删除数据库 创建语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name[ ]是可选项&#xff0c;IF NOT EXISTS 是表明如果不存在才能创建数据库 //查看数据库&#xff0c;假设7行 show databases; //创建数据库 --- 本质在Linux创建一个目录 create database databa…...

Vue进阶之Vue CLI服务—@vue/cli-service Vuex

Vue CLI服务—vue/cli-service & Vuex vue/cli-service初识bin/vue-cli-service.js代码执行解读 Vuexgenerator/index.jsstore/index.js插件化的能力怎么引入呢&#xff1f; vue/cli-service 初识 第一块是上一个讲述的cli是把我们代码的配置项&#xff0c;各种各样的插件…...

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…...

数据库操作、锁特性

1. DML、DDL和DQL是数据库操作语言的三种主要类型 1.1 DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言 DML是用于检索、插入、更新和删除数据库中数据的SQL语句。 主要的DML语句包括&#xff1a; SELECT&#xff1a;用于查询数据库中的数据。 INSERT&a…...

学习笔记039——SpringBoot整合Redis

文章目录 1、Redis 基本操作Redis 默认有 16 个数据库&#xff0c;使用的是第 0 个&#xff0c;切换数据库添加数据/修改数据查询数据批量添加批量查询删除数据查询所有的 key清除当前数据库清除所有数据库查看 key 是否存在设置有效期查看有效期 2、Redis 数据类型String追加字…...

(笔记)简单了解ZYNQ

1、zynq首先是一个片上操作系统&#xff08;Soc&#xff09;&#xff0c;结合了arm&#xff08;PS&#xff09;和fpga&#xff08;PL&#xff09;两部分组成 Zynq系统主要由两部分组成&#xff1a;PS&#xff08;Processing System&#xff09;和PL&#xff08;Programmable L…...

大众点评小程序mtgsig1.2算法

测试效果&#xff1a; var e function _typeof(o) {return "function" typeof Symbol && "symbol" typeof Symbol.iterator? function (o) {return typeof o;}: function (o) {return o && "function" typeof Symbol &…...

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…...

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明&#xff0c; 将Form的属性Opacity&#xff0c;由默认的100% 调整到 80%&#xff0c;这个数字越小越透明(尽量别低于50%&#xff0c;不信你试试看)&#xff01; 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…...

基于YOLOv8深度学习的智慧课堂教师上课行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着人工智能技术的迅猛发展&#xff0c;智能课堂行为分析逐渐成为提高教学质量和提升教学效率的关键工具之一。在现代教学环境中&#xff0c;能够实时了解教师的课堂表现和行为&#xff0c;对于促进互动式教学和个性化辅导具有重要意义。传统的课堂行为分析依赖于人工观测&…...

使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件

使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件 Python 是一门强大的编程语言&#xff0c;它不仅可以用于数据处理、自动化脚本&#xff0c;还可以用于创建图形用户界面 (GUI) 应用程序。在本教程中&#xff0c;我们将使用 Python 的标准库模块 tkinter 创建一…...

【C++笔记】模板进阶

前言 各位读者朋友们大家好&#xff01;上一期我们讲了stack、queue以及仿函数。先前我们讲过模板的初阶内容&#xff0c;这一期我们来更深入的学习一下模板。 一. 非类型模板参数 1.1 非类型模板参数 模板参数分为类型形参和类类型形参&#xff1a; 类型形参&#xff1a;…...

Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新

随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…...

ffmpeg.wasm 在浏览器运行ffmpeg操作视频

利用ffmpeg.wasm&#xff0c;可以在浏览器里运行ffmpeg,实现对音视频的操作 参考链接&#xff1a; https://blog.csdn.net/jchsgwbr/article/details/143252044 https://gitee.com/CXBalCai/ffmpeg-template 其他参考 https://github.com/ffmpegwasm/ffmpeg.wasm https://b…...

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…...

CentOS上如何离线批量自动化部署zabbix 7.0版本客户端

CentOS上如何离线批量自动化部署zabbix 7.0版本客户端 管理的服务器大部分都是CentOS操作系统&#xff0c;版本主要是CentOS 7。因为监控服务器需要&#xff0c;要在前两天搭建的Zabbix 7.0系统上把这些CentOS 7系统都监控起来。因为服务器数量众多&#xff0c;而且有些服务器…...

【开源项目】ChinaAddressCrawler 中国行政区划数据(1980-2023年)采集及转换(Java版),含SQL格式及JSON格式

ChinaAddressCrawler 开源项目地址&#xff1a;https://gitee.com/li_yu_jiang/ChinaAddressCrawler 来源于国家民政部的数据只包括省级&#xff08;省/直辖市/自治区/特别行政区&#xff09;、地级&#xff08;地级市/地区/自治州/盟&#xff09;、县级&#xff08;县/市辖区…...

React中事件处理和合成事件:理解与使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Local Changes不展示,DevEco Studio的git窗口中没有Local Changes

DevEco Studio的git窗口中&#xff0c;没有Local Changes&#xff0c;怎么设置可以调出&#xff1f; 进入File-->Settings-->Version Control&#xff0c;将Use non-modal commit interface前的勾选框取消勾选&#xff0c;点击OK即可在打开git窗口&#xff0c;就可以看到…...

大数据笔记

第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征&#xff0c;并结合生活实例谈谈带来的影响。 &#xff08;一&#xff09;特征 1、Volume 规模性&#xff1a;数据量大。 2、Velocity高速性&#xff1a;处理速度快。数据的生成和响…...

国外网站怎么打开/高端网站建设公司排名

4其他需要注意的事项如果您在清单文件AndroidManifest.xml中&#xff0c;有那种以包名开头命名的那种。因为如果包名都改了&#xff0c;有些也需要动态的改变。可以用${applicationId}代替。在打包的时候&#xff0c;会自动替换成当前包名。比如&#xff0c;类似下配置&#xf…...

做网站三年3万块钱/常用的关键词挖掘工具

首先谈一下最简单的Bash博弈。Bash博弈是这样的&#xff1a;两个人&#xff0c;n个物品&#xff0c;每个人每次都可以取走1-m个物品&#xff0c;取走最后一个物品的人胜利。问先手在什么条件下必胜。 #include <bits/stdc.h> #define ll long long #define inf 0x3f3f3f…...

成立公司注册资金可以随便写吗/百度seo新规则

内容出自极客时间专栏《Linux 性能优化实战》 CPU 的性能指标那么多&#xff0c;CPU 性能分析工具一抓一大把&#xff0c;换成实际的工作场景&#xff0c;该观察什么指标、选择哪个性能工具呢&#xff1f; 不要担心&#xff0c;今天我就以多年的性能优化经验&#xff0c;为你总…...

北京网站制作郑州/seo关键词推广多少钱

导语&#xff1a;考试周到来&#xff0c;大一新生如何备考&#xff0c;才能保证期末考试不挂科呢&#xff1f;无论是中学生还是大学生&#xff0c;每学期末&#xff0c;期末考试都是绕不过的话题。只不过这两的难度跟影响不同。中学时代的期末考试比较难&#xff0c;上课不认真…...

在哪里找做网站的/网站建设情况

浙江省赛补 IMagic Points 比赛时&#xff0c;我还在一直纠结&#xff0c;5 3这条线为啥不行&#xff0c;结果下来才知道题目不能有重复点没有说&#xff0c;然后fdf说应该是2 7或者 2 5那条线&#xff0c;我也只能通过画图连猜想了。。。 #include <cstdio> #include &l…...

wordpress朋友圈主题/网站推广软件下载

combox存在问题 界面加载完成信号 Component.onCompleted: { console.log(“1”) } combox盒子组件 combox{ model:{ console.log(“2”) } onActivated: { } onCurrentTextChanged: { } } 以上发现总是先打印2&#xff0c;再打印1&#xff1b; onCurrentTextChanged信号在i…...