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

Linux进程管理与进程间通信

 一、进程基础知识

 1. 进程的定义与特性


   **定义**:进程是程序的一次执行过程,是系统资源分配的基本单位
   **特性**:
  - 动态性:进程是程序的动态执行过程
  - 并发性:多个进程可以并发执行
  - 独立性:进程拥有独立的地址空间
  - 异步性:进程以不可预知的速度向前推进
  - 结构性:进程由程序段、数据段和进程控制块(PCB)组成

 2. 进程控制块(PCB)


PCB是操作系统管理进程的数据结构,包含:
- 进程标识符(PID)
- 进程状态
- 程序计数器
- CPU寄存器
- CPU调度信息
- 内存管理信息
- 记账信息
- I/O状态信息

 二、进程状态与转换

1. 五状态模型


- **创建态(New)**:进程正在被创建
- **就绪态(Ready)**:进程等待被调度
- **运行态(Running)**:进程正在CPU上执行
- **阻塞态(Blocked/Waiting)**:进程等待某事件发生
- **终止态(Terminated)**:进程执行完毕

 2. 状态转换触发条件


- **创建→就绪**:进程创建完成,系统资源充足
- **就绪→运行**:调度器选中该进程
- **运行→就绪**:时间片用完或高优先级进程抢占
- **运行→阻塞**:进程请求资源或等待事件
- **阻塞→就绪**:资源可用或等待事件发生
- **运行→终止**:进程正常或异常结束

 三、进程控制

1. 进程创建

fork()系统调用

pid_t pid = fork();


- 特点:
  - 一次调用,两次返回
  - 父进程返回子进程PID,子进程返回0
  - 子进程复制父进程的数据空间、堆和栈
  - 共享代码段
  - 子进程继承父进程的文件描述符、信号处理方式等

exec族系统调用


用于在进程中执行新程序:
- `execl()`、`execlp()`、`execle()`
- `execv()`、`execvp()`、`execve()`

 2. 进程终止


- **正常终止**:


  - `exit()`函数
  - `return`语句(从main函数)


- **异常终止**:


  - 接收到未处理的信号
  - 段错误或总线错误

3. 进程等待


- **wait()系统调用**:阻塞等待任一子进程结束
- **waitpid()系统调用**:可以等待特定子进程,支持非阻塞模式

4. 特殊进程


- **孤儿进程**:父进程先于子进程结束,子进程被init进程(PID=1)收养
- **僵尸进程**:子进程结束但父进程未调用wait/waitpid回收,占用系统资源
- **守护进程**:在后台运行且不受终端控制的进程,通常以'd'结尾(如httpd)

四、进程调度

1. 调度算法


- **先来先服务(FCFS)**:按进程到达顺序调度
- **最短作业优先(SJF)**:选择执行时间最短的进程
- **优先级调度**:按优先级高低调度
- **时间片轮转(RR)**:每个进程分配一个时间片
- **多级反馈队列**:结合多种调度算法的优点

2. Linux调度器


- **O(1)调度器**:常数时间复杂度
- **完全公平调度器(CFS)**:基于红黑树实现,保证进程公平分配CPU时间

五、进程间通信(IPC)

 1. 管道(Pipe)


- **无名管道**:


  - 半双工通信
  - 只能用于有亲缘关系进程
  - 使用`pipe()`系统调用创建
 

  int fd[2];pipe(fd); // fd[0]用于读,fd[1]用于写

- **命名管道(FIFO)**:


  - 可用于无亲缘关系进程
  - 在文件系统中有路径名
  - 使用`mkfifo()`创建
 

  mkfifo("/tmp/myfifo", 0666);

2. 信号(Signal)


- 软中断机制,用于通知进程发生了异步事件
- 常用信号:
  - SIGINT (Ctrl+C)
  - SIGKILL (无法捕获或忽略)
  - SIGSEGV (段错误)
  - SIGCHLD (子进程状态改变)
- 信号处理:
  - 忽略
  - 捕获并处理
  - 执行默认操作

 3. 消息队列


- 消息的链表,存放在内核中
- 每个消息有特定的类型
- 相关函数:
  - `msgget()`:创建或访问消息队列
  - `msgsnd()`:发送消息
  - `msgrcv()`:接收消息
  - `msgctl()`:控制消息队列

4. 共享内存


- 最快的IPC方式
- 多个进程映射同一块物理内存到各自的地址空间
- 相关函数:
  - `shmget()`:创建或访问共享内存
  - `shmat()`:附加共享内存到进程地址空间
  - `shmdt()`:分离共享内存
  - `shmctl()`:控制共享内存

5. 信号量(Semaphore)


- 用于进程间同步和互斥
- 解决共享资源访问冲突
- 相关函数:
  - `semget()`:创建或访问信号量集
  - `semop()`:信号量操作(P/V操作)
  - `semctl()`:控制信号量

6. 套接字(Socket)


- 可用于同一主机或不同主机间的进程通信
- 支持多种协议(TCP/UDP等)
- 相关函数:
  - `socket()`:创建套接字
  - `bind()`:绑定地址
  - `listen()`:监听连接
  - `accept()`:接受连接
  - `connect()`:建立连接
  - `send()/recv()`:发送/接收数据

 六、线程

 1. 线程与进程的区别


- 线程是CPU调度的基本单位
- 同一进程的线程共享代码段、数据段和文件资源
- 每个线程有独立的栈空间和寄存器环境

2. POSIX线程(pthread)


- 创建线程:`pthread_create()`
- 终止线程:`pthread_exit()`
- 等待线程:`pthread_join()`
- 线程同步:
  - 互斥锁:`pthread_mutex_t`
  - 条件变量:`pthread_cond_t`
  - 读写锁:`pthread_rwlock_t`
  - 自旋锁:`pthread_spinlock_t`

 七、实际应用示例

1. 使用fork创建子进程


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main() {pid_t pid;printf("进程=%d\n", getpid());pid = fork();if (pid < 0) {perror("fork失败");exit(1);} else if (pid == 0) {// 子进程执行代码printf("子进程:我是子进程,我的PID是=%d\n", getpid());printf("子进程:我的父进程的PID是=%d\n", getppid());exit(0);} else {// 父进程执行代码printf("父进程:我是父进程,我的PID是=%d\n", getpid());printf("父进程:我的子进程的PID是=%d\n", pid);// 等待子进程结束wait(NULL);}return 0;
}


 2. 使用管道进行进程间通信

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main() {int fd[2];pid_t pid;char buffer[100];// 创建管道if (pipe(fd) == -1) {perror("pipe");exit(1);}pid = fork();if (pid < 0) {perror("fork");exit(1);} else if (pid == 0) {  // 子进程close(fd[1]);  // 关闭写端read(fd[0], buffer, sizeof(buffer));printf("子进程收到消息: %s\n", buffer);close(fd[0]);exit(0);} else {  // 父进程close(fd[0]);  // 关闭读端strcpy(buffer, "Hello from parent!");write(fd[1], buffer, strlen(buffer) + 1);close(fd[1]);wait(NULL);  // 等待子进程结束}return 0;
}

八、Linux系统调用与库函数

 常用系统调用


- `fork()`:创建子进程
- `exec()`:执行新程序
- `wait()/waitpid()`:等待子进程
- `exit()`:终止进程
- `kill()`:发送信号
- `alarm()`:设置定时器
- `sleep()`:进程休眠
- `pause()`:挂起进程直到收到信号

 进程信息查看命令


- `ps`:显示进程状态
- `top`:动态显示进程信息
- `pstree`:以树状显示进程
- `kill`:发送信号给进程
- `nice/renice`:调整进程优先级

相关文章:

Linux进程管理与进程间通信

一、进程基础知识 1. 进程的定义与特性 **定义**&#xff1a;进程是程序的一次执行过程&#xff0c;是系统资源分配的基本单位 **特性**&#xff1a; - 动态性&#xff1a;进程是程序的动态执行过程 - 并发性&#xff1a;多个进程可以并发执行 - 独立性&#xff1a;进…...

【无人机】无人机PX4飞控系统高级软件架构

目录 1、概述&#xff08;图解&#xff09; 一、数据存储层&#xff08;Storage&#xff09; 二、外部通信层&#xff08;External Connectivity&#xff09; 三、核心通信枢纽&#xff08;Message Bus&#xff09; 四、硬件驱动层&#xff08;Drivers&#xff09; 五、飞…...

启动arthas-boot.jar端口占用

问题 [rootlocalhost arthas-4.0.4]# java -jar arthas-boot.jar [ERROR] The telnet port 3658 is used by process 7066 instead of target process 6155, you will connect to an unexpected process. [ERROR] 1. Try to restart arthas-boot, select process 7066, shutdow…...

JSVMP逆向实战:原理分析与破解思路详解

引言 在当今Web安全领域&#xff0c;JavaScript虚拟机保护&#xff08;JSVMP&#xff09;技术被广泛应用于前端代码的保护和反爬机制中。作为前端逆向工程师&#xff0c;掌握JSVMP逆向技术已成为必备技能。本文将深入剖析JSVMP的工作原理&#xff0c;并分享实用的逆向破解思路…...

【SPP】蓝牙链路控制(LC)在SPP中互操作性深度解析

在蓝牙协议栈的精密分层体系中&#xff0c;其链路控制&#xff08;Link Control, LC&#xff09;层作为基带层的核心组件&#xff0c;承载着物理信道管理、连接建立与维护等关键任务。其互操作性要求直接决定了不同厂商设备能否实现无缝通信。本文将以蓝牙技术规范中的LC互操作…...

单片机学习之定时器

定时器是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32一般总共有8个定时器&#xff0c;分别是2个高级定时器&#xff08;TIM1、TIM8&#xff09;&#xff0c;4个通用定时器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09;和2个基本定时器&#xff08;TI…...

供应链管理:计算题 / 倒扣法

一、理解倒扣法 在供应链管理中&#xff0c;倒扣法是一种常用的成本计算方法&#xff0c;主要用于确定商品的成本和销售价格&#xff0c;以确保特定的毛利率。倒扣法的基本原理是在已知售价和期望毛利率的情况下&#xff0c;逆推计算出供货价或成本价。 二、倒扣法的计算公式…...

算法每日一练 (25)

&#x1f4a2;欢迎来到张翊尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (25)四数之和题目描述解题思路解题代码c…...

【大模型基础_毛玉仁】6.4 生成增强

目录 6.4 生成增强6.4.1 何时增强1&#xff09;外部观测法2&#xff09;内部观测法 6.4.2 何处增强6.4.3 多次增强6.4.4 降本增效1&#xff09;去除冗余文本2&#xff09;复用计算结果 6.4 生成增强 检索器得到相关信息后&#xff0c;将其传递给大语言模型以期增强模型的生成能…...

Zephyr实时操作系统初步介绍

一、概述 Zephyr是由Linux基金会托管的开源实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为资源受限的物联网设备设计。其核心特性包括模块化架构、跨平台兼容性、安全性优先以及丰富的连接协议支持。基于Apache 2.0协议&#xff0c;Zephyr允许商业和非商业用途的自…...

【GCC警告报错4】warning: format not a string literal and no format arguments

文章主本文根据笔者个人工作/学习经验整理而成&#xff0c;如有错误请留言。 文章为付费内容&#xff0c;已加入原创保护&#xff0c;禁止私自转载。 文章发布于&#xff1a;《C语言编译报错&警告合集》 如图所示&#xff1a; 原因&#xff1a; snprintf的函数原型&#x…...

【落羽的落羽 C++】模板简介

文章目录 一、模板的引入二、函数模板1. 函数模板的使用2. 函数模板的原理3. 函数模板的实例化4. 函数模板的匹配 三、类模板 一、模板的引入 假如我们想写一个Swap函数&#xff0c;针对每一种类型&#xff0c;都要函数重载写一次&#xff0c;但它们的实现原理是几乎一样的。在…...

USB(通用串行总线)数据传输机制和包结构简介

目录 1. USB的物理连接电缆结构时钟恢复技术 2. USB的数据传输方式包&#xff08;Packet&#xff09; 3. 包的传输规则帧和微帧 4. 包的结构1. 同步字段&#xff08;Sync&#xff09;2. 包标识符字段&#xff08;PID&#xff09;3. 数据字段4. 循环冗余校验字段&#xff08;CRC…...

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV3模型算法详解前言YOLOV3的模型结构YOLOV3模型的基本执行流程YOLOV3模型的网络参数 YOLOV3的核心思想前向传播阶段反向传播阶段 总结 前言 YOLOV3是由华盛顿…...

【前端扫盲】postman介绍及使用

Postman 是一款专为 API 开发与测试设计的 全流程协作工具&#xff0c;程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明&#xff1a; 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法&#xff08;GET/POS…...

每日c/c++题 备战蓝桥杯(全排列问题)

题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列&#xff0c;即 n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字保留 5 个场…...

IdeaVim-AceJump

‌AceJump 是一款专为IntelliJ IDEA平台打造的开源插件&#xff0c;旨在通过简单的快捷键操作帮助用户快速跳转到编辑器中的任何符号位置&#xff0c;如变量名、方法调用或特定的字符串‌。无论是大型项目还是日常编程&#xff0c;AceJump 都能显著提升你的代码导航速度和效率。…...

BMS电池关键参数及其含义

BMS概述 BMS的定义与功能 BMS&#xff0c;即电池管理系统&#xff0c;是电池系统的核心控制设备&#xff0c;充当着电池的“状态观测器”。它通过传感器采集电池的单体电压、温度、电流等关键参数&#xff0c;并利用电子控制单元&#xff08;ECU&#xff09;进行数据处理和分…...

DataFrame行索引操作以及重置索引

一.DataFrame行索引操作 1.1 获取数据 1.1.1 loc 选取数据 df.loc[ ] 只能使用标签索引&#xff0c;不能使用整数索引。 当通过标签索引的切片方式来筛选数据时&#xff0c;它的取值前闭后闭。 传参&#xff1a; 1.如果选择单行或单列&#xff0c;返回的数据类型为 Series…...

DayDreamer: World Models forPhysical Robot Learning

DayDreamer&#xff1a;用于物理机器人学习的世界模型 Philipp Wu* Alejandro Escontrela* Danijar Hafner* Ken Goldberg Pieter Abbeel 加州大学伯克利分校 *贡献相同 摘要&#xff1a;为了在复杂环境中完成任务&#xff0c;机器人需要从经验中学习。深度强化学习是机器人学…...

线性欧拉筛

线性筛&#xff1a;高效求解素数 在数论中&#xff0c;素数的筛选是一个经典的问题。最常见的素数筛选方法是埃拉托斯特尼筛法&#xff0c;其时间复杂度为 O ( n log ⁡ log ⁡ n ) O(n\log \log n) O(nloglogn)&#xff0c;非常适合求解小范围内的素数。随着问题规模的增大&…...

Flutter vs React Native:跨平台移动开发框架对比

文章目录 前言1. 框架概述什么是 Flutter&#xff1f;什么是 React Native&#xff1f; 2. 性能对比Flutter 的性能表现React Native 的性能表现总结&#xff1a; 3. 开发体验对比3.1 开发效率3.2 UI 组件库 4. 生态系统对比5. 适用场景分析6. 结论&#xff1a;如何选择&#x…...

用matlab搭建一个简单的图像分类网络

文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData&#xff0c;每个数字文件夹里包含1000张对应这个数字的图片&#xff0c;图片的尺寸都是 28281 像素的&#xff0c;如下图所示…...

AI辅助开发插件

适合Java程序员的AI辅助开发插件&#xff0c;按功能和适用场景分类&#xff1a; 1. 飞算JavaAI • 特点&#xff1a;从需求分析到代码生成的全流程智能引导&#xff0c;支持Maven、Gradle等主流工具&#xff0c;一键生成完整工程代码&#xff0c;包括配置文件、源代码和测试资…...

【AI4CODE】5 Trae 锤一个基于百度Amis的Crud应用

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 【AI4CODE】3 Trae 锤一个贪吃蛇的小游戏 【AI4CODE】4 Trae 锤一个数据搬运工的小应用 1 百度 Amis 简介 百度 Amis 是一个低代码前端框架&#xff0c;由百度开源。它通过 J…...

npm webpack打包缓存 导致css引用地址未更新

问题如下&#xff1a; 测试环境配置&#xff1a; publicPath: /chat/,生产环境配置&#xff1a; publicPath: /,css中引用背景图片 background-image: url(/assets/images/calendar/arrow-left.png);先打包测试环境&#xff0c;观察打包后的css文件引用的背景图片地址 可以全…...

ollama导入huggingface下载的大模型并量化

1. 导入GGUF 类型的模型 1.1 先在huggingface 下载需要ollama部署的大模型 1.2 编写modelfile 在ollama 里面输入 ollama show --modelfile <你有的模型名称> eg: ollama show --modelfile qwen2.5:latest修改其中的from 路径为自己的模型下载路径 FROM /Users/lzx/A…...

Java 集合 Map Stream流

目录 集合遍历for each map案例 ​编辑 这种数组的遍历是【index】​编辑map排序【对象里重写compareTo​编辑map排序【匿名内部类lambda​编辑 stream流​编辑 ​编辑获取&#xff1a; map的键是set集合&#xff0c;获取方法map.keySet() map的值是collection 集合&…...

记录一下零零散散的的东西-ImageNet

ImageNet 是一个非常著名的大型图像识别数据集&#xff0c; 数据集基本信息 内容说明&#x1f4f8; 图像数量超过 1400万张图片&#xff08;包含各类子集&#xff09;&#x1f3f7;️ 类别数量常用的是 ImageNet-1K&#xff08;1000类&#xff09;&#x1f9d1;‍&#x1f3e…...

【网络安全实验】PKI(证书服务)配置实验

目录 一、PKI相关概念 1.1 定义与核心功能 1.2 PKI 系统的组成 1.证书颁发机构&#xff08;CA, Certificate Authority&#xff09; 2.注册机构&#xff08;RA, Registration Authority&#xff09; 3.数字证书 1.3 PKI 的功能 1.4 PKI认证体系&#xff1a; 工作流程 …...