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

零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级

目录

强烈建议全文阅读!!!

强烈建议全文阅读!!!

强烈建议全文阅读!!!

一、进程状态

二、僵尸和孤儿进程

1、僵尸进程 Z(zombie)

2、孤儿进程:

三、进程的阻塞和挂起、运行、切换

1、阻塞态

2、挂起状态

3、进程的运行

4、进程切换

四、进程相关命令

五、进程的创建

五、队列优先级

1、什么是优先级

2、为什么要优先级

3、如何实现优先级

4、如何修改优先级

1、nice值调整

2、r(renice) 命令(常用)

3、setpriority 系统调用


一、进程状态

Linux进程状态:进程状态指的是的是进程在cpu中执行的状态

具体长什么样子?

//展示第一个进程,带头列表
ps axj | head -2

R(running)进程运行的状态
S(sleeping休眠状态(等待“资源”就绪 / 可中断睡眠)
T(stopped)让进程暂停,等待进一步被唤醒
t(trcing stop)进程遇到追踪,进程暂停,例如代码调试
X(dead)死亡状态
D(disk sleep)Linux下特有的一个进程状态,不可被杀、深度睡眠、不可中断睡眠(如何消除D状态?进程自己醒来 / 重启 -- 断电)
Z(zombie)僵尸进程


+号:表示前台运行,没有+表示后台运行

调式代码的过程,就是通过进程暂停来实现的

杀死进程命令:

kill -number process:

查看所有的进程控制命令:

kill -l 

一个数字对应一种控制

例如: 9 :杀掉进程、18:继续命令、19:暂停命令

信号名称信号编号含义
SIGHUP1Hangup,终端连接断开
SIGINT2Interrupt,终端中断信号
SIGQUIT3Quit,终端退出信号
SIGILL4Illegal instruction,非法指令
SIGTRAP5Trace/Breakpoint trap,追踪/断点陷阱
SIGABRT6Abort,异常终止
SIGBUS7Bus error,总线错误
SIGFPE8Floating point exception,浮点异常
SIGKILL9Kill,强制终止
SIGUSR110User-defined signal 1,用户自定义信号1
SIGSEGV11Segmentation fault,段错误
SIGUSR212User-defined signal 2,用户自定义信号2
SIGPIPE13Broken pipe,管道破裂
SIGALRM14Alarm clock,闹钟信号
SIGTERM15Termination,终止信号
SIGSTKFLT16Stack fault,协处理器栈错误
SIGCHLD17Child status has changed,子进程状态改变
SIGCONT18Continue,继续执行暂停的进程
SIGSTOP19Stop,停止进程的执行
SIGTSTP20Terminal stop,终端停止信号
SIGTTIN21Background read from tty,后台进程尝试读取控制终端
SIGTTOU22Background write to tty,后台进程尝试写控制终端
SIGURG23Urgent condition on socket,套接字上的紧急情况
SIGXCPU24CPU time limit exceeded,超出CPU时间限制
SIGXFSZ25File size limit exceeded,超出文件大小限制
SIGVTALRM26Virtual alarm clock,虚拟闹钟信号
SIGPROF27Profiling alarm clock,分析器闹钟信号
SIGWINCH28Window size change,窗口大小改变
SIGIO29I/O now possible,异步I/O事件
SIGPWR30Power failure,电源故障
SIGSYS31Bad system call,系统调用错误

 

二、僵尸和孤儿进程

1、僵尸进程 Z(zombie)

进程已经运行完毕,但是需要维持自己的退出信息,在自己的进程PCB中会记录自己的退出信息,未来让父进程来读取
如果没有读取,就会一直维持僵尸进程状态
进程 = 内核数据结构task_struct + 进程代码和数据
当运行完毕时,进程代码和数据会被释放,凡是内核数据结构不会被释放,依然存在,等待被读取
就会存在占用内存空间,也就是内存泄漏
僵尸进程不能被kill
因为僵尸进程也相当于死掉了,不能死两次
X(dead):死亡状态,例如用waitpid(等待队列)访问僵尸进程后,就会显示X状态

2、孤儿进程:

父进程先退出,子进程就变成了孤儿进程,因为爹死了,没有爹了
孤儿进进程一般都会被1号进程(OS)领养,以保证子进程被正常回收
命令行中启动的子进程的父进程是bash,bash会自动回收子进程

三、进程的阻塞和挂起、运行、切换

1、阻塞态

相当于S(sleep)状态,D(dead)也算
进程本身就是一个软件

操作系统对外部设备的管理,其原理也是类似于硬件的方式,先描述,在组织
那么,每一个设备都对应一个设备结构体对象
在这个设备结构体内部有一个等待队列
例如,当进程A需要用到键盘这个设备时
就把进程A这个PCB放到键盘的等待队列中进行排队
其他进程对应需要对应资源,也是这个道理
因此,不是只有CPU才有运行队列
各个设备也有各自的等待队列
那么,当把进程从CPU的运行队列拿到设备的等待队列时
此时该进程就不在运行队列,就不会被调度
这个状态,就叫做进程的阻塞状态

有了这个理解,对于进程的状态变化,还包括PCB被放到不同的队列中
同时,进入等待队列/运行队列的是进程的PCB而不是代码和数据

2、挂起状态

当一个进程处于阻塞状态时,他的PCB是在等待某个设备的资源,也就是在等待某个设备的等待队列中
此时,该进程不在CPU的运行队列中,那么也就不会被调度,不会被调度,那么进程的代码和数据也就没有用
所以,为了让操作系统的内存有更多的空间,就暂时的把该进程的代码和数据唤出到磁盘的swap区
当该进程被CPU调度执行时,又把对应的代码和数据唤入到内存中
这是操作系统的一种运行策略,相当于在已有硬件的条件下实现了2倍的内存空间
但是频繁换入唤出会导致效率问题(时间换空间策略)

3、进程的运行

每个CPU都有一个运行队列

struct runqueue
{
    task_struct *head;
    ...
};

进程在运行队列中,进程状态就处于R(running)状态

时间片:
一个进程进入CPU运行,不会一直运行到结束才停止,而是基于时间片进行调度
在task_struct的一个属性中,有一个与调度相关的信息,叫做时间片
这个时间片用来分配进程使用CPU的时间
当运行时间片结束后,CPU就会把该进程移除,再放到运行队列尾部
同时,让多个进程以切换的方式进行调度,使得在一个时间段内同时得以推进代码,这就叫做并发

但是Linux实际上不是这样调度的,而是一个叫做O(1)调度的算法
多个CPU对应多个运行队列
此时,任何时刻都会有多个进程在真正意义上的同时运行,即并行

4、进程切换

CPU寄存器保存进程的所有临时数据
例如,当A进程执行到一半时,或由于优先级 / 时间片等因素进程切换时
CPU需要切换调度进程,执行新的进程B
此时,寄存器中原来保存的进程A的临时数据会被保存在A进程的PCB中
这个数据,叫做上下文信息
当,A进程再次被调度时,进程A要从上次被执行的位置开始
此时,寄存器需要恢复原来A进程的,即什么时候结束,什么时候开始

所以,进程切换最最重要的事情是,上下文数据的保护和恢复
CPU内部的所有寄存器的临时数据,叫做进程的上下文 

四、进程相关命令

父进程是bash,命令解释器;函数用man查找

查看所有进程:

ps axj 

行过滤:

| grep

显示进程属性和进程信息:

ps axj | head -1 && ps axj grep XXX

获取进程id :这是一个函数

gitpid()

获取父进程id:

ditppid()

创建子进程:

fork()


启动进程:

./XXX 

结束进程:

Ctrl + c

杀掉进程:

kill -9 pid

更该cwd,当前工作目录

chdir

cwd:current work dir

获取环境变量

getenv()

查看进程优先级 +a所有进程

ps -al

查看进程:在根目录,/proc文件,实时保存内存中运行的进程(process)

cd ~cd /proc

五、进程的创建

为什么要创建子进程?
想让子进程执行和父进程不一样的任务

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid;// 创建子进程pid = fork();if (pid < 0) {// 错误处理fprintf(stderr, "进程创建失败\n");return 1;} else if (pid == 0) {// 子进程执行代码printf("这是子进程,PID为:%d\n", getpid());// 在这里可以执行子进程的任务} else {// 父进程执行代码printf("这是父进程,PID为:%d,子进程PID为:%d\n", getpid(), pid);// 在这里可以执行父进程的任务}return 0;
}

fork的返回值:会有两个返回值,返回两次
0,子进程
-1,创建进程失败
>0,子进程的pid,执行父进程
为什么返回两次?
(为什么?这个知识有关地址空间,可以看博主相关文章)

进程特点:具有独立性


五、队列优先级

1、什么是优先级

本质是指定一个进程获取某种资源的先后顺序
优先级如何控制?是PCB的内部字段,int prio
在Linux中,优先级数字越小,优先级越高

2、为什么要优先级

因为CPU的资源是有限的,而进程很多

3、如何实现优先级

进程优先级值和一个nice值,分别是PRI

PRI(Process Priority):进程优先级,值越小优先级越高
NI(nice):进程优先级的修正数据,当时一个进程执行完毕时,如果需要修改优先级,就会用nice值来调整优先级,新的优先级 = 优先级(80) + nice值,达到对应进程优先级动态修正的过程
nice值是有范围的,一般是[-20 ,19],40个数字,即40个级别,目的是确保资源分配的公平
每次调整优先级,都是从80开始

4、如何修改优先级

(一般不推荐调整进程的优先级)

在Linux系统中进行Nice 值调整:

1、nice值调整

使用 nice 命令或系统调用 setpriority 来调整进程的优先级。
nice 命令可以通过设置不同的优先级来启动命令或进程。较小的值表示较高的优先级。
示例:

nice -n -10 ./my_process  # 启动一个优先级较高的进程

2、r(renice) 命令(常用)

可以使用 renice / r命令来更改正在运行的进程的优先级。
示例:

renice -n 10 -p 12345  # 将进程PID为12345的优先级调整为更低

3、setpriority 系统调用

可以通过编程方式使用 setpriority 系统调用来调整进程优先级。
示例(C语言):

#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>int main() {int which = PRIO_PROCESS;id_t pid = getpid();int priority = -10;  // 设置较高的优先级if (setpriority(which, pid, priority) != 0) {perror("设置优先级失败");return 1;}printf("优先级已设置为 %d\n", getpriority(which, pid));return 0;
}

应用卡住的本质是:进程没有被执行调度

相关文章:

零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级

目录 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 强烈建议全文阅读&#xff01;&#xff01;&#xff01; 一、进程状态 二、僵尸和孤儿进程 1、僵尸进程 Z&#xff08;zombie&#xff09; 2、孤儿进…...

Redis的分布式锁

目录 一、定义与原理 基于Redis的分布式锁 获取锁 释放锁 锁误删问题&#xff1a;因为key值一样,将别人的锁删掉了 锁误判问题二&#xff1a;判断锁和释放锁不是原子性的 Lua脚本 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁 分布式锁的优点…...

C++笔记---类和对象

1. 类的定义 类是C中的一种自定义类型&#xff0c;是某个具体事物或概念的抽象化代码表示&#xff0c;通过类的成员&#xff08;变量函数/方法&#xff09;&#xff0c;可以表征出事物或概念的特征。 1.1 类定义的格式 class Stack { public:// 成员函数void Init(int n 4)…...

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理...

3个功能强大的PDF转换工具,免费试用

给大家分享3个功能强大能满足更高需求的PDF转换工具&#xff0c;都提供免费的试用机会。 1.嗨动PDF编辑器 一款多功能的PDF编辑软件&#xff0c;集PDF阅读、PDF转换、PDF编辑功能为一体。支持转换的格式多样&#xff0c;转换速度快&#xff0c;转换后的排版和内容与原文保持一…...

表单修改数字输入框保留小数点

1.在表单设计打开修改的表单 2.打开需要修改的字段 3.按F12&#xff0c;进入“开发模式” 4.开启“开发者工具”左上角检索工具 开启&#xff1a;鼠标左键点击&#xff0c;当图标颜色为蓝色 关闭&#xff1a;鼠标左键点击&#xff0c;当图标颜色为灰色 5.鼠标移动到需要修改的…...

[VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建

文章目录 VS Code扩展机制项目搭建创建UI元素活动栏按钮主边栏视图主边栏工具栏按钮侧边栏右键菜单编辑器右键菜单 项目地址 [VS Code扩展]写一个代码片段管理插件&#xff08;一&#xff09;&#xff1a;介绍与界面搭建[VS Code扩展]写一个代码片段管理插件&#xff08;二&…...

vxe grid slots 用法

官方例子&#xff1a;Vxe Table v3.8 {field: num1,title: Num1,showHeaderOverflow: true,filters: [{ data: }],editRender: { autofocus: .my-input },slots: {// 使用插槽模板渲染default: num1_default,header: num1_header,footer: num1_footer,filter: num1_filter,edi…...

【网络】基于UDP协议的聊天室(第二篇)

目录 UDP服务器 UDP客户端 在C中&#xff0c;使用UDP协议进行网络通信通常涉及到socket编程。下面我将给出基于UDP的简单的客户端和服务器示例代码。这些示例将使用C标准库以及POSIX套接字接口&#xff08;主要适用于Linux和类Unix系统&#xff09;。如果你在使用Windows&…...

【SpringBoot3】场景整合(实战)

0 环境准备 0.0 云服务器 阿里云、腾讯云、华为云 服务器开通&#xff1b; 按量付费&#xff0c;省钱省心 安装以下组件&#xff1a;docker、redis、kafka、prometheus、grafana 下载windterm&#xff1a; https://github.com/kingToolbox/WindTerm/releases/download/2.5…...

【全网最全最详细】MYSQL 面试题大全(上)

目录 一、关系型数据库和非关系型数据库主要有哪些区别? 二、MYSQL的数据存储一定是基于硬盘的吗? 三、InnoDB和MyISAM有什么区别? 四、MyISAM的索引结构是怎么样的?存在的问题是什么? 五、char和varchar的区别? 六、MYSQL 5.x和8.0有什么区别? 七、为什么大厂不…...

【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解

目录 程序环境 翻译环境 1. 翻译环境的两个过程 2. 编译过程的三个阶段 执行环境 预处理(预编译) 1. 预定义符号 2. #define 2.1 用 #define 定义标识符(符号) 2.2 用 #define 定义宏 2.3 #define 的替换规则 2.4 # 和 ## 的用法 2.5 宏和函数 2.6 #undef …...

人生低谷来撸C#--021 多线程

1、概念 线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作&#xff0c;那么设置不同的线程执行路径往往是有益的&#xff0c;每个线程执行特定的工作。 线程是轻量级进程。一个使用线程的常见实例是现代操作系统中…...

【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种

随着信息技术的迅猛发展&#xff0c;传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验&#xff0c;也加重了医院工作人员的负担。在此背景下&#xff0c;基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化…...

硬盘数据丢失不再怕,四大恢复工具帮你轻松逆转局面!

硬盘故障、误删文件、病毒攻击等原因导致数据丢失的情况时有发生。面对这种情况&#xff0c;如何高效、快速地进行硬盘数据恢复呢&#xff1f;接下来几款好用的数据恢复软件推荐给大家。 一、福昕数据恢复&#xff1a;全方位恢复&#xff0c;让数据无遗漏 链接&#xff1a;ww…...

自定义封装日历组件

自定义日历 工作需要&#xff0c;但现有框架封装的日历无法满足需求&#xff0c;又找不到更好的插件&#xff0c;所以准备自己封装一个。 效果图和说明 一个很简易版的demo日历&#xff0c;本文只提供最基本的功能代码&#xff0c;便于阅读二开。 新建calendar.vue文件 <…...

【大模型】【面试】独家总结表格

问题解答你能解释一下Transformer架构及其在大型语言模型中的作用吗?Transformer架构是一种深度神经网络架构,于2017年由Vaswani等人在他们的论文“Attention is All You Need”中首次提出。自那以后,它已成为大型语言模型(如BERT和GPT)最常用的架构。 Transformer架构使用…...

C# 6.定时器 timer

使用控件&#xff1a; 开启定时器&#xff1a;timer1.Start(); 关闭定时器&#xff1a;timer1.Stop(); 定时间时间间隔:Interval timer1.Interval 1000; Interva等于1000是每一秒刷新一次 定时器默认时间间隔是100ms 代码创建定时器 ①创建 Timer t1 new Timer(); …...

有了 createSlice,还有必要使用 createReducer 吗?什么情况需要 createReducer 呢?

通常情况下&#xff0c;使用 createSlice 已经足够满足大多数需求&#xff0c;而不需要直接使用 createReducer。但是&#xff0c;在某些特定场景下&#xff0c;createReducer 仍然有其用处&#xff1a; 更细粒度的控制&#xff1a; 当你需要对 reducer 的行为进行更精细的控制…...

怎么搭建AI带货直播间生成虚拟主播?

随着电商直播带货的热潮不断升温&#xff0c;虚拟主播逐渐崭露头角&#xff0c;成为电商直播领域的新宠&#xff0c;相较于真人主播&#xff0c;虚拟主播具备无档期风险、人设稳定可控、24小时不间断直播等显著优势。 本文将深入探讨如何搭建一个AI带货直播间&#xff0c;并详…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...