当前位置: 首页 > 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;并详…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...