【Linux系统编程】进程概念,进程状态
目录
一,操作系统(Operator System)
1-1概念
1-2设计操作系统的目的
1-3核心功能
1-4系统调用和库函数概念
二,进程(Process)
2-1进程概念与基本操作
2-2task_struct结构体内容
2-3查看进程
2-4通过系统调用创建进程
三,进程状态
运行状态(running)
阻塞状态(sleeping)
挂起状态
z(zombie)僵尸状态
僵尸进程危害
孤儿进程
一,操作系统(Operator System)
1-1概念
任何计算机内部都包含一个基本的程序集合,成为操作系统(OS)。
操作系统包括:
- 内核(进程管理,进程调度,文件管理,驱动管理等)
- 其他程序(例如函数库,shell程序等)
1-2设计操作系统的目的
对下,与硬件交互,管理所有的软硬件资源
对上,为用户程序(应用层程序)提供一个良好的执行环境

1-3核心功能
操作系统“管理”硬件。
如何管理:
- 先描述起来,用struct结构体描述信息
- 再组织,用链表或者其他高效的数据结构将struct对象组织起来
1-4系统调用和库函数概念
在开发角度,操作系统对外会表现为一个整体,但是会暴露自身的部分接口,供上层开发使用,这部分由操作系统提供的接口,称为系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对较高,所以,有心的开发者会对部分系统调用做封装,从而形成库,有了库,就很方便上层用户和开发者进行二次开发。
二,进程(Process)
2-1进程概念与基本操作
概念:进程是指程序的一个执行实例,正在执行的程序等。
内核层面概念:每个进程拥有独立的内存空间,系统资源和执行状态,是操作系统进行资源分配和调度和核心对象。
操作系统描述进程的的数据结构—PCB(process control block)
PCB基本概念:进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 在Linux操作系统下的PCB是:task_struct
- task_struct是Linux内核的⼀种数据结构,它会被装载到RAM(内存)⾥并且包含着进程的信息。

进程=内核数据结构+自己的代码和数据。
进程=task_struct+自己的代码和数据。
同一时刻,可能会有多个可执行程序被加载到内存,而操作系统要对这些可执行程序进行管理, 在操作系统层面上,就会在内部会建立一个task_stuct 对象,里面保存了该可执行程序的代码地址,数据地址等各种信息。将这些task_struct使用链表或者其他数据结构管理起来,那么操作系统对进程的管理就转化为对链表的管理。
2-2task_struct结构体内容
- 标识符:描述本进程的唯一标识符,用来区别其他进程
- 状态:任务状态,退出码,退出信号等。
- 优先级:相对于其他进程的优先级
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执⾏时处理器的寄存器中的数据
- IO状态信息: 包括显⽰的IO请求,分配给进程的IO设备和被进程使用的文件列表。
- 其他信息......
2-3查看进程
1,进程的信息可以通过/proc系统文件夹查看

2,大多数进程信息同样可以使用top和ps这些用户及工具来获取
ps aux #显示所有进程信息
top #动态查看进程资源占用
3,通过系统调用获取进程标识符
系统调用
getpid() #当前进程ID(PID)
getppid() #父进程ID(PPID)

2-4通过系统调用创建进程

- fork有两个返回值
- 父子进程共享代码,数据格子开辟空间,私有一份(采用写时拷贝)
- fork之后通常要用if进行分流
创建一个子进程,将父进程的task_struct会拷贝一份给子进程,但是会有部分的数据时需要修改的,比如进程的唯一标识符pid。子进程会共享父进程的代码数据,相当于发生了浅拷贝。
pid_t pid = fork();
if (pid == 0) {
// 子进程代码
} else {
// 父进程代码
}
三,进程状态
操作系统中会存在多个进程。每个进程可能会存在不同的状态,有的进程正在运行,有的进程正在被调度,有的进程处于挂起等等。CPU要执行这些进程,这些进程的task_struct中会保存指向代码和数据的指针。操作系统会维护一个运行队列(running queue),存放要运行的task_struct,这个队列就叫做调度队列,其中的一个个task_struct就是要被调度的进程。

本质上,进程状态就是task_struct结构体中的一个变量,用来记录当前进程的状态,在操作系统内部通过宏定义的方式,标识不同的状态。
例如,下面的状态在Kernel源代码的定义:
static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */
"D (disk sleep)", /*2 */
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */
};
- R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运⾏中要么在运⾏ 队列里。
- S睡眠状态(sleeping): 可中断休眠,浅度睡眠,就是阻塞状态。该状态下的进程是可以被杀掉的。
- D(Disk sleep):不可中断休眠,Disk是磁盘的意思。该状态下的进程是无法被杀掉的。比如一些进程在进行IO的时候,是不允许被杀掉的。在这个 状态的进程通常会等待IO的结束。
- T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的 进程可以通过发送 SIGCONT 信号让进程继续运行。
- X死亡状态(dead):这个状态只是⼀个返回状态,你不会在任务列表里看到这个状态。
- t(trancing stop):追踪状态,对我们的程序进行debug调试时的状态。打端点,进程就被暂停了。
运行状态(running)
只要进程在调度队列中,都处于运行状态。
阻塞状态(sleeping)
以scanf为例,当执行scanf从键盘读取数据时,未输入数据时,操作系统会将当前进程的task_struct从调度队列中移除,放入设备的阻塞队列中,此时,该进程就处于阻塞状态。直到键盘响应,会将该进程重新放入调度队列的尾部,继续运行。
挂起状态
在磁盘上,会存在一块特定的分区,叫做swap分区。当内存资源严重不足时,操作系统会将一些不会被调度的进程的代码和数据交换到磁盘的swap分区,在操作系统内部只保留task_struct部分。此时的状态称为挂起状态。

阻塞挂起状态:将阻塞队列中的进程 唤出到磁盘的swap分区上
阻塞运行状态: 将运行队列末端的进程唤出到磁盘的swap分区上
z(zombie)僵尸状态
我们创建子进程的目的,是为了让子进程完成某种工作的。子进程完成后,父进程需要直到完成的信息。所以子进程在执行完后,必须要等待父进程获取它的退出信息,获取之前,该子进程的状态就是Z状态,僵尸状态。
当一个进程结束后,它的代码和数据就会被释放,所以它的退出信息只会保存在task_struct中。
僵尸进程危害
孤儿进程
相关文章:
【Linux系统编程】进程概念,进程状态
目录 一,操作系统(Operator System) 1-1概念 1-2设计操作系统的目的 1-3核心功能 1-4系统调用和库函数概念 二,进程(Process) 2-1进程概念与基本操作 2-2task_struct结构体内容 2-3查看进程 2-4通…...
优选算法的妙思之流:分治——快排专题
专栏:算法的魔法世界 个人主页:手握风云 目录 一、快速排序 二、例题讲解 2.1. 颜色分类 2.2. 排序数组 2.3. 数组中的第K个最大元素 2.4. 库存管理 III 一、快速排序 分治,简单理解为“分而治之”,将一个大问题划分为若干个…...
# 实时人脸识别系统:基于 OpenCV 和 Python 的实现
实时人脸识别系统:基于 OpenCV 和 Python 的实现 在当今数字化时代,人脸识别技术已经广泛应用于各种场景,从手机解锁到安防监控,再到智能门禁系统。今天,我将通过一个完整的代码示例,详细讲解如何使用 Pyt…...
Mysql 中 ACID 背后的原理
在 MySQL 中,ACID 是事务处理的核心原则,用于保证数据库在执行事务时的可靠性、数据一致性和稳定性。ACID 是四个关键特性的首字母缩写,分别是:Atomicity(原子性)、Consistency(一致性ÿ…...
wx206基于ssm+vue+uniapp的优购电商小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
React编程高级主题:错误处理(Error Handling)
文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…...
ubuntu20.04升级成ubuntu22.04
命令行 sudo do-release-upgrade 我是按提示输入y确认操作,也可以遇到配置文件冲突时建议选择N保留当前配置...
SpringCloud(25)——Stream介绍
1.场景描述 当我们的分布式系统建设到一定程度了,或者服务间是通过异步请求来通讯的,那么我们避免不了使用MQ来解决问题。 假如公司内部进行了业务合并或者整合,需要服务A和服务B通过MQ的方式进行消息传递,而服务A用的是RabbitMQ&…...
OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)
1、先插好上电(可正确识别) 2、上电开机后插入USB 3.0 设备,报错如下,只能检测到USB2.0--480M,识别不到USB3.0-5Gbps,重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: re…...
centos8上实现lvs集群负载均衡dr模式
1.前言 个人备忘笔记,欢迎探讨。 centos8上实现lvs集群负载均衡nat模式 centos8上实现lvs集群负载均衡dr模式 之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。 dr模式分同网段和不同网段。同…...
uniapp如何接入星火大模型
写在前面:最近的ai是真的火啊,琢磨了一下,弄个uniappx的版本开发个东西玩一下,想了想不知道放啥内容,突然觉得deepseek可以接入,好家伙,一对接以后发现这是个付费的玩意,我穷&#x…...
三、FFmpeg学习笔记
FFmpeg是一个开源、跨平台的多媒体处理框架,能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式,是业界公认的“瑞士军刀”。 FFmp…...
Linux常用基础命令应用
目录 一、文件与目录操作(12个核心命令) 1. pwd - 显示当前路径 2. ls - 查看目录内容 3. cd - 切换目录 4. mkdir - 创建目录 5. touch - 创建文件 6. cp - 复制文件/目录 7. mv - 移动…...
【python中级】关于Cython 的源代码pyx的说明
【python中级】关于Cython 的源代码pyx的说明 1.背景2.编译3.语法1.背景 Cython 是一个编程语言和工具链,用于将 Python 代码(或类 Python 的代码)编译成 C 语言,再进一步生成高性能的 Python 扩展模块(.so 或 .pyd 文件)。 在 Python 中,.pyx 文件是 Cython 的源代码文…...
第十八节课:Python编程基础复习
课程复习 前三周核心内容回顾 第一周:Python基本语法元素 基础语法:缩进、注释、变量命名、保留字数据类型:字符串、整数、浮点数、列表程序结构:赋值语句、分支语句(if)、函数输入输出:inpu…...
MySQL vs MSSQL 对比
在企业数据库管理系统中,MySQL 和 Microsoft SQL Server(MSSQL)是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统(RDBMS),由 MySQL AB 开发,现归属于 Oracle 公司。而 MSSQL 是微…...
解决LeetCode“使括号有效的最少添加”问题
目录 问题描述 解题思路 复杂度分析 示例分析 暴力替换“不讲码德” 总结 问题描述 给定一个仅由 ( 和 ) 组成的字符串 s,我们需要通过添加最少数量的括号(( 或 ))使得字符串有效。有效字符串需满足: 空字符串是有效的。 …...
python基础-10-组织文件
文章目录 【README】【10】组织文件(复制移动删除重命名)【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…...
ORA-09925 No space left on device 问题处理全过程记录
本篇文章关键字:linux、oracle、审计、ORA-09925 一、故障现像 朋友找到我说是他们备份软件上报错。 问题比较明显,ORA-09925,看起来就是空间不足导致的 二、问题分析过程 这里说一下逐步的分析思路,有个意外提前说一下就是我…...
多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测
多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…...
27信号和槽_自定义信号(2)
自定义信号和槽 绑定信号和槽 如何才能触发出自定义的信号呢?(上诉代码只是将信号和槽绑定在一起,但并没有触发信号) Qt 内置的信号,都不需要咱们手动通过代码来触发 用户在 GUI, 进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置…...
人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!
人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开! 近年来,人工智能在生物医药行业中的应用受到广泛关注。 2024年10月,2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”,这为行业从业人员带来…...
2025.3.19
1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...
深度学习 Deep Learning 第16章 结构化概率模型
深度学习 Deep Learning 第16章 结构化概率模型 内容概要 本章深入探讨了结构化概率模型(Graphical Models,包含有向图和无向图模型)的概念及其在深度学习中的应用。结构化概率模型通过图结构描述随机变量之间的直接交互,从而简…...
HTML5 vs HTML 和 CSS3 vs CSS:全面对比
HTML5 与 HTML HTML 概述 HTML (HyperText Markup Language) 是构建网页的标准标记语言。HTML 经历了多个版本的发展: HTML 2.0 (1995年):最早的标准化版本 HTML 4.01 (1999年):增加了样式表支持 XHTML (2000年):基于XML的更严…...
鸿蒙 harmonyOS 网络请求
应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 : 在module.json5文件里面添加网络…...
进程概念(Linux)
目录 一. 冯诺依曼体系结构 二. 操作系统(OS(操作系统的英文缩写Operator System)) 2.1概念 2-2 设计OS的目的 2.3 核心功能 2.4 如何管理(先描述再组织) 2.5 系统调用和库函数概念 三.进程 3.1 基本概念与基本操作 3.2 描述进程-PCB 3.3 如何…...
程序化广告行业(59/89):广告验证与反作弊实战技巧
程序化广告行业(59/89):广告验证与反作弊实战技巧 大家好!在程序化广告领域,想要做好投放,除了了解基本的架构和原理,还得掌握一些关键的技能,比如广告验证和反作弊。今天就和大家一…...
链路聚合配置命令
技术信息 加入捆绑组,加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1,不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…...
免费在线MBTI性格测试工具 - 探索你的性格特质
免费在线MBTI性格测试工具 - 探索你的性格特质 简介 我很高兴为大家分享这个专业的MBTI性格测试工具。这是一个完全免费的在线测试系统,基于迈尔斯-布里格斯类型指标(MBTI)理论开发,旨在帮助您更好地了解自己的性格特征,发现职业发展方向。…...
