进程线程的创建、退出、回收

1. 进程相关知识点

1.1 进程创建
  • fork()

    • 功能:创建一个子进程。

    • 返回值:

      • 父进程中返回子进程的 PID。

      • 子进程中返回 0。

      • 失败返回 -1。

    • 特点:子进程是父进程的副本,拥有独立的内存空间。

  • vfork()

    • 功能:创建一个子进程。

    • 返回值:

      • 父进程中返回子进程的 PID。

      • 子进程中返回 0。

      • 失败返回 -1。

    • 特点:子进程与父进程共享内存空间,直到子进程调用 exec()exit()

1.2 进程退出
  • exit()

    • 功能:刷新缓存区,并让进程结束。

    • 参数:status(进程结束状态)。

    • 返回值:无。

  • _exit()

    • 功能:直接终止进程,不刷新缓存区。

    • 参数:status(进程结束状态)。

    • 返回值:无。

1.3 进程回收
  • wait()

    • 功能:回收任意一个子进程的空间。

    • 参数:wstatus(存放子进程结束状态的指针)。

    • 返回值:

      • 成功返回回收到的子进程的 PID。

      • 失败返回 -1。

    • 特点:阻塞调用,直到子进程结束。

  • waitpid()

    • 功能:回收指定的子进程的空间。

    • 参数:

      • pid:要回收的子进程的 PID(-1 表示任意子进程)。

      • wstatus:存放子进程结束状态的指针。

      • options:回收选项(如 WNOHANG 表示非阻塞)。

    • 返回值:

      • 成功返回回收到的子进程的 PID。

      • 失败返回 -1。

      • 没有回收到子进程返回 0。

  • 状态检查宏

    • WIFEXITED(wstatus):检查子进程是否正常结束。

    • WEXITSTATUS(wstatus):获取子进程的退出状态。

    • WIFSIGNALED(wstatus):检查子进程是否被信号终止。

    • WTERMSIG(wstatus):获取终止子进程的信号编号。

1.4 进程执行新程序
  • exec 函数族

    • 功能:在当前进程空间中执行新的程序。

    • 常见函数:

      • execl():参数以列表形式传递。

      • execlp():在环境变量 $PATH 中查找文件。

      • execv():参数以指针数组形式传递。

      • execvp():在环境变量 $PATH 中查找文件。

      • execle()execvpe():支持自定义环境变量。

    • 特点:不创建新进程,直接替换当前进程的代码。


2. 线程相关知识点

2.1 线程创建
  • pthread_create()

    • 功能:在调用函数的进程中创建一个线程。

    • 参数:

      • thread:存放线程 ID 的指针。

      • attr:线程属性(可选)。

      • start_routine:线程函数的入口。

      • arg:传递给线程函数的参数。

    • 返回值:

      • 成功返回 0。

      • 失败返回错误码。

2.2 线程退出
  • pthread_exit()

    • 功能:线程退出。

    • 参数:retval(线程退出的值)。

    • 返回值:无。

2.3 线程回收
  • pthread_join()

    • 功能:回收线程空间。

    • 参数:

      • thread:要回收的线程的 ID。

      • retval:存放线程结束状态的指针。

    • 返回值:

      • 成功返回 0。

      • 失败返回错误码。

    • 特点:阻塞调用,直到线程结束。


3. 进程与线程的区别

3.1 进程
  • 定义:程序动态执行的过程,包括创建、调度和消亡。

  • 特点:

    • 是操作系统资源分配的最小单元。

    • 包括文本段、数据段、系统数据段等。

    • 进程切换需要映射到不同的物理地址空间,资源开销较大。

3.2 线程
  • 定义:线程是一个轻量级的进程。

  • 特点:

    • 是 CPU 任务调度的最小单元。

    • 线程位于进程空间内部,共享进程的文本段、数据段和堆区。

    • 线程切换在进程空间内部完成,资源开销较小。

3.3 区别
  • 执行效率

    • 多线程 > 多进程。

    • 线程切换在进程空间内部完成,资源开销小。

  • 通信实现

    • 多线程 > 多进程。

    • 线程共享进程空间,通信更方便。

  • 通信机制复杂程度

    • 多进程 > 多线程。

    • 线程操作全局变量可能引入资源竞争,需要加锁。

  • 安全性

    • 多进程 > 多线程。

    • 线程异常崩溃可能导致整个进程崩溃。


4. 僵尸进程

  • 定义:子进程已经结束,但父进程尚未读取子进程的状态信息时,子进程的状态信息仍然保留在系统中。

  • 产生原因:父进程没有及时调用 wait()waitpid() 回收子进程。

  • 避免方法

    • 父进程及时调用 wait()waitpid()

    • 使用信号处理函数(如 SIGCHLD)自动回收子进程。


5. 线程空间划分

  • 栈区:每个线程独立拥有栈空间(默认 8MB)。

  • 共享区:文本段、数据段、堆区与进程及进程内的其他线程共享。


6. 进程状态

  • 运行态:正在运行或等待运行。

  • 就绪态:准备好运行,但等待 CPU 调度。

  • 阻塞态:等待某些事件(如 I/O 操作)完成。

  • 终止态:进程结束,等待回收。


7. 进程调度算法

  • 常见算法

    • 先来先服务(FCFS)。

    • 短作业优先(SJF)。

    • 时间片轮转(RR)。

    • 优先级调度。

    • 多级反馈队列调度。


8. 常见命令

  • ps:显示当前系统中的进程信息。

  • top:实时显示系统中占用资源最多的进程。

  • kill:发送信号给进程(如终止进程)。

  • nice:设置进程的优先级。


9. 线程相关函数

  • pthread_create():创建线程。

  • pthread_exit():线程退出。

  • pthread_join():回收线程空间。

  • pthread_detach():分离线程,使其结束后自动释放资源。


10. 多进程 vs 多线程

  • 执行效率:多线程 > 多进程。

  • 通信实现:多线程 > 多进程。

  • 通信机制复杂程度:多进程 > 多线程。

  • 安全性:多进程 > 多线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解耦的艺术_应用架构中的解耦

文章目录 Pre解耦的技术演化应用架构中的解耦小结 Pre 解耦的艺术_通过DPI依赖倒置实现解耦 解耦的艺术_通过中间层映射实现解耦 解耦的技术演化 技术的演化史,也是一部解耦的历史。从最初的面向对象编程(OOP)到Spring框架的依赖注入&…

低概率发生调用`pthread_cond_wait`的线程没有被唤醒

低概率发生调用pthread_cond_wait的线程没有被唤醒 背景: 你是否也踩过坑,在A线程调用pthread_cond_wait等待,在B线程调用pthread_cond_signal唤醒A线程进行工作处理,然后在某一次用户产品反馈中发现了低概率问题。A线程像是卡住…

Python Cookbook-2.3 搜索和替换文件中的文本

任务 需要将文件中的某个字符串改变成另一个。 解决方案 字符串对象的 replace 方法提供了字符串替换的最简单的办法。下面的代码支持从一个特定的文件(或标准输入)读取数据,然后写人一个指定的文件(或标准输出): importos,sys nargs len(sys.argv) if not 3&l…

机器学习实战(5):决策树与随机森林——直观的分类与回归方法

第5集:决策树与随机森林——直观的分类与回归方法 在机器学习中,决策树(Decision Tree) 和 随机森林(Random Forest) 是两种直观且强大的算法,广泛应用于分类和回归任务。决策树通过一系列规则…

网站中内嵌腾讯元宝用deepseek

网站中内嵌元宝deepseek <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BING搜</title> <meta name="description" content="不用学习就G搜索高级语法,即选即用…

draw.io:开源款白板/图表绘制利器

在工作和学习中&#xff0c;我们常常需要绘制各种图表&#xff0c;例如流程图、思维导图、网络拓扑图等等。一款功能强大且易于上手的图表绘制工具可以极大地提高我们的效率。今天&#xff0c;我要向大家推荐一款开源免费的图表绘制工具—— draw.io&#xff0c;并手把手教你如…

ES6箭头函数:从基础到进阶指南

目录 引言&#xff1a;新时代的函数表达 一、基础篇&#xff1a;语法与特性 1. 语法演进 2. 参数处理 3. 函数体形式 二、进阶特性深度解析 1. this绑定机制&#xff08;词法作用域&#xff09; 2. 不可构造特性 3. 与普通函数对比 三、实战应用场景 1. 数组高阶函数…

XML Schema 元素替换

XML Schema 元素替换 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。XML Schema 是一种用于定义 XML 文档结构的语言,它描述了 XML 文档的结构、数据类型和约束。在处理 XML 文档时,有时需要对特定的元素进行替换,以满足特定的需求。本文将介绍 XML Sch…

推理模型时代:大语言模型如何从对话走向深度思考?

一、对话模型和推理模型的区别概述 对话模型是专门用于问答交互的语言模型,符合人类的聊天方式,返回的内容可能仅仅只是一个简短的答案,一般模型名称后面会带有「chat」字样。 推理模型是比较新的产物,没有明确的定义,一般是指输出过程中带有<think>和</think&…

数据仓库与数据湖的协同工作:智慧数据管理的双引擎

数据仓库与数据湖的协同工作:智慧数据管理的双引擎 引言 在数据驱动的今天,企业和组织收集和存储的数据量正以惊人的速度增长。如何高效管理和利用这些数据,成为了决策者和技术专家的共同难题。为了解决这一问题,数据仓库(Data Warehouse)和数据湖(Data Lake)这两种技…

基于eBPF的全栈可观测性系统:重新定义云原生环境诊断范式

引言&#xff1a;突破传统APM的性能桎梏 某头部电商平台采用eBPF重构可观测体系后&#xff0c;生产环境指标采集性能提升327倍&#xff1a;百万QPS场景下传统代理模式CPU占用达63%&#xff0c;而eBPF直采方案仅消耗0.9%内核资源。核心业务的全链路追踪时延从900μs降至18μs&a…

【CS285】高斯策略对数概率公式的学习笔记

公式介绍 在【CS285】中提到了高斯策略对数概率公式的公式如下&#xff1a; log ⁡ π θ ( a t ∣ s t ) − 1 2 ∥ f ( s t ) − a t ∥ Σ 2 const \log \pi_{\theta}(\mathbf{a}_t | \mathbf{s}_t) -\frac{1}{2} \left\| f(\mathbf{s}_t) - \mathbf{a}_t \right\|_{\S…

图解MySQL【日志】——Binlog

Binlog&#xff08;Binary Log&#xff0c;归档日志&#xff09; 为什么需要 Binlog&#xff1f; Binlog 是 MySQL 中的二进制日志&#xff0c;用于记录数据库的所有写操作&#xff08;INSERT、UPDATE、DELETE 等&#xff09; 1. 主从复制 作用&#xff1a;是 MySQL 主从复…

Java 使用websocket

添加依赖 <!-- WebSocket 支持 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>添加配置类 Configuration public class WebSocketConfig {B…

进程的介绍--进程状态/切换

1.冯 • 诺依曼体系结构 1.1 体系结构 冯•诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯•诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#x…

百万架构师第三十七课:RabbitMq:高可用集群搭建步骤|JavaGuide

安装环境 Centos-7 三台虚拟机 192.168.8.150&#xff08;磁盘节点&#xff09; 192.168.8.45 &#xff08;内存节点&#xff09; 192.168.8.40 &#xff08;内存节点&#xff09;一、安装Erlang 1、erlang 下载地址&#xff1a; http://www.rabbitmq.com/releases/erlang…

Python开源项目月排行 2025年1月

#2025年1月2025年2月2日1DeepSeek-R1当红炸子鸡&#xff0c;国人之骄傲&#xff01;项目于 2025 年 1 月 20 日正式发布。早期的预览版&#xff08;如 DeepSeek-R1-Lite-Preview&#xff09;则在 2024 年 11 月 20 日亮相。 用途&#xff1a;DeepSeek-R1 是一个开源的推理模型&…

yolov8改进:efficientViT替换YOLOV8主干网络结构

6.1 efficientViT替换YOLOV8主干网络结构 6.1.1 effivientvit EfficientViT 的架构特点 EfficientViT 是一种结合了 Transformer 和卷积网络优点的轻量级模型&#xff0c;它的设计目标是高效地提取图像特征&#xff0c;同时减少计算量。以下是它的关键组成部分&#xff1a; …

Android Studio安装配置及运行

一、下载Android Studio 官网下载&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面&#xff0c;选择同意条款&#xff0c;并点击下载&#xff0c;如图&#xff1a; 二、详细安装 双击下载的文件 三、配置Android Studio …

OpenHarmony分布式数据管理子系统

OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化&#xff0c;以及跨设备之间数据的同步、…