6、进程理论和简单进程创建
一、了解进程推荐看这个视频,很详细
1、概念
- 进程(Process)=程序的运行过程,是系统进行资源分配和调度的独立单元
- 程序的运行过程:多个不同程序 并发,同一个程序同时执行多个任务。
- 就需要很多资源来实现这个过程。
- 每个进程都有一个独立的地址空间【空间由0开始扩大,直到最大值,成一个连续的空间】。在这个空间里,进程能够执行读写操作,存放可执行的程序代码、程序运行所需的资源以及函数调用和局部变量存储的栈结构。
- 进程控制块(PCB):
- 是一个数据结构。
- 描述进程的基本情况和运行状态。
- 为控制和管理提供数据依据。
2、访问linux的进程方法
那么如何查看进程?
基本语法:ps 选项
a:显示当前终端下的所有进程信息,包括其他用户的进程
u:以用户为主的进程状态
x:通常与 a 这个参数一起使用,显示当前用户在所有终端下的进程信息
-e:显示系统内所有的进程信息
-l:使用长格式显示进程信息
-f:使用完整的格式显示进程信息
//使用ps -aux
ps -aux

ps -elf

top
q 退出显示
top -d 默认三秒,指定top命令每隔几秒刷新
top -i 使用top不显示任何闲置或者僵死的进程
top -p 通过指定监控ID来仅仅监考某个进程的状态
例如:
top -d 10 每10秒刷新1次
- top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用类似于windows系统中的任务管理器。


pgrep
- 使用pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多中属性查询特定进程的PID号。
pstree 选项
-u 显示进程的用户名
-p 显示进程号(PID)
- 将进程以树形的结构展现出来
3、删除进程
kill 进程号 删除进程
kill -9 进程号 强制删除进程
4、进程的文件
- 在**/proc/里面**

这些蓝色的就是进程号。
二、进程模型
严格来说,一个CPU核心在任一时刻仅能执行一个线程的任务,即便是系统配置有双核心(或更多CPU)时,每个核心也是独立地且一次仅执行一个线程。
- 进程的组成
- 1、代码段和相关数据段
- 2、PCB(进程控制块)
- 2.1、PCB包含的信息
- ①进程标识符PID
- ②进程控制管理信息
- ③资源清单
- ④进程调度信息
- ⑤处理机状态
- 2.2、PCB是什么?
- ①是一个数据结构
- ②描述进程的基本情况和运行状态
- ③为管理和控制提供数据依据
- 从抽象的角度看,每个进程似乎都配备了专属的虚拟CPU以支持其独立执行,但物理程度上,CPU通过时间片机制在多个进程间进行快速切换,从而并发执行的假象。【简而言之:抽象看是每个进程都有一个CPU;物理上看是只有一个CPU供所有进程使用,进程用时间片机制来快速切换,像并发一样。】
-
如下图【物理上看】:


- 所以可以发现:
- 在经历足够长的一段时间后,所有的进程都运行了,但实际上在任何一个给定的瞬间仅有一个进程真正运行。
- 所以它们实际上是这样运行【A运行一点时间,就给B运行,B运行一点给C运行,如果需要回到A,就使用PCB,PCB记录了之前的状态。】的,如下图:

- PCB进程控制管理信息
- 代码段和数据段的地址
- 进程同步和通信信息
- 资源清单地址
- 进程队列指针
- PCB处理机状态
- 处理机中寄存器的内容
- 作用:CPU切换时保存现场信息和回复现场信息。
- PCB进程标识符
- 进程号
- PCB资源清单
- 内存地址
- 虚拟地址
- 打开文件列表
- I/O设备信息
- PCB进程调度信息
- 进程状态
- 优先级
- 等待和使用CPU时间总和
- 进程调度和对换依据
- 进程与进程之间怎么数据交换?
-
依靠操作系统内核
-

-
但是从上图可知:进程1和进程2是独立的个体。似乎不相互影响。
-
- 我们通过2段代码来理解【推荐先看下面部分的编程再看这里】
- 首先是创建一个全局变量 global_vary = 100 。再在child函数里改global_vary =200 。然后我们运行代码,得到结果如下图:
- 会发现,parent还是100 。child的是200 。

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int global_vary = 100;//创建了一个全局变量
void child(){global_vary =200;printf("in child process:%d global_vary:%d \n",getpid(),global_vary);
}
void parent(){sleep(3);//休眠3秒后,再运行。printf("int parent process:%d global_vary:%d \n",getpid(),global_vary);
}
int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//childchild();}else if(pid>0){parent();}return 0;}
- 使用sleep 修改
- 让 子进程结束变慢。

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int global_vary = 100;//创建了一个全局变量
void child(){global_vary =200;printf("in child process:%d global_vary:%d \n",getpid(),global_vary);sleep(3);
}
void parent(){sleep(1); printf("int parent process:%d global_vary:%d \n",getpid(),global_vary);
}
int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//childchild();}else if(pid>0){parent();}return 0;}
就会发现结果还是 200 ,100 。
这就能体现出他们是独立的。
它们是独立占用 0-3G虚拟空间。
三、进程的创建
1、了解情况
- 随机分配,谁先获得CPU的使用权。
- 通过返回值来区分父子进程。
- 返回是2次,一次是父进程的,另一次是子进程的。
- 子父进程共享文件
2、简单编程实现
2.1、getpid和getppid和fork
fork()的作用:- fork() 会创建一个子进程,父进程返回子进程的 PID,子进程返回 0。
- 如果 fork() 失败(如系统资源不足),返回 -1,并进入错误处理。
getpid() 和 getppid():- getpid():返回当前进程的 PID。
- getppid():返回当前进程的父进程 PID。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork failed\n");exit(1);} else if (pid == 0) {printf("子进程: PID = %d, PPID = %d\n", getpid(), getppid());} else {printf("父进程: PID = %d, PPID = %d\n", getpid(), getppid());wait(NULL); // 父进程等待子进程结束}return 0;
}
2.2、sleep
如果我想让子进程先运行,父进程后运行。就可以使用sleep(时间) 。这里的时间是默认按秒的时间,休眠作用。
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>void child(){printf("in child process:%d \n",getpid());
}
void parent(){sleep(3);//休眠3秒后,再运行。printf("int parent process:%d \n",getpid());
}
int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//childchild();exit(0);}else if(pid>0){parent();exit(0);}return 0;}

2.3、execlp和excvp
execvp和execlp很像,只是参数的写法不同。- 都通过PATH的方式查找。
- execvp的参数是指针数组
- execlp的参数是可变参数列表
#include <unistd.h>int main() {execlp("ls", "ls", "-l", NULL); // 等价于 execvp("ls", {"ls", "-l", NULL})perror("execlp failed");return 1;
}
- exlvp的作用:
- 用于 替换当前进程的映像(即运行另一个程序,当前进程的代码和数据会被新程序覆盖 。替换后,原进程的代码不会执行了。)。
函数原型
#include <unistd.h>
int execvp(const char *file, char *const argv[]);
argv以NULL结尾
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(){pid_t pid;pid=fork();if(pid<0){perror("fork have problem\n");exit(0);//释放pid}else if(pid==0){//替换成当前父进程的上下文,替换成新的进程静态数据区int ret=execlp("ls","ls","-l",NULL);if(ret<0){perror("execlp error");exit(-1);}printf("================================\n");exit(0);}else if(pid>0){//父进程回收子进程的资源getchar();wait(NULL);//阻塞接口,等待一个事件的发生}return 0;}
3、创建进程中的指令总结
exit(数字) 用来终止执行
fork 创建进程
wait 接收另一个进程的退出[阻塞接口]
sleep 休眠
execlp 替换当前进程的映像
- fork 子进程诞生,此时父进程是副本
- exec系列调用,替换成静态区
- exit系统调用,结束,变成僵尸
- wait系统调用,回收资源,已经变成僵尸状态的子进程的资源。
相关文章:
6、进程理论和简单进程创建
一、了解进程推荐看这个视频,很详细 1、概念 进程(Process)程序的运行过程,是系统进行资源分配和调度的独立单元程序的运行过程:多个不同程序 并发,同一个程序同时执行多个任务。 就需要很多资源来实现这个过程。 每个进程都有一…...
java八股文之JVM
1.什么是程序计数器 程序计数器是 JVM 管理线程执行的“定位器”,记录每个线程当前执行的指令位置,确保程序流程的连续性和线程切换的准确性。线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地…...
Todesk介绍
文章目录 ToDesk 软件介绍1. 软件概述2. ToDesk 的功能特点2.1 简单易用2.2 高质量的图像与流畅的操作2.3 跨平台支持2.4 多屏显示与协作2.5 文件传输功能2.6 实时聊天与语音通话2.7 远程唤醒与自动启动2.8 多种权限设置与安全性2.9 无需公网 IP 3. ToDesk 的应用场景3.1 个人使…...
每日总结3.27
蓝桥刷题 1. 团建 (树dfs) #include <bits/stdc.h> using namespace std; const int N200005; int a[N],b[N]; int ans; map<int,vector<int>>m1,m2; void dfs(int x,int y,int count) { if(a[x]!b[y]) {return;} ansmax(ans,c…...
Linux 进程3-fork创建子进程继承父进程缓冲区验证
目录 1. fork创建子进程继承父进程缓冲区验证 1.1 write向标准输出(终端屏幕)写入数据验证 1.1.1 write函数写入数据不带行缓冲刷新 \n 1.1.2 write函数写入数据带行缓冲刷新 \n 1.2 fork创建前执行printf函数 1.2.1 fork创建前执行printf函数带\n…...
应用服务接口第二次请求一直pending问题
目录 一、问题背景二、问题排查过程三、解决方案四、总结 一、问题背景 升级内容发布到灰度环境,验证相关服务,查看接口调用日志,发现第一次请求正常,第二次相同接口请求就一直pending,其他服务也是如此 二、问题排查…...
基于FPGA的ESP8266无线数据传输(温湿度DTH11、光照强度BH1750、WIFI模块)连接中国移动onenet云平台,仿真+上板
文章目录 一、创建云平台产品设备二、FPGA仿真WIFI模块通信过程仿真分析2.上板 总结 一、创建云平台产品设备 使用串口助手测试传输过程 相关信息记录 二、FPGA仿真WIFI模块通信过程 仿真分析 //各个状态tx_dataalways (posedge clk or negedge rst_n) beginif(!rst_n) beg…...
5款视觉OCR开源模型
一、号称「世界上最好的 OCR 模型」Mistral OCR Mistral OCR 擅长理解复杂的文档元素,包括交错图像、数学表达式、表格和高级布局(如 LaTeX 格式)。该模型可以更深入地理解丰富的文档,尤其是包含图表、图形、公式和数字的科学论文…...
计算机二级(C语言)考试高频考点总汇(三)—— 结构体和共用体、结构体对齐规则、联合体大小计算
目录 九、结构体和共用体 十、结构体对齐规则 十一、联合体大小计算 九、结构体和共用体 141. 结构体是(不同类型成员的集合),是⼀种用户自定义的数据类型,可以将不同类型的成员组合在⼀起,用于表示(复…...
transformers中学习率warmup策略具体如何设置
在使用 get_linear_schedule_with_warmup(如 Hugging Face Transformers 库中的学习率调度器)时,参数的合理设置需要结合 数据量(dataset size)、批次大小(batch size) 和 训练轮数(…...
“线程通信“一个案例
今天在处理项目需求的时候, 遇到这样一个问题: 项目中需要将用户界面上传的某种模型文件转换成另一种格式的文件, 以便进行预览操作. 而这个转换的过程需要调用到专业软件的脚本程序, 简单来说就是一个比较耗时的步骤. 并且这个转换还要分为两步进行, 需要调用两个脚本程序. 简…...
Charles抓HTTPS包
一、电脑端 1、证书下载与安装 安装完之后,重新点开看一看,确认下证书状态,安装的没问题 2、charles设置 抓电脑端要把这个点开 3、抓包 正经人看浏览器的包一般是F12,不过这里就用浏览器代替电脑软件了 如果配制好charles之后…...
JavaScript模板字符串:
1.示例代码(包含注释): <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-数…...
【系统架构设计师】数据库系统 ③ ( 数据库设计过程 | 概念结构设计 | ER 图 简介 | 概念设计阶段 工作拆分 )
文章目录 一、数据库设计过程 概述二、ER 图 简介1、ER 图 概念2、ER 图 示例3、ER 图 关系类型① 一对一 ( 1:1 ) 关系② 一对多 ( 1:n ) 关系③ 多对多 ( n:n ) 关系 三、概念设计阶段 工作拆分 一、数据库设计过程 概述 数据库设计过程 : 需求分析阶段 : 明确 用户需求 ; …...
Servlet开发与生命周期详解-2
一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多,其中目前使用比较多的是: IntelliJ IDEA(这个居多,IDEA在提示功能方面要强于Eclipse,也就是说IDEA使用起来比Eclipse更加智能,更好用。JetBrai…...
将网络安全和第三方风险管理与业务目标相结合
在网络安全风险领域,我们经常遇到与企业语言不通的问题。这可能导致网络安全风险管理计划得不到支持。当发现网络安全风险时,困难在于以符合组织语言和目标的方式来表达它。 第三方风险属于另一个灰色地带。在组织内部,许多利益相关者&#…...
NO.58十六届蓝桥杯备战|基础算法-枚举|普通枚举|二进制枚举|铺地毯|回文日期|扫雷|子集|费解的开关|Even Parity(C++)
枚举 顾名思义,就是把所有情况全都罗列出来,然后找出符合题⽬要求的那⼀个。因此,枚举是⼀种纯暴⼒的算法。 ⼀般情况下,枚举策略都是会超时的。此时要先根据题⽬的数据范围来判断暴⼒枚举是否可以通过。 使⽤枚举策略时…...
postman测试调用WebService时不会自动添加命名空间
这两天在学习调用webservice,发现Postman直接调用时,返回 no namesapce on "myservice" element. you must send a soap message 找了很久,才明白,Postman 不会自动为请求添加命名空间,得手动在请求的 XML 数…...
【已解决】Git:为什么 .gitignore 不生效?如何停止跟踪已提交文件并阻止推送?
你可能遇到的问题 你已经提交了某个文件夹(如 dataset)到 Git 仓库,之后修改了它,但发现修改内容被 Git 持续跟踪,无法通过 .gitignore 忽略。尝试在 .gitignore 中添加规则后,修改的文件仍然显示为"…...
WebRTC协议全面教程:原理、应用与优化指南
一、WebRTC协议概述 **WebRTC(Web Real-Time Communication)**是一种开源的实时通信协议,支持浏览器和移动应用直接进行音频、视频及数据传输,无需插件或第三方软件。其核心特性包括: P2P传输:点对点直连…...
深度学习框架对比评测:TensorFlow、PyTorch、PaddlePaddle与MXNet的技术演进与应用实践
本文针对当前主流的四大深度学习框架(TensorFlow 2.15、PyTorch 2.2、PaddlePaddle 2.5、MXNet 1.9),从架构设计、开发效率、训练性能、部署能力及生态系统等维度展开系统性评测。通过图像分类、自然语言处理、强化学习三类典型任务的基准测试…...
Ethernet(以太网)详解
一、Ethernet的定义与核心特性 以太网(Ethernet)是一种 基于IEEE 802.3标准的局域网(LAN)技术,用于设备间通过有线或光纤介质进行数据通信。其核心特性包括: 标准化:遵循IEEE 802.3系列协议&am…...
Python正则表达式(二)
目录 六、re.findall()函数和分组 1、0/1分组情况 2、多分组情况 七、或“|”的用法 1、作用域 2、用法 八、贪婪模式和懒惰模式 1、量词的贪婪模式 2、量词的懒惰模式 九、匹配对象 1、相关函数 六、re.findall()函数和分组 1、0/1分组情况 在正则表达式中&#x…...
学习《JS数据结构与算法》
博主这些日子去实习所以断更了,现在回归想接着学习一下数据结构与算法,学校也有上这门课,但博主去实习很多课都没上,现在自己看书学习一下,每天记录一下自己学习进度规范一下自己,需要这本书的可以私聊博主…...
图解AUTOSAR_SWS_FlashDriver
AUTOSAR Flash驱动(FLS)模块详解 AUTOSAR基础软件存储抽象层组件详细解析 目录 1. 概述 1.1. Flash驱动模块简介1.2. 功能和作用2. 架构设计 2.1. 模块架构2.2. API接口设计2.3. 状态机设计2.4. 异步操作时序2.5. 配置结构2.6. 任务处理流程3. 总结 3.1. 设计优势3.2. 应用场景…...
哪吒汽车:一边熬夜蹦迪,一边找药投医
两年前,威马CEO沈晖发了个短视频,内容是“活下去,像牲口一样活下去”。 如今最能体会沈晖当时心情的,估计就是方运舟了。 作为哪吒汽车创始人兼董事长,他连续多次被限高,为了让哪吒汽车活下去,…...
Linux一步部署主DNS服务器
#!/bin/bash #部署DHCP服务 #userli 20250319if [ "$USER" ! "root" ]then echo"错误:非root用户,权限不足!"exit 0fi#防火墙与高级权限 systemctl stop firewalld && systemctl disable firewalld…...
使用django的DRF业务逻辑应该放在序列化器类还是模型类
在 Django REST Framework (DRF) 中,序列化器和模型类有明确的职责划分。虽然序列化器在反序列化时负责接收、验证和转换数据,但模型类仍是整个系统的核心,承担更底层的职责。以下是详细解析: 一、序列化器 vs 模型类:…...
图片隐私清理工具
图片隐私清理助手:一键清除图片敏感信息的神器 在数字时代,我们每天都会拍摄和分享大量图片,但你是否注意过这些图片中可能暗藏隐私信息?相机的GPS定位、拍摄参数等EXIF数据,都可能在不经意间泄露你的隐私。今天介绍的…...
【UE5】摄像机晃动
目录 效果 步骤 一、游戏中晃动视角 二、Sequence中晃动视角 效果 步骤 一、游戏中晃动视角 1. 新建一个蓝图,父类选择“CameraShakeBase” 这里命名为“BP_MyCameraShake” 打开“BP_MyCameraShake”,根晃动模式这里设置为“Perlin噪点摄像机晃…...

