Linux的奇妙冒险——进程PCB第一讲
进程
- 1.进程的基本概念
- 2.进程的描述
- 3.查看进程
- 4.通过系统调用获得pid和ppid
- 5.通过fork()系统调用创建子进程
- 6.进程状态
- 1.浅度睡眠 S
- 2.深度睡眠 D
- 3 暂停状态T
- 4.僵尸状态 Z
- 5.死亡状态 X
- 7.僵尸进程
- 8.孤儿进程
- 9.进程优先级
1.进程的基本概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核:内存管理,文件管理,进程管理,驱动管理
- 其他程序:函数库,shell程序等
计算机的一切都要被操作系统管理起来,而重要的理解就是六个字“先描述,在组织”
进程是什么呢
- 课本概念:程序的一个执行实例,正在执行的程序等
- 内核观点:担当分配系统资源(CPU时间,内存)的实体。
通常来说,linux下一切皆文件,当我们调度一个可执行文件时,系统先将其从磁盘中加载出来,进入到内存,分配一系列属性,内存,地址,数据等等,这是我们并不在将这个程序简单定义为程序了,而是称作进程。

2.进程的描述
首先一个操作系统无时无刻不在运行进程,通过
ps aux
可以查看系统正在运行的进程

当进入操作系统后第一个运行的进程就是操作系统内核,操作系统引导程序(BIOS或UEFI)在开机时首先执行,并将控制权转交给操作系统内核,操作系统对于进程管理进行“先描述,后组织”,对每一个进程分开描述,在进行统一管理,每一个进程被使用STRUCT_PCB,进行描述
进程 PCB(Process Control Block)是操作系统用于管理每个进程的一个数据结构。它包含了进程相关的各种信息和状态,操作系统通过这个数据结构来对进程进行调度、控制和管理。

PCB 中主要包含以下信息:
-
进程标识符(PID):唯一标识每个进程的ID号。
-
程序计数器(PC):记录进程下一条要执行的指令地址。
-
处理器寄存器:进程执行时使用的各种寄存器的值。
-
进程状态:如就绪、运行、阻塞等。
-
优先级:确定进程的调度优先级。
-
内存管理信息:如页表基址、限制等。
-
资源清单:进程拥有或申请的资源列表。
-
I/O状态信息:进程的I/O状态。
-
审计信息:如CPU时间、时间片使用情况等。
操作系统将一个个进程块管理起来,对其进行增删改查,这便是进程管理。
3.查看进程
在linux中,有这样一个文件proc

这些便是系统正在运行的进程,这些数字就是某些进程的进程标识符pid,通过ps指令可以进行查看
ps与grep配合可以查看某些特定进程
ps -aux | head -1 && ps aux | grep mytest | grep -v grep


4.通过系统调用获得pid和ppid
PID唯一标识一个进程,PPID描述了进程的父子关系。
以下程序通过,getpid,getppid,系统调用函数,可以获取到进程id,通过fork可以产生新的子进程


我们可以通过ps查看pid,ppid,可以看到除了12919的父进程为12053,其他都为12919的子进程

5.通过fork()系统调用创建子进程
-
创建新进程: fork()函数用于创建一个新的子进程,该子进程是原进程(即父进程)的副本。新创建的子进程与父进程拥有相同的代码、数据和打开的文件描述符。
-
返回值: fork()函数在父进程中返回子进程的进程ID(PID),在子进程中返回0。这样可以让进程区分它是父进程还是子进程。
-
资源共享: 父进程和子进程共享内存空间、打开的文件等资源,但对资源的修改不会相互影响。两个进程可以独立地执行,并且拥有各自的进程ID。
-
进程切换: 操作系统会在父进程和子进程之间切换执行,根据各自的优先级和系统调度策略进行调度。
-
用途: fork()函数通常用于创建新的并发进程,以实现多任务处理。子进程可以执行不同的任务,增加系统的并行性和可靠性。
每出现一个进程,操作系统都会为其创建pcb,fork()也是这样
子进程在fork()之后会与父进程共用一份代码和数据,如果存在数据被修改的需求时,会使用写时拷贝为子进程单独开一份空间,具体原理在以后虚拟内存和物理内存讲解,这里不过多讲解。
6.进程状态

在 Linux 中,进程可以处于以下几种主要状态:
-
Running (运行中):进程正在使用 CPU 资源执行。并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列
里。 -
Waiting (等待):进程正等待某种资源(如 I/O 操作、信号等)而暂时挂起。这个状态又可以进一步分为:
-
Interruptible (可中断): 进程可以被信号中断唤醒。
-
Uninterruptible (不可中断): 进程等待某些特殊的事件而不能被信号唤醒。
-
Stopped (停止):进程已经停止执行,通常是因为收到了 SIGSTOP、* SIGTSTP 等信号。
-
Zombie (僵尸):进程已经终止,但父进程还没有回收它的资源和状态信息。
-
Dead (死亡):进程已经终止并且资源已经全部释放。
进程状态在linux某版本中是这样定义的
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char *task_state_array[] = {"R (running)", /* 0*/"S (sleeping)", /* 1*/"D (disk sleep)", /* 2*/"T (stopped)", /* 4*/"T (tracing stop)", /* 8*/"Z (zombie)", /* 16*/"X (dead)" /* 32*/
};
1.浅度睡眠 S
通过系统命令可以查看进程状态,如程序,当程序运行后进程就进入了可中断睡眠中了


浅度睡眠可以使用kill命令终止


2.深度睡眠 D
不可中断睡眠也叫深度睡眠,Linux 中不可中断睡眠(Disk Sleep)进程状态指的是一种特殊的系统进程状态。这种状态的进程无法被中断或唤醒,除非等待它所依赖的某些资源可用。
不可中断睡眠状态的主要特点包括:
- 无法被信号唤醒
这些进程即使收到中断信号也无法响应,无法被终止或切换到其他状态。
- 依赖某些硬件资源
进程被阻塞在等待某些硬件资源(如磁盘 I/O)的状态中。只有等到这些资源可用,进程才能继续运行。
- 容易引起系统假死
如果大量进程进入不可中断睡眠状态,可能会导致整个系统无法响应,出现假死现象。
- 无法被调度
由于无法被中断,这些进程也无法被正常的进程调度机制调度。
3 暂停状态T
在 Linux 中,进程状态中的暂停状态 (T) 表示进程已被暂停或停止。这通常发生在以下几种情况:
-
进程收到 SIGSTOP 信号: 当进程收到 SIGSTOP 信号时,它会进入暂停状态。这可能是由用户或程序发送的。通常可以使用 kill 命令来发送 SIGSTOP 信号。
-
进程处于调试模式: 当进程被调试器(如 gdb)附加或控制时,它会进入暂停状态,以便调试器检查和控制进程的执行。
-
进程被其父进程暂停: 如果进程的父进程使用 ptrace() 系统调用暂停了子进程,则子进程也会进入暂停状态。这通常发生在调试器控制进程时。
-
进程被 shell 暂停: 在 shell 中运行的进程可以使用 Ctrl+Z 命令被暂停,进入暂停状态。此时可以使用 fg 命令将进程恢复到前台执行。
要恢复处于暂停状态的进程,通常可以使用 kill -SIGCONT 命令将其重新唤醒并继续执行。了解进程状态的暂停状态有助于更好地管理和控制 Linux 系统中的进程。
4.僵尸状态 Z
在 Linux 操作系统中,僵尸状态(Zombie state)指的是一种特殊的进程状态。当一个子进程终止运行时,它会进入僵尸状态。这意味着该进程已经结束执行,但它的父进程还没有收集它的退出状态信息。
进程在终止时会向它的父进程发送一个信号,通知父进程自己已经结束运行。然而,如果父进程没有及时处理这个信号,子进程就会进入僵尸状态。
僵尸进程不会占用系统资源,因为它们已经不再运行了。但是它们会一直保留在进程表中,直到父进程调用 wait() 系统调用来获取子进程的退出状态信息。
如果父进程没有及时处理子进程的退出状态,就会产生大量的僵尸进程,这可能会影响系统的整体性能。
5.死亡状态 X
死亡状态只是进程正常结束后的说法,当一个进程的死亡信息被读取后,该进程所申请的内存资源将会被释放。
7.僵尸进程
当一个子进程结束后,没有父进程读取他的退出信息时,子进程不会退出,将会一直处于僵尸状态,我们称之为僵尸进程。
以下的简单程序,通过父进程通过fork创建了子进程并让子进程先走完代码,父进程未结束,可以模拟子进程进入僵尸状态



僵尸进程危害
-
资源占用:僵尸进程会占用系统资源,如CPU、内存等,从而影响其他正常进程的运行。长时间积累下来会造成系统性能下降。
-
安全隐患:僵尸进程可能被利用进行恶意操作,如黑客攻击、植入后门等,危害系统安全。
-
错误信息:僵尸进程的存在会给系统管理员或监控系统带来错误的信息,影响对系统状态的判断。
-
系统崩溃:在某些情况下,大量僵尸进程的存在可能导致系统崩溃或死机。
8.孤儿进程
孤儿进程是指当一个父进程终止或退出,而它的子进程仍在运行的情况。这种子进程就称为孤儿进程。在这种情况下,子进程会被init进程(系统的第一个进程)收养,作为它的子进程。
孤儿进程的特点有:
-
当父进程终止时,子进程不会终止,而是被init进程接管。
-
init进程会等待并处理孤儿进程的退出,以防止它们成为僵尸进程。
-
孤儿进程会继续执行,直到它们自己终止或被杀死。
-
孤儿进程不会受到父进程终止的影响,可以独立执行。
以下程序可以模拟孤儿进程的产生

通过以下脚本监视进程产生过程
while :; do ps axj | head -1 && ps axj | grep orphan | grep -v grep;echo "###########################";sleep 1;done

9.进程优先级
由于计算机的cpu资源是有限的,所以对资源分配也极为关键
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
1.查看系统进程
在linux或者unix系统中,使用ps -l则会类似输出以下几个内容:

- UID : 代表执行者的身份
- PID : 代表这个进程的代号
- PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
- PRI :代表这个进程可被执行的优先级,其值越小越早被执行
- NI :代表这个进程的nice值
所谓的优先级主要指的是 PRI&&NI
PRI是当前运行队列里所使用的优先级,PRI越小优先级越高,若要修改优先级,即要修改NI值,加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice,这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行,nice其取值范围是-20至19,一共40个级别。
2.查看进程的优先级
top

用top命令更改已存在进程的nice:

进入top后按“r”–>输入进程PID–>输入要修改的NI
相关文章:
Linux的奇妙冒险——进程PCB第一讲
进程 1.进程的基本概念2.进程的描述3.查看进程4.通过系统调用获得pid和ppid5.通过fork()系统调用创建子进程6.进程状态1.浅度睡眠 S2.深度睡眠 D3 暂停状态T4.僵尸状态 Z5.死亡状态 X 7.僵尸进程8.孤儿进程9.进程优先级 1.进程的基本概念 任何计算机系统都包含一个基本的程序…...
阿里巴巴热土计划企划金:点燃贫困地区可持续发展的希望之火
在当今社会,扶贫工作已不再仅仅停留在简单的物质援助层面,而是更加注重通过资金支持和资源整合,推动贫困地区的可持续发展。阿里巴巴集团,作为全球领先的电子商务巨头,凭借其强大的影响力和社会责任感,推出…...
2-6 C浮点数指针运算案例
1.0 浮点数指针 float f 1.2f:如何将它对应的4个字节地址空间的数值以十六进制打印出来? 数据在所有计算机中都是以二进制形式存储的,然后以8个位为一个单元称作“字节”,作为计 量和运算处理单元,比如我们说一个文件大小是1MB,指…...
开源的跨平台SQL 编辑器Beekeeper Studio
一款开源的跨平台 SQL 编辑器,提供 SQL 语法高亮、自动补全、数据表内容筛选与过滤、连接 Web 数据库、存储历史查询记录等功能。该编辑器支持 SQLite、MySQL、MariaDB、Postgres 等主流数据库,并兼容 Windows、macOS、Linux 等桌面操作系统。 项目地址…...
07《缓存》计算机组成与体系结构 系列课
目录 深入了解缓存内存 缓存的重要性 游戏中的存储需求与主内存 虚拟内存和按需分页 现代系统中的多级缓存 缓存级别的大小与速度 缓存相关的术语 缓存命中与未命中 页面命中与缺页 局部性原理 结语 深入了解缓存内存 大家好,欢迎来到今天的课程。上节课…...
Java个人博客系统项目文档
项目名称 Java个人博客系统 项目概述 该博客系统是一个多功能的Java应用程序。该系统支持用户发布新文章、浏览他人文章、管理个人文章收藏和删除不再需要的文章。通过该博客系统,用户可以享受一个安全、便捷的在线写作和阅读体验。 运行环境 编程语言࿱…...
如何手动设置ubuntu服务器的ip、子网掩码、网关、DNS
在 Ubuntu 服务器上手动设置 IP 地址、子网掩码、网关和 DNS,通常有两种方式:使用传统的 ifconfig 命令和配置文件,或者使用现代的 netplan 配置方式(对于 Ubuntu 17.10 及以后版本,netplan 是默认的网络配置工具&…...
SVN clean up失效的一种解决办法
1、进入.svn 2、进入wc.db数据库 sqlite3.exe wc.db sqlite> select * from WC_LOCK; 若有输出则可采用下面的方式来清理 a、delete from WC_LOCK; b、如果删除失败就采用丢弃并重新创建WC_LOCK表的方式清理 drop table WC_LOCK; create table WC_LOCK ( wc_id INTEGER…...
S4 UPA of AA :新资产会计概览
通用并行会计(Universal Parallel Accounting)可以支持每个独立的分类账与其他模块集成,UPA主要是为了支持平行评估、多货币类型、财务合并、多准则财务报告的复杂业务需求 在ML层面UPA允许根据不同的分类账规则对物料进行评估,并…...
第30天:安全开发-JS 应用NodeJS 指南原型链污染Express 框架功能实现审计0
时间轴: 演示案例: 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF 题目&源码审计 开发指南-NodeJS-安全 SecGuide 项目、 环境搭建-NodeJ…...
关于单片机的原理与应用!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///目前正在学习C😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片…...
什么是节点嵌入向量
节点嵌入向量是图神经网络中对节点信息进行表示的一种方式。它是将节点的各种属性、特征以及其在图结构中的位置关系等信息,通过某种数学变换映射到一个低维向量空间中的向量。 在图神经网络中,节点通常具有多种属性,如在社交网络中用户节点可…...
青海摇摇了3天,技术退步明显.......
最近快手上的青海摇招聘活动非常火热,我已经在思考是否备战张诗尧的秋招活动。开个玩笑正片开始: 先说一下自己的情况,大专生,20年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,…...
url_launcher三方包的用法
文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了包管理相关的内容,本章回中将介绍如何使用url_launcher包.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍url_launcher包主要用来打开Url中的内容,Url可以是电话号码,网址,邮箱等内容。如…...
Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)
Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…...
springboot371高校实习管理系统(论文+源码)_kaic
毕 业 设 计(论 文) 题目:高校实习管理系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…...
Elasticsearch面试内容整理-面试注意事项
在准备 Elasticsearch 面试时,除了掌握技术知识外,还需要注意如何有效展示你的技能和经验。以下是一些 Elasticsearch 面试的注意事项和建议: 掌握基础概念 在面试中,面试官通常会首先评估你对 Elasticsearch 基础概念的理解,包括集群架构、分片、副本、节点类型等。这些是…...
Python学习第十五天--魔术方法
魔法方法就是可以给你的类增加魔力的特殊方法,它们总被双下划线所包围,像这种格式:"__方法名__",这些方法很强大,充满魔力,可以让你实现很多功能。 使用dir()查看类的所有属性和方法 class A:passprint(di…...
计算机的错误计算(一百七十二)
摘要 探讨 MATLAB 对于算式 的计算误差。 例1. 在 MATLAB 中计算 的值。 直接贴图吧: 这样,MATLAB 的输出中只有3位正确数字,有效数字的错误率为 (16-3)/16 81.25% . 因为16位的正确输出为 0.2971242332737277e-18(ISReals…...
C/C++每日一练:合并K个有序链表
本篇博客将探讨如何 “合并K个有序链表” 这一经典问题。本文将从题目要求、解题思路、过程解析和相关知识点逐步展开,同时提供详细注释的代码示例。 链表(Linked List) 链表是一种线性数据结构,由一系列节点(Node&…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
python读取SQLite表个并生成pdf文件
代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...
