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

【Linux系统编程】进程属性--进程状态

1.进程的状态

1.1进程的状态在PCB中就是一个变量

一般用宏来定义,例如:

#define RUNNING 1

#define BLOCK 2

struct task_struct中的int status

1.2并行和并发

CPU执行代码,不是把进程代码执行完毕,才执行下一个,而是给每一个进程预分配一个时间片,基于时间片进行调度轮转(单CPU下),叫做并发。CPU切换和运行速度非常快,所以用户感知不到。

并发:多个进程在一个CPU下,采用进程切换的方式,在一段时间内,让多个进程都得以推进,称之为并发。

并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。

1.3时间片

Linux/windows民用级别的操作系统,基本都是分时操作系统(相对的有实时操作系统,比如在汽车中实时操作系统和分时操作系统都有,比如在踩刹车时,这个进程必须高优先级处理,并且要处理就必须尽快处理完的,这种叫做实时操作系统),调度任务追求公平。

1.4进程具有独立性

每个进程拥有独立的地址空间和运行环境,彼此隔离,互不干扰。

1.5等待的本质

等待的本质是连入目标设备,CPU不调度了。

运行和阻塞的本质是让不同的进程处在不同的队列中。占有CPU资源和占用设备资源,表现出来的状态分别叫做运行和阻塞。卡住的本质是CPU不调度了,键盘没数据,在等待,或者系统没数据了。

1.5.1什么叫阻塞

列入到设备的等待队列的就是阻塞状态。

1.5.2什么叫运行状态

只要进程在运行队列中,该进程就叫做运行状态,表示我已经准备好了,可以被CPU调度了。所以一般就绪和运行状态是一样的。

1.5.3CPU的运行队列

操作系统内部都要给每一个CPU提供一个运行队列struct rqueue,就是在操作系统内部的一个结构体。

该队列中包含的属性:

  • int nums即包含有多少进程
  • 其他属性
  • task_struct *head指向task_struct(运行进程的PCB)也即所有需要被调度的进程都连入到这个运行队列中

CPU调度时,只需要找到该CPU对应的rqueue,FIFO调度算法选择进程,即基于时间片轮转的先进先出的调度队列。

eg:IO操作,执行scanf【封装有系统调用,去帮操作系统查键盘上有没有数据,如果没有就变成阻塞,不把该进程连入到队列里,而是连入到设备上,把该进程的PCB连入到struct device中的wait_queue队列中,有数据了,操作系统就把这个进程的PCB再连入到运行队列】,如果CPU发现没有按键输入,该进程就不能被继续执行了,该进程会变成阻塞状态,等待底层硬件准备好。

1.5.4操作系统如何管理硬件

先描述

struct device
{int tpye;//表示是哪个设备int status;//表示设备的状态//管理时间//其他属性struct device *next;//设备之间连接task_struct wait_queue;//阻塞的进程都到设备的这个队列中等待
}

再组织:五个硬件设备,那么就有五个struct device

OS管理硬件转化成对链表的增删查改(通过驱动层获取数据)。

1.6挂起状态

  • 背景:处于阻塞状态的进程的PCB对应有代码和数据,是占内存的,但是目前还没有被调度时,这部分内存资源其实是浪费的。这个时候,如果内存资源严重不足,OS就会把正在阻塞状态的进程的代码和数据换出到磁盘中,只留下其PCB。后来键盘有数据了,OS就把该进程的代码和数据换入回来,然后再把PCB中的阻塞改为运行,并把该PCB连入到运行队列中。
  • 在内存资源严重不足时,所有在等待外设的进程都有可能被换出。
  • 磁盘中有一个专门用来换入换出的交换分区(swap分区),本质是用时间换空间
  • 云服务器中的swap分区功能一般禁掉。
  • 换入换出的本质是IO,所以比较慢。
  • 被换出的进程,此时的状态叫做阻塞挂起状态。
  • 也有运行挂起,风险较大,一般不。
  • 换入换出解决不了的时候,OS会优先保证自己的安全,所以可能会把一些占用资源最多的进程直接结束。比如一些应用程序闪退了。

2.Linux进程的状态

2.1R运行状态

ps axj | grep code查看进程code

ps axj | head -1 && ps axj | grep code查看进程,看到状态是S+,+代表是前台跑的。

去掉printf代码后,变成R+状态

因为99%的时候都是在IO(printf),太慢了,所以只有很少的时候在运行队列里,大部分时候是在等待的。

2.2S休眠状态

本质是阻塞等待状态

修改代码为scanf再printf

在等待阻塞的状态时,是可以被信号中断的kill -9 3086,这叫做可中断睡眠浅睡眠。

2.3D深度睡眠,不可被杀掉的状态

disk磁盘,也是阻塞等待的状态的一种。不可中断睡眠,深睡眠。

磁盘用来存取数据,永久的。

背景:

  • 一个进程A的任务是保存一整天银行的交易记录,这个进程要把数据写到磁盘中。
  • 进程把数据交给磁盘。
  • 磁盘保存数据非常慢,保存数据非常花时间。
  • 磁盘正在写入数据的期间,进程A在阻塞等待磁盘把数据写完,所以进程A从运行队列中剥离,进到磁盘的等待队列中,此时进程A的状态是D。此时OS发现此时内存资源严重不足了,但是进程A是深度睡眠,不可被杀掉的状态,进程A就可以得到磁盘的写入结果,成功或者失败,这样数据就不会在系统层面丢失了。

等待磁盘的时候必须是D状态,防止数据丢失。

一般查到进程是D状态,说明系统快挂掉了。

2.4T暂停状态

kill -l查看信号

  • 19信号是用来暂停一个进程
  • kill -19 4770停止进程4770
  • 18信号继续
  • kill -18 4770继续进程
  • 表示进程做了非法但是不致命的操作,被OS暂停了。

前台进程S+

  • ./code &再回车就把前台任务变成后台任务了。
  • ctrl c可终止

后台进程S

  • 暂停再开始,进程会到后台运行
  • ctrl c无法禁止
  • kill -9 4770才能杀掉

为什么要放在后台

  • 方便继续命令行操作等

2.5t追踪暂停状态

gdb code

打断点。

当进程被追踪时,断点停下,进程状态就是t。

2.6X死亡状态

1.进程为什么会被创建?

进程创建出来是为了完成用户的任务。

2.进程退出后,任务完成了吗?

  • 通过进程执行的结果,告知父进程或OS,我把任务完成的如何。
  • echo $?用来记录最近程序退出时的退出信息,0表示进程执行成功,非0表示执行出错。

3.main函数返回0,就是告诉父进程(bash)我的执行结果是正确的。

2.7Z僵尸进程

1.先进入Z状态,然后才有X状态。

2.为什么要有Z状态?

维持退出信息,方便父进程或OS来查询。

3.进程退出后,代码不会执行了,所以代码和数据不需要存在了。首先可以立即释放的就是进程对应的程序信息数据。

4.进程退出,要有退出信息(进程的退出码int code(main函数的返回值))保存在自己的task_struct内部。

5.管理结构task_struct必须被OS维护起来,方便用户未来进行获取进程的退出信息。

6.创建的时候,先创建内核数据结构再加载代码和数据。

7.退出的时候,先释放代码和数据,再维护内核数据结构,此时进程的这个状态叫做僵尸状态,此时父进程或OS可以通过内核数据结构获取进程退出信息。

2.7.1看到僵尸进程

1.创建子进程

2.父子进程同时存在

3.让子进程退出,父进程存活,但是让父进程什么都不做

4.杀掉子进程,Z状态

Z状态,如果没人回收我(默认没人管,一般需要父进程读取子进程信息,子进程才会自动退出,后面说怎么做),我会一直僵尸🧟‍♂️那么task_struct会一直存在,一直消耗内存。即内存泄漏了。

5.父在,子退,子进程僵尸🧟‍♀️

语言层面的内存泄漏问题,如果常驻内存的进程中出现内存泄漏,(不退出,会一直占用内存,即内存泄漏)影响比较大。

6.malloc出来的空间,这个进程退出后,申请的空间也会释放(因为申请的空间属于程序的数据)

2.8孤儿进程

父退,子在

1.父进程退了为什么没有僵尸?

因为父进程的父进程是bash

2.子进程的ppid变成了1?

1代表system

子进程的PPID变成1了,代表被系统自动领养了。

子进程未来想退出了,系统会自动回收子进程。

3.被领养的进程默认回到后台运行,所以ctrl c无法杀掉,只能kill -9 pid

相关文章:

【Linux系统编程】进程属性--进程状态

1.进程的状态 1.1进程的状态在PCB中就是一个变量 一般用宏来定义,例如: #define RUNNING 1 #define BLOCK 2 struct task_struct中的int status 1.2并行和并发 CPU执行代码,不是把进程代码执行完毕,才执行下一个&#xff0…...

Go Modules 的基本使用

在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。以下是详细步骤和最佳实践: 一、首次初始化项目的标准流程 1.1 创建项目目录并初始化模块 mkdir myproject && cd myproject go mod init github…...

光流 | 基于深度学习的光流估计算法汇总,原理,公式,流程图,代码

基于深度学习的光流算法 一、光流估计的基本原理二、基于深度学习的光流估计算法1. **FlowNet系列**2. **FlowNet 2.0**3. **PWC-Net**4. **RAFT(Recurrent All-Pairs Field Transformers)**5. **LiteFlowNet系列**三、算法流程图示例FlowNet2.0架构PWC-Net金字塔处理流程四、…...

高精度之加减乘除之多解总结(加与减篇)

开篇总述:精度计算的教学比较杂乱,无系统的学习,且存在同法多线的方式进行同一种运算,所以我写此篇的目的只是为了直指本质,不走教科书方式,步骤冗杂。 一,加法 我在此讲两种方法: …...

dify插件接入fastmcp示例

文章目录 1. 使用python完成mcp服务1.1 准备环境(python安装fastmcp)1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略(支持 MCP 工具) 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置&#xff…...

c++——二叉树进阶

1. 内容安排说明 二叉树在前面C数据结构阶段已经讲过,本节取名二叉树进阶是因为: 1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构 2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性 3. 二叉树中部…...

MySQL 中如何进行 SQL 调优?

在MySQL中进行SQL调优是一个系统性工程,需结合索引优化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。以下是具体优化方法及案例说明: 一、索引优化:精准提速的关键 索引类型选择 普通索引:加速频繁查询的列&…...

【C++游戏引擎开发】第33篇:物理引擎(Bullet)—射线检测

一、射线检测核心理论体系 1.1 射线检测的数学基础 1.1.1 参数化射线方程 射线在三维空间中的数学表达采用参数方程: r ( t ) = o + t d ^ ( t ∈ [...

基于flask+pandas+csv的报表实现

基于大模型根据提示词去写SQL执行SQL返回结果输出报表技术上可行的,但为啥还要基于pandas去实现呢? 原因有以下几点: 1、大模型无法满足实时性输出报表的需求; 2、使用大模型比较适合数据量比较大的场景,大模型主要…...

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)

文章目录 一、QFont常用方法二、常用方法总结1. 基础属性设置2. 高级样式控制3. 序列化与反序列化4. 字体信息获取 三、应用实例 字体类QFont用于设置界面控件上显示的字体,它包含字体名称、字体尺寸、粗体字、斜体字、删除线、上划线、下划线、字体间距等属性。 如…...

北斗导航 | 北斗RTK定位厄待解决的问题,未来发展

北斗RTK(实时动态定位)技术在高精度定位领域已取得显著进展,但仍面临一系列技术挑战和未来发展方向。以下从亟待解决的问题和未来发展趋势两方面进行详细分析: 一、北斗RTK定位亟待解决的核心问题 电离层扰动对定位精度的影响 电离层扰动是当前北斗RTK技术面临的最大自然挑…...

宝塔服务安装使用的保姆级教程

宝塔介绍: 宝塔面板(BT Panel) 是一款 国产的服务器运维管理面板,主要用于简化 Linux/Windows 服务器的网站、数据库、FTP、防火墙等管理操作。它通过图形化界面(Web端)和命令行工具(bt 命令&a…...

Linux平台下SSH 协议克隆Github远程仓库并配置密钥

目录 注意:先提前配置好SSH密钥,然后再git clone 1. 检查现有 SSH 密钥 2. 生成新的 SSH 密钥 3. 将 SSH 密钥添加到 ssh-agent 4. 将公钥添加到 GitHub 5. 测试 SSH 连接 6. 配置 Git 使用 SSH 注意:先提前配置好SSH密钥,然…...

Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux

🚀 Electron 打包与发布指南:让你的应用运行在 Windows、macOS、Linux 使用 Electron 开发桌面应用只是第一步,最终我们还需要将应用打包成用户可运行的可执行文件(如 .exe、.dmg、.AppImage),并能在各平台…...

Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析

目录 1.前言 2.正文 2.1状态码 2.2HTTP与HTTPS的关系 2.3SSL协议 2.3.1对称加密 2.3.2非对称加密 2.3.3中间人攻击 2.3.4校验机制 2.3.4.1证书 2.3.4.2数字签名 1. 数字签名的生成过程 2. 数字签名的验证过程 2.4TLS协议(握手过程) 3.小结…...

【基础IO下】磁盘/软硬链接/动静态库

前言: 文件分为内存文件和磁盘文件。磁盘文件是一个特殊的存在,因为磁盘文件不属于冯诺依曼体系,而是位于专门的存储设备中。因此,磁盘文件存在的意义是将文件更好的存储起来,一边后续对文件进行访问。在高效存储磁盘…...

SpringBoot项目容器化进行部署,meven的docker插件远程构建docker镜像

需求:将Spring Boot项目使用容器化进行部署 前提 默认其他环境,如mysql,redis等已经通过docker部署完毕, 这里只讨论,如何制作springboot项目的镜像 要将Spring Boot项目使用docker容器进行部署,就需要将Spring Boot项目构建成一个docker镜像 一、手动…...

【小记】excel vlookup一对多匹配

一个学生报四门课,输出每个学生课程 应用概述操作预处理数据计数指令 COUNTIFS进行一对多匹配 vlookup 应用概述 应用场景:学生报名考试,需要整理成指定格式,发给考试院。 一个学生最多报考四门 格式实例:准考证号 …...

LeetCode热题100 两数之和

目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸🥸 C语言 🐿️🐿️🐿…...

问题解决思路:numpy:DLL load failed

首先明确几点: 1这是在使用anaconda中除开base环境下其他envs时出现的问题 2这不是pytorch版本过高的问题(也可以是) 3这不是pytorch安装错误的问题(也可以是)需要检查是否正确安装 解决思路: 本人遇到…...

[春秋云镜] Brute4Road 仿真场景

文章目录 靶标介绍:知识点约束性委派攻击 外网redis主从复制base64提权 内网搭建代理wpcargo插件漏洞mssql弱口令SweetPotato提权远程桌面连接mimikatz抓取hash约束性委派攻击 参考文章 靶标介绍: Brute4Road是一套难度为中等的靶场环境,完成…...

adb 实用命令汇总

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 基础adb命令 # 重启adb adb kill-server# 查看已连接的设备 adb devices# 进入命令行 adb shell# 使用 -s 参数来指定设备 adb -s <设备序列号> shell…...

鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK

har库导入&#xff1a; { "license": "", "devDependencies": {}, "author": "", "name": "entry", "description": "Please describe the basic information.", &qu…...

《Python星球日记》 第54天:卷积神经网络进阶

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、深度CNN架构解析1. LeNet-5&#xff08;1998&#xff09;2. AlexNet&#x…...

《AI大模型应知应会100篇》第53篇:Hugging Face生态系统入门

第53篇&#xff1a;Hugging Face生态系统入门 ——从模型获取到部署的全流程实战指南 &#x1f4cc; 摘要 在人工智能快速发展的今天&#xff0c;Hugging Face已成为自然语言处理&#xff08;NLP&#xff09;领域最具影响力的开源平台之一。它不仅提供丰富的预训练模型、强大…...

【基于 LangChain 的异步天气查询2】GeoNames实现地区实时气温查询

目录 功能简介 一、创建GeoNames账号 1、进入官网 2、创建账号 二、运行代码 weather_runnable.py main.py 运行结果 功能简介 本文主要通过Langchain&#xff0c;结合GeoNames实现了地区温度的实时查询&#xff0c;并通过GPT-4o对温度进行一段简短的描述。 一、创建Ge…...

嵌入式与物联网:C 语言在边缘计算时代的破局之道

引言 在万物互联的 2025 年&#xff0c;全球物联网设备连接数突破 300 亿台&#xff0c;其中 78% 的嵌入式控制系统仍基于 C 语言开发。这种跨越半个世纪的编程语言&#xff0c;正以新的技术形态在智能汽车、工业物联网、边缘计算等领域重塑竞争力。本文通过三个前沿应用场景&…...

《基于人工智能的智能客服系统:技术与实践》

一、引言 在数字化时代&#xff0c;客户服务已成为企业竞争的关键领域之一。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;智能客服系统逐渐成为企业提升服务质量和效率的重要工具。智能客服不仅能够快速响应客户咨询&#xff0c;还能通过自然语言处理&am…...

5. HTML 转义字符:在网页中正确显示特殊符号

在 HTML 开发中,我们经常会遇到需要显示特殊字符的情况,比如 <、>、空格或版权符号等。直接输入这些字符可能会导致 HTML 解析错误或显示异常。接下来通过学习 HTML 转义字符(也称为实体字符),将会掌握了如何在网页中正确显示这些特殊符号的方法。 一、为什么需要转…...

基于nodejs + Koa +Nuxt3的订单系统项目实战

以下是一个基于 Node.js Koa Nuxt3 的订单系统项目实战指南&#xff0c;包含关键实现步骤和代码示例&#xff1a; 一、项目架构设计 project/ ├── backend/ # Koa 后端 │ ├── config/ # 配置文件 │ ├── controllers/ # 控制器 │ ├──…...