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

Linux--进程状态与优先级

概念

进程指的是程序在执行过程中的活动。进程是操作系统进行资源分配和调度的基本单位
进程可以看作是程序的一次执行实体,它包含了程序代码、数据以及相关的执行上下文信息。操作系统通过创建、调度和管理多个进程来实现对计算机系统资源的有效利用。
每个进程都有自己的地址空间、寄存器集合、堆栈等资源,他们与其他进程相互隔离。不同的进程之间可以通过进程间的通信(PIC)机制进行信息交换和数据共享。
简单的来说,进程就是加载到内存的程序

PCB进程控制块

那么如何管理加载到内存的程序呢?
答案是先描述再组织。
在这里插入图片描述
而这样管理进程的结构体,我们称之为进程控制块(PCB)。

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合

在这里插入图片描述
PCB与进程之间存在着一对一的对应关系,每个进程在系统中都有一个相应的PCB来描述和管理它。当操作系统创建一个新进程时,会为该进程分配一个独立的PCB。
PCB通过维护这些信息,操作系统可以管理和控制进程的状态转换、调度和资源分配。当系统需要切换进程时,它会保存当前进程的上下文信息到该进程的PCB中,然后加载新进程的PCB,并将保存的上下文信息恢复, 从而实现进程间的无缝切换和调度。
在这里插入图片描述
在这里插入图片描述

PCB的属性(task_struct)

在Linux中,描述进程的结构体叫作task_struct(也就是Linux的PCB)。
在这里插入图片描述

查看进程

通过指令

ps ajx

进行查看
在这里插入图片描述
PID是进程的唯一标识符

下面写一个简单的C程序来看一下进程
在这里插入图片描述
在这里插入图片描述
结果查看:
在这里插入图片描述
上面进程中,我们执行指令grep也是进程的一条,当我们查看时,可以忽略他,加上:
在这里插入图片描述
我们可以利用while循环,来不断查询当前的进程情况:
在这里插入图片描述
在这里插入图片描述

获取PID/PPID

PID:是进程的唯一标识符,类似于你在学校专属的学号,可以通过PID查看到对应的进程信息。

在C程序我们也可以通过函数来获取PID
在这里插入图片描述

PPID被称为子进程的父进程;当一个进程之中再有一个进程在运行,那么这个在里面的进程被称为子进程,而外面的进程称为父进程;

在这里插入图片描述
在这里插入图片描述

proc

对proc的查看
在这里插入图片描述

执行指令 ls /proc/PID -ld
对执行程序的查询,再将程序退出查询,对比两次的情况
在这里插入图片描述

执行指令 ls /proc/PID -l
查看进程的总信息
在这里插入图片描述
列举一些比较关键的信息
在这里插入图片描述
在这里插入图片描述

利用文件的生成查看对应的工作目录(默认在对应的进程工作目录里生成)
在这里插入图片描述
更改当前的工作目录时,
在这里插入图片描述

创建进程–fork()

fork()是一个系统调用,为当前运行进程创建一个新的子进程。在调用fork之后,操作系统会复制当前进程的所有资源(包括代码、数据、堆栈等),并创建一个全新的进程这个进程被称为子进程,而原来的进程被称为父进程
在fork操作完成后,父进程和子进程是相互独立的,它们有各自独立的内存空间和资源。子进程会继承父进程的属性,例如文件描述符,信号处理程序等。

接下来我们看操作实例:

在这里插入图片描述
在这里插入图片描述

fork的返回值

在这里插入图片描述

俩进程独立操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

利用kill指令杀掉父进程:
在这里插入图片描述

一次创建多个进程

在这里插入图片描述
在这里插入图片描述
结果:在这里插入图片描述

进程状态

进程状态描述了一个进程在执行过程中的不同状态。
常见的进程状态包括:

R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
D磁盘休眠状态(Disk sleep有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

我们还是利用指令 ps ajx 来查看进程的状态。
在这里插入图片描述

在这里插入图片描述
如:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

细节:在这里插入图片描述

kill的常用指令在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

僵尸进程

僵尸进程是一个处于已终止但仍然存在于进程表中的进程。当一个子进程运行结束后,它会向父进程发送一个终止信号。
如果父进程没有及时处理子进程的终止状态,子进程的PCB就会一直存在于系统的进程表中,成为一个僵尸进程。僵尸进程所占用的系统资源非常有限,仅仅保留了它的进程ID、返回值和一些基本信息。

下面来演示下僵尸进程
将子进程优先退出,父进程进入睡眠状态,子进程退出之后,父进程仍然在睡眠状态没有回收子进程的资源;

int main()                                                                                                                                                    {pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id==0){printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(1);}else {printf("parent[%d] is sleeping...\n", getpid());sleep(30);}return 0;}  

结果:
在这里插入图片描述

僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎
么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话
说, Z状态一直不退出, PCB一直在维护。
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构
对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程领养,由init进程回收。

例子:
通过让父进程优先退出,来查看进程状态

  7  int main()                                                                                                                                                    8   {                                                                        9     pid_t id = fork();10     if(id < 0){11     perror("fork");12     return 1;13     }                                                 14     else if(id==0)                 15    {              16      printf("child[%d] is begin Z...\n", getpid());17       sleep(15);                     18                           19     }                                   20     else               21    {22      printf("parent[%d] is sleeping...\n", getpid());              23      sleep(5);                                                   24      exit(1);                                             25    }                                  26    return 0;                                             27   }     

结果:
在这里插入图片描述

进程优先级

进程优先级是指操作系统为每个进程分配的执行优先级,用于控制和管理多任务环境中的进度调度。通过设置不同的优先级,可以决定哪些进程应该优先执行,从而影响系统的响应时间和吞吐量。

在这里插入图片描述
在这里插入图片描述

相关文章:

Linux--进程状态与优先级

概念 进程指的是程序在执行过程中的活动。进程是操作系统进行资源分配和调度的基本单位。 进程可以看作是程序的一次执行实体&#xff0c;它包含了程序代码、数据以及相关的执行上下文信息。操作系统通过创建、调度和管理多个进程来实现对计算机系统资源的有效利用。 每个进程…...

如何实现无公网ip固定TCP端口地址远程连接Oracle数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…...

Orchestrator源码解读2-故障失败发现

目录 前言 核心流程函数调用路径 GetReplicationAnalysis 故障类型和对应的处理函数 ​编辑 拓扑结构警告类型 核心流程总结 与MHA相比 前言 Orchestrator另外一个重要的功能是监控集群&#xff0c;发现故障。根据从复制拓扑本身获得的信息&#xff0c;它可以识别各种故…...

REST2SQL是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

REST2SQL是一种将RESTful API转换为SQL查询的工具或技术。它可以将RESTful API中的请求转换为对数据库的SQL查询&#xff0c;以便从数据库中检索、更新或删除数据。 REST2SQL的工作原理是通过分析RESTful API的请求参数和路径&#xff0c;将其转换为相应的SQL查询语句。这样可…...

Android 实现获取集合中出现重复数据的值和数量

方法一&#xff1a;使用HashMap和HashSet 创建一个HashMap&#xff0c;用于存储集合中的元素及其出现次数。 Map<String, Integer> map new HashMap<>();遍历集合&#xff0c;将每个元素作为键&#xff0c;将其出现次数作为值添加到HashMap中。 for (String it…...

【QT学习十一】QThread

一、引言 在现代软件开发中&#xff0c;多线程编程变得越来越重要&#xff0c;尤其是对于需要处理并发任务的应用程序。Qt C 框架提供了强大的多线程支持&#xff0c;使得开发者能够轻松地创建和管理多线程应用。 在 Qt 中&#xff0c;多线程的实现主要基于 QThread 类。QThrea…...

Mybatis 39_使用MBG生成代码

此2个插件均未晚装成功!!!! 安装 MyBatipse插件 MyBatipse插件 - 开发MyBatis应用的Eclipse插件- 自动完成- 有效性验证- Mapper视图使用MBG MyBatis Generator (MBG):根据底层数据表来自动生成Mapper组件只要两步即可: (1) 提供一个简单的配置文件,告诉MBG连接数据…...

Hudi metadata table(元数据表)

什么是metadata表 Metadata表即Hudi元数据表,是一种特殊的Hudi表,对用户隐藏。该表用于存放普通Hudi表的元数据信息。Metadata表包含在普通Hudi表内部,与Hudi表是一一对应关系。 元数据表的作用 ApacheHudi元数据表可以显著提高查询的读/写性能。元数据表的主要目的是消…...

提高iOS App开发效率的方法

引言 随着智能手机的普及&#xff0c;iOS App开发成为越来越受欢迎的技术领域之一。许多人选择开发iOS应用程序来满足市场需求&#xff0c;但是iOS App开发需要掌握一些关键技术和工具&#xff0c;以提高开发效率和质量。本文将介绍一些关键点&#xff0c;可以帮助你进行高效的…...

MPU机制与实现详解

目录 MPU机制与实现详解 Partition元素-MPU Partition实现元素OSApplication Partition元素-RTE MPU机制与实现详解 1、freedom from interference 此概念来自ISO26262-1&#xff1a;多个元素之间没有可能导致违反安全目标的级联故障&#xff0c;称之为免于干涉。 在左侧的…...

pom文件冲突引起的Excel无法下载

问题一&#xff1a;之前生产环境上可以进行下载Excel的功能突然不能用了 报错提示信息&#xff1a; NoClassDefFoundError: Could not initialize class org.apache.poi.xssf.usermodel.XSSFWorkbook&#xff0c; 在最开始初始化的时候找不到对应的类&#xff0c;虽然我的Libr…...

【HarmonyOS4.0】第十篇-ArkUI布局容器组件(二)

三、层叠布局容器&#xff08;Stack&#xff09; 堆叠容器组件 Stack的布局方式是把子组件按照设置的对齐方式顺序依次堆叠&#xff0c;后一个子组件覆盖在前一个子组件上边。 注意&#xff1a;Stack 组件层叠式布局&#xff0c;尺寸较小的布局会有被遮挡的风险&#xff0c; …...

PLECS如何下载第三方库并导入MOSFET 的xml文件,xml库路径添加方法及相关问题

1. 首先xml库的下载&#xff0c;PLECS提供了一个跳转的链接。 https://www.plexim.com/download/thermal_models 2. 下载一个库&#xff08;以最后一个Wolfspeed为例&#xff0c;属于CREE的SiC MOSFET&#xff09; 下载这个就行&#xff0c;都包含了。不信自己可以试试再下载…...

使用emu8086实现——子程序的设计

一、实验目的 学习子程序的结构、特点&#xff0c;以及子程序的设计和调试方法 二、实验内容 1、从字符串中删除一个字符&#xff0c;并存储到寄存器AX中。 代码及注释&#xff1a; data segmentstring db exas ;字符串内容leng dw $-string ; 字符串长度key db x …...

快速排序、归并排序、希尔排序(2023-12-25)

参考文章 十大经典排序算法总结整理_十大排序算法-CSDN博客 推荐文章 算法&#xff1a;归并排序和快排的区别_归并排序和快速排序的区别-CSDN博客 package com.tarena.test.B20; import java.util.Arrays; import java.util.StringJoiner; public class B25 { static i…...

Qt SDL2播放Wav音频

这里介绍两种方法来实现Qt播放Wav音频数据。 方法一&#xff1a;使用QAudioOutput pro文件中加入multimedia模块。 #include <QApplication> #include <QFile> #include <QAudioFormat> #include <QAudioOutput>int main(int argc, char *argv[]) {…...

[ACM学习] 动态规划基础之一二三维dp

课内学习的动态规划 有记忆的迭代 优化解的结构&#xff1a;原始问题的一部分解是子问题的解 三要素&#xff1a;1.子问题 2.状态的定义 3.状态转移方程 定义 线性dp的一道例题 dp[i]表示以位置 i 结尾的方案总数&#xff0c;dp[4]2&#xff0c;因为&#xff1a;首先只放一…...

Qt点击按钮在其附近弹出一个窗口

效果 FS_PopupWidget.h #ifndef FS_POPUPWIDGET_H #define FS_POPUPWIDGET_H#pragma once#include <QToolButton> #include <QWidgetAction> #include <QPointer>class QMenu;class FS_PopupWidget : public QToolButton {Q_OBJECTpublic:FS_PopupWidget(QW…...

Springboot注解@Configuration和@Bean注解作用,生命周期

简介&#xff1a; Configuration 类是定义 bean 配置的地方&#xff0c;而 Bean 方法是具体创建 bean 实例的方法。 Configuration 作用&#xff1a; Configuration 注解用于定义配置类&#xff0c;表明该类包含一个或多个 bean 定义的方法。Spring 容器在启动时会自动扫描这些…...

30天精通Nodejs--第十五天:Websocket

引言 这里我们将继续深入探讨另一项强大且实时性极高的网络通信技术——WebSocket。通过本篇文章,将全面了解如何在Node.js环境中利用WebSocket实现服务端与客户端之间双向、低延迟的数据传输,并掌握其基础用法以及一些高级应用场景。 基础用法 安装WebSocket库 在Node.j…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...