首先讲了进程和线程区别

然后讲解 管道和套接字,它是进程间通信的方式

接着讲解共享变量 ,它是线程间通信

最后讲解TCP三次握手,因为套接字使用了TCP协议

一、线程和进程的区别

线程(Thread)和进程(Process)是操作系统中并发执行的两个基本单位。它们都可以执行任务,但作用范围和资源管理方式不同。


🧩 一张对比表快速理解

比较项进程(Process)线程(Thread)
基本定义系统资源分配的最小单位CPU调度的最小单位(属于进程)
是否独立相互独立,拥有各自内存空间同一进程下线程共享内存空间
资源占用占用资源较多(独立地址空间)占用资源少(共享进程资源)
通信方式进程间通信(IPC)复杂(如管道、socket)线程间通信简单(共享变量)
创建销毁代价创建和销毁开销大开销相对小
崩溃影响一个进程崩溃不会影响其他进程一个线程崩溃可能影响整个进程
举例Chrome每个标签页一个进程Chrome标签页中的多个脚本线程


🔧 举个例子说明

想象你开了一家餐厅:

  • 一个进程就像一个餐厅,彼此独立。

  • 一个线程就像餐厅里的服务员(共享厨房、菜单、收银台)。

你开的多个餐厅之间(进程)是互不影响的,但一个餐厅中的多个服务员(线程)可以一起服务,但他们共享资源,配合更紧密。


📦 编程角度理解

  • 在 Java、Python、Node.js 中,我们可以通过 thread, child_process, worker_threads 创建线程或进程。

Node.js 中示例

// 创建子进程
const { fork } = require('child_process');
fork('child.js');// 创建线程(Node.js 10+)
const { Worker } = require('worker_threads');
new Worker('./worker.js');

📌 总结记忆口诀

“进程是房子,线程是房间”
一个进程里可以有多个线程,但线程不能脱离进程单独存在。


如果你在学 Node.js、Java 或 Python 并发模型,我可以分别帮你分析线程/进程的用法和适用场景。需要我进一步展开哪门语言下的实践案例?

二、进程间通信中管道是什么

在操作系统中,管道(Pipe)是一种常见的进程间通信(IPC, Inter-Process Communication)机制,允许一个进程把数据发送给另一个进程,就像水流通过水管一样。


🧱 一句话解释

管道就是一个连接两个进程的通信通道,一个进程写入数据,另一个进程读取数据。


🧠 管道的原理

  • 管道本质上是一个内核缓冲区(FIFO 队列)

  • 写端写入数据 → 内核缓冲 → 读端读取数据

  • 半双工通信(数据只能单向流动)。


📦 管道的类型

类型说明
匿名管道父子进程间通信(只能在具有亲缘关系的进程间使用)
命名管道 FIFO允许无亲缘关系的进程通信,有名称(文件路径),位于文件系统中


🔧 举例(Node.js)

匿名管道(spawn 使用标准输入输出)

const { spawn } = require('child_process');const child = spawn('node', ['-e', `process.stdin.pipe(process.stdout)`]);child.stdin.write('Hello from parent!\n');
child.stdin.end();
child.stdout.on('data', data => {console.log(`Child says: ${data}`);
});

命名管道(Linux Bash 示例)

# 创建命名管道
mkfifo mypipe# 一个终端:向管道写入
echo "Hello" > mypipe# 另一个终端:从管道读取
cat < mypipe

🚦 特点和限制

  • ✅ 进程间数据共享,快速。

  • ✅ 管道通信不需要借助中间文件。

  • ❌ 匿名管道只能用于父子进程。

  • ❌ 半双工通信(除非建立两个管道)。

  • ❌ 不能跨网络使用(仅限本地进程)。


✅ 常见应用场景

  • Shell 中的命令管道(ls | grep txt

  • 父子进程间传递数据(如 Node.js 中子进程通信)

  • 轻量级、无锁通信场景


💬 总结口诀

匿名管道亲缘深,命名管道通陌生;写端数据流向读,半双工最常见。


如果你想知道在 Java、C/C++、Python 中怎么实现管道通信,也可以举例说明。是否需要我给出跨语言的管道实现?

三、进程间通信socket是什么

在操作系统中,Socket(套接字)是最强大、最灵活的进程间通信(IPC)机制之一,它不仅能实现本地通信,还能支持网络通信(跨主机)


🧠 一句话解释

Socket 就是一种通信端点,用于两个进程之间发送和接收数据,无论这两个进程是在同一台机器上,还是在不同主机上。


🏗️ 工作原理

Socket 通信的基本模型是 客户端-服务器(Client-Server)模型

  1. 服务器进程监听某个地址(IP + 端口)。

  2. 客户端进程主动连接这个地址。

  3. 双方建立连接后就可以双向通信(全双工)。


📦 套接字类型(按通信范围)

类型范围示例说明
本地套接字同一台机器上通信Unix Domain Socket(文件路径)
网络套接字跨主机通信TCP/IP、UDP 套接字


🔧 Node.js 中的 Socket 通信示例

1. 本地通信(UNIX Socket)

// server.js
const net = require('net');
const server = net.createServer((socket) => {socket.on('data', (data) => {console.log('Server received:', data.toString());});
});
server.listen('/tmp/mysocket');  // 本地 socket 文件
// client.js
const net = require('net');
const client = net.createConnection('/tmp/mysocket', () => {client.write('Hello from client');
});

2. 网络通信(TCP Socket)

// tcp-server.js
const net = require('net');
const server = net.createServer((socket) => {console.log('Client connected');socket.on('data', (data) => {console.log('Server received:', data.toString());socket.write('pong');});
});
server.listen(3000);
// tcp-client.js
const net = require('net');
const client = net.createConnection(3000, 'localhost', () => {client.write('ping');
});
client.on('data', (data) => {console.log('Client received:', data.toString());
});

🚦 特点

特性描述
📡 通用性强本地通信、远程通信都可用
🔁 全双工可以双向同时读写
📁 文件描述符在类 UNIX 系统中 Socket 是一种特殊的文件描述符
🔐 可配加密可以集成 TLS/SSL 实现安全通信(HTTPS、WSS 等)
🧱 适合复杂通信比如多客户端并发、长连接、大数据传输等


🆚 与其他通信方式对比

通信方式是否跨主机是否双向应用难度性能常见用途
管道 pipe❌ 本地🚫 半双工简单父子进程简单数据传输
消息队列❌ 本地多进程异步通信
Socket✅ 本地+远程✅ 全双工✅ 复杂中-高服务端、网络通信
共享内存❌ 本地复杂⚡ 极快高性能数据交换


🧪 Socket 常用场景

  • 本地服务与客户端通信(如数据库客户端)

  • 网络服务(Web Server、Chat Server)

  • 微服务间通信(配合 TCP/HTTP)

  • 实时推送(WebSocket)


✅ 总结口诀

Socket 是个洞,进程互打通。可远程可本地,网络通信最通用。


如果你想继续了解:

  • UDP socketTCP socket 区别

  • WebSocket 和原始 socket 的差异

  • socket.io 使用实例(前后端实时通信)

可以告诉我,我可以一并讲清楚。

四、TCP三次握手

我们从原理到实战场景全面讲清楚 TCP 三次握手(Three-way Handshake),并且深入探讨你提到的重点问题:“是否可以省略第三次握手?


🔍 一、什么是 TCP 三次握手?

三次握手是建立 TCP 连接时客户端和服务器之间必须进行的 三步通信流程,确保双方都具备发送和接收能力,才能正式开始数据传输。


🧠 二、三次握手详解(图 + 文)

 

lua

复制编辑

客户端 服务端 | ------ SYN -------> | (第一次握手:客户端发起请求) | <----- SYN-ACK -----| (第二次握手:服务端确认并回应) | ------ ACK ------->| (第三次握手:客户端确认)

✅ 第一次握手(客户端 → 服务端)

  • 客户端发送一个带 SYN 标志的数据包。

  • 表示:“我要连接你,并且我能发送数据了。”

  • 此时客户端进入 SYN_SENT 状态。

✅ 第二次握手(服务端 → 客户端)

  • 服务端收到 SYN 后,确认客户端能发送。

  • 回复一个带 SYN+ACK 标志的包。

  • 表示:“我知道你要来,我也可以发送数据。”

  • 服务端进入 SYN_RECEIVED 状态。

✅ 第三次握手(客户端 → 服务端)

  • 客户端收到 SYN+ACK 后,再发一个 ACK

  • 表示:“我知道你也准备好了,我们开始吧!”

  • 此时双方进入 ESTABLISHED 状态,连接建立成功。


📌 三次握手的目的总结

目的举例
✅ 确保客户端能发送第一次握手
✅ 确保服务端能接收并能发送第二次握手
✅ 确保客户端能接收第三次握手


❓是否可以省略第三次握手?

不能省略。

原因:

  1. 如果省略,服务端无法确认客户端“收到了”自己的 SYN+ACK

  2. 网络不稳定或中间设备重发,可能导致服务端误以为连接成功,出现半连接(SYN Flood 漏洞)

  3. TCP 协议设计就是为了防止这种“单向认为建立连接”的问题。


🧪 示例场景:省略第三次握手会怎么样?

  • 客户端发了 SYN,服务端发了 SYN+ACK,但客户端没有发 ACK 就宕机了

  • 如果不等待第三次握手:

    • 服务端误以为连接建立。

    • 客户端其实已经没了。

    • 服务端一直占用连接资源,白白浪费(资源泄漏)。


🧱 补充:SYN Flood 攻击

攻击者连续伪造 IP 发送 SYN 包,但不发送第三次 ACK。

  • 服务端进入 SYN_RECEIVED,等待 ACK 却等不到,连接被挂起。

  • 持续攻击会让服务端连接数爆满,无法为正常用户服务。

解决方案:

  • 使用 SYN Cookie 技术。

  • 连接队列限制。


✅ 总结口诀

三次握手不多余,确认彼此都OK。缺一不可防欺骗,少了连接不安全。


如果你还想进一步了解:

  • 四次挥手断开连接机制

  • TCP 状态转换图(如 TIME_WAIT, CLOSE_WAIT

  • 和 HTTP 的握手区别(如 HTTP/1.1 vs HTTP/2)

我可以继续为你展开。

五、子进程和主进程区别和API

在 Node.js 中,子进程(child process)用于执行一个独立的任务或运行另一个程序,与主进程并行执行、互不干扰。这是 Node 在单线程模型中实现多任务处理(并发/并行)的常用手段。


🧠 一、主进程 vs 子进程 的区别

对比项主进程子进程
启动方式node 直接启动主进程通过 child_process 模块创建
内存空间独立进程,拥有自己的内存空间也是独立的,和主进程不共享内存(需显式通信)
执行上下文当前运行的 Node.js 文件和上下文可运行任意 Node.js 文件或外部命令
是否共享事件循环❌ 不共享事件循环每个子进程有自己的事件循环
通信方式-通过 IPC(进程间通信)或标准输入输出
错误影响主进程出错影响全局子进程崩溃不影响主进程,反之亦然


🚀 二、创建子进程的 4 个核心 API(child_process 模块)

你需要通过:

const child_process = require('child_process');

进行调用。


1️⃣ exec(command[, options], callback)

  • 用于执行一个命令行命令,适合处理结果较小的任务。

  • 会将子进程的输出(stdout 和 stderr)缓存在内存中,传给回调函数。

const { exec } = require('child_process');exec('ls -la', (err, stdout, stderr) => {if (err) {console.error('错误:', err);return;}console.log('标准输出:', stdout);
});

2️⃣ execFile(file[, args][, options][, callback])

  • 直接执行一个可执行文件(比如 .exe, .sh, .py),不会通过 shell 解析

  • 安全性更高、性能更好,适用于直接调用程序文件

const { execFile } = require('child_process');execFile('node', ['--version'], (err, stdout) => {if (err) throw err;console.log('Node 版本是:', stdout);
});

3️⃣ spawn(command[, args][, options])

  • 更底层,适合**处理大数据流(持续输出)**的子进程。

  • 返回一个 ChildProcess 对象,你可以用 stdout.on('data') 来获取数据。

const { spawn } = require('child_process');const child = spawn('ping', ['baidu.com']);child.stdout.on('data', (data) => {console.log(`输出:${data}`);
});child.stderr.on('data', (data) => {console.error(`错误:${data}`);
});child.on('close', (code) => {console.log(`子进程退出码:${code}`);
});

4️⃣ fork(modulePath[, args][, options])

✅ 专为 Node.js 脚本间的多进程通信而设计,默认通过 IPC 通信(process.send()message 事件)。

// parent.js
const { fork } = require('child_process');
const child = fork('./child.js');child.send({ msg: 'Hello from parent!' });child.on('message', (msg) => {console.log('父进程接收:', msg);
});
// child.js
process.on('message', (msg) => {console.log('子进程接收:', msg);process.send({ reply: 'Got it!' });
});

✅ 三、适用场景对比总结

API适合场景是否支持通信是否缓冲输出
exec简单命令 + 小输出结果✅(内存缓存)
execFile运行本地程序、脚本
spawn处理持续输出(如视频转码)❌(流式处理)
forkNode 之间多进程通信


🔧 四、如何终止子进程?

使用:

child.kill(); // 默认发送 SIGTERM 信号

📦 五、补充推荐阅读

  • 官方文档:https://nodejs.org/api/child_process.html

  • Node.js进程模型分析文章

  • Node.js高级编程书籍中的“多进程架构”


需要我结合实战:比如用子进程处理图片压缩、日志分析、CPU 密集计算等例子吗?或者再带你写一个完整的 fork 通信项目也可以。

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

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

相关文章

docker(学习笔记第一课) 使用nginx +https + wordpress

文章目录 docker(学习笔记第一课) 使用nginx https wordpress学习内容&#xff1a;1. 整体架构1.1 在aws ec2的整体架构1.2 不懂都可以问AI 2. 构建详细2.1 构建ec22.2 安装docker2.3 创建一个docker的内部network2.4 创建wordpress使用的mysql数据库2.5 创建两个wordpress的d…

Leetcode 刷题记录 15 —— 二分查找

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答&#xff0c;01~07为C语言&#xff0c;08及以后为Java语言。 01 搜索插入位置 class Solution {pub…

C++核心编程(动态类型转换,STL,Lanmda)

一. 类型转换 二. STL 1. 容器 1.1 Vector&#xff08;常用&#xff09; 1.1.1 概述 特性&#xff1a; 动态数组&#xff1a; 想象成一个会自动变长变短的数组。起始在内存中是连续存储的。 随机访问&#xff1a; 通过[]运算符或at()方法&#xff0c;可以瞬间&#xff08;…

【图像处理入门】8. 数学基础与优化:线性代数、概率与算法调优实战

摘要 图像处理的核心离不开数学工具的支撑。本文将深入解析线性代数、概率论在图像领域的应用,包括矩阵变换与图像几何操作的关系、噪声模型的数学描述,以及遗传算法、粒子群优化等智能算法在参数调优中的实践。通过理论结合代码案例,帮助读者掌握从数学原理到工程优化的完…

操作系统八股文

一.进程和线程的区别 1.本质区别和所属关系是什么&#xff1f; 进程是资源调度以及分配的基本单位。 线程是CPU调度的基本单位。 一个线程属于一个进程&#xff0c;一个进程可以拥有多个线程。 2.地址空间和内存 进程拥有独立的虚拟地址空间。 线程没有独立的地址空间&#xf…

【uniapp】小程序中input输入框的placeholder-class不生效

解决方法 1.去掉scoped <style></style> 2.额外写一组style </style lang"scss" scoped> </style> <style> ::v-deep .textarea-placeholder { font-size: 24rpx; font-weight: 400; …

大模型训练与推理显卡全指南:从硬件选型到性能优化

在人工智能技术飞速发展的今天&#xff0c;大型语言模型(LLM)已成为推动行业进步的核心动力。然而&#xff0c;训练和部署这些“数字巨人”需要强大的计算基础设施作为支撑&#xff0c;其中GPU的选择直接决定了模型开发的效率与成本。本文将全面剖析当前主流GPU型号在大模型训练…

Linux Docker的环境配置与简单使用

参考资料 Windows Docker Desktop设置中文【Docker 】Docker Desktop for Windows&#xff08;WSL 2&#xff09;安装WSL 2 上的 Docker 远程容器入门 目录 一. 环境配置1.1 安装WSL1.2 安装配置 Docker Desktop1.3 VS Code 插件安装1.4 下载项目&#xff0c;配置Dockerfile 二…

函数指针与指针函数:本质区别与高级应用

目录 一、概念本质解析 1. 函数指针&#xff08;Function Pointer&#xff09; 2. 指针函数&#xff08;Pointer Function&#xff09; 二、函数指针深度剖析 1. 基础用法示例 2. 高级应用&#xff1a;回调函数 3. 函数指针数组 三、指针函数深入探讨 1. 基础实现模式 …

【python】基于pycharm的海康相机SDK二次开发

海康威视二次开发相机管理 这段代码基于python开发的&#xff0c;用了opencv的一些库函数。实现了一个完整的海康机器人相机管理工具&#xff0c;支持多相机连接、参数配置、图像采集和实时显示功能。目前USB相机测试无误&#xff0c;除了丢一些包。 1. 主要类结构 HKCameraM…

HTTP 协议各个主要版本的功能特点、核心原理、使用场景总结

我们来系统总结一下 HTTP 协议各个主要版本的功能特点、核心原理&#xff08;用图示辅助说明&#xff09;以及典型使用场景。 核心演进目标&#xff1a; 提升性能、安全性、效率和灵活性。 1. HTTP/0.9 (1991) - 远古雏形 功能特点: 极其简单&#xff1a; 只支持 GET 方法。无…

Linux编程:3、进程通信-信号

一、进程通信概述 &#xff08;一&#xff09;进程通信的目的 在企业开发中&#xff0c;一个项目常常需要多个进程共同协作&#xff0c;而这些进程之间需要进行通信&#xff08;交换信息&#xff09;以便协作。本章内容主要围绕信号讲解&#xff0c;其它进程通信的常用方式请…

深度解析Vue.js组件开发与实战案例

一、Vue.js组件化思想 Vue.js的核心思想之一就是组件化开发。组件系统是Vue的一个重要概念,它允许我们使用小型、独立和通常可复用的组件构建大型应用。在Vue中,组件本质上是一个拥有预定义选项的Vue实例。 1.1 为什么需要组件化 代码复用:避免重复造轮子,提高开发效率可…

TensorFlow 2.0 与 Python 3.11 兼容性

TensorFlow 2.0 与 Python 3.11 兼容性 TensorFlow 2.0 官方版本对 Python 3.11 的支持有限&#xff0c;可能出现兼容性问题。建议使用 TensorFlow 2.10 或更高版本&#xff0c;这些版本已适配 Python 3.11。若需强制运行&#xff0c;可通过以下方式解决依赖冲突&#xff1a; …

MyBatisPlus 全面学习路径

MyBatisPlus 全面学习路径 学习目录 第一部分&#xff1a;MyBatisPlus 基础 MyBatisPlus 简介与核心特性快速入门与环境搭建核心功能&#xff1a;BaseMapper 与 CRUD 接口条件构造器&#xff08;Wrapper&#xff09;详解ActiveRecord 模式主键策略与通用枚举 第二部分&…

React16,17,18,19更新对比

文章目录 前言一、16更新二、17更新三、18更新四、19更新总结 前言 总结react 16&#xff0c;17&#xff0c;18&#xff0c;19所更新的内容&#xff0c;并且部分会涉及到原理讲解。 一、16更新 1、在16.8之前更新&#xff0c;还是基于class组件的升级和维护更新。并且更新了一…

【git】有两个远程仓库时的推送、覆盖、合并问题

当你执行 git pull origin develop(或默认的 git pull)时,Git 会把远端 origin/develop 的提交合并到你本地的 develop,如果远端已经丢掉(或从未包含)你之前在私库(priv)里提交过的改动,那这些改动就会被「覆盖」,看起来就像「本地修改没了」。 要解决这个问题,分…

Spring Boot 集成国内AI,包含文心一言、通义千问和讯飞星火平台实战教程

Spring Boot 集成国内AI&#xff0c;包含文心一言、通义千问和讯飞星火平台实战教程 一、项目结构二、添加Maven依赖三、配置API密钥 (application.yml)四、配置类1. AI配置类 (AiProperties.java)2. 启用配置类 (AiConfig.java) 五、服务层实现1. 文心一言服务 (WenxinService…

Elastic Search 学习笔记

1. Elasticsearch 是什么&#xff1f;有哪些应用场景&#xff1f; Elasticsearch 整体原理流程&#xff1f; Elasticsearch 是一个为海量数据提供近实时搜索和分析能力的分布式搜索引擎&#xff0c;广泛应用于全文检索、日志分析和大数据处理场景中。 Elasticsearch 整体原理…

动态规划之斐波那契数(一)

解法一&#xff1a;递归 class Solution { public:int fib(int n) {if(n<2) return n;return fib(n-1)fib(n-2);} }; 解法二&#xff1a;dp class Solution { public:int fib(int N) {if (N < 1) return N;int dp[2];dp[0] 0;dp[1] 1;for (int i 2; i < N; i) {…