c++ 网络编程 LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

本文介绍了进程与线程的概念,包括进程的五种状态以及线程与进程的区别。接着阐述了进程间通信的基本概念,通过实例展示了单向和双向传递。最后,基于多进程实现了一个回声服务端,能够将客户端的字符串保存到文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

锲子:进程与线程是什么,他们的区别在哪里:

1 进程概念

2 线程概念

3 进程、线程的区别与联系

一.进程间通信的基本概念

二.进程间通信的单向传递

三.进程间通信的双向传递

四.基于多进程的回声服务端实现


本网络编程入门系列博客是连载学习的,有对C/C++ Linux后台架构师学习体系感兴趣或者本身是工程师在学习准备进大厂的可以看我博客其他篇。

优快云https://mp.youkuaiyun.com/mp_blog/creation/editor/126432351


锲子:进程与线程是什么,他们的区别在哪里:

1 进程概念

进程是程序的一次动态执行过程。程序本身只是指令的集合,进程才是程序的真正运行,用户运行程序就产生了进程,用户关闭程序就结束了进程。一个程序可以产生多个进程,但一个进程只能由一个程序产生。进程有5种生命周期状态:创建、就绪、运行、阻塞、退出,下图表示了5种状态之间的关系。

添加图片注释,不超过 140 字(可选)

与上面的5种状态不同,在Linux中使用top命令查看进程也有5种状态,但它是以不同的角度来描述进程状态:

R:运行状态,正在运行或在运行队列中等待

S:可中断(自愿)的睡眠状态,在等待某事件发生才可唤醒。如网页服务器的httpd进程,在客户端(浏览器)发出请求之前,服务器无事可做,选择睡眠。是程序角度的睡眠,程序本身控制自己的运行状态

D:不可中断(非自愿)的睡眠状态,有时两个进程试图同时访问同一系统资源,例如一个进程试图从磁盘数据块上读取信息,而另一个进程正在向该数据块写入信息。在这种情况下,内核迫使进程进入非自愿睡眠状态,该进程并没有自愿选择睡眠。当资源被释放时,内核会唤醒进程并将其设置为可运行状态。虽然进程断的进入和离开非自愿睡眠,但是它们通常不会在该状态停留太久。因此,除了在高负荷的系统上,用户通常看不到处于非自愿睡眠状态的进程。

T:停止或跟踪状态,进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行

Z:僵死状态,子进程先于父进程退出,同时父进程又没有调用wait()或waitpid(),则该子进程将成为僵尸进程。为了防止产生僵尸进程,在fork子进程之后我们都要在父进程wait它们


2 线程概念

早期的计算机系统只有进程,没有线程,后来发现进程切换的开销有点大,于是产生了线程(也称轻量级进程),线程切换比进程切换的开销要小很多。线程是程序执行中一个单一的顺序控制流,是程序执行流的最小单元,是处理器调度和分派的基本单位,是进程中代码的不同执行路线,一个进程可以有多个线程。 现在的处理器一般是双核或四核的,每个处理核心对应一个内核线程,但是我们经常看到双核心四线程或四核心八线程的描述,这其实是采用了超线程技术将一个物理处理核心模拟成两个逻辑处理核心,对应两个内核线程,所以采用了超线程技术的CPU在操作系统中看到的CPU数量是实际物理CPU数量的两倍。这里讲到了内核线程,内核线程(Kernel Thread, KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。而用户程序一般是创建用户线程,然后用户线程调用内核线程,在现在流行的操作系统中,用户线程和内核线程是多对多的映射调用关系。


3 进程、线程的区别与联系

一个程序至少产生一个进程,一个进程至少产生一个线程,线程再映射到内核线程,在处理器上完成计算任务。 进程与线程的区别,关键就在于它们独立拥有的资源不同,因此就体现出了不同的特性,主要有以下几方面的不同: (1)资源 进程作为除CPU以外系统资源的分配单位,每个进程都拥有独立的地址空间和资源,因此一个进程崩溃不会引起其他进程的运行,就好像是不同程序创建的不同进程互不影响一样; 线程作为CPU的分配单位,是被系统独立调度和分派的基本单位,本身仅拥有CPU中的寄存器和线程函数调用需要的堆栈区这一点点资源,其他资源如代码、公有数据、文件描述符等都是与其他线程共享的进程资源,所以一个线程崩溃,整个进程都崩溃。 (2)系统开销 由于每个进程都拥有独立的地址空间和资源,因此进程的创建和撤销都需要资源的分配和回收,系统开销大; 每个线程仅仅拥有一点必不可少的资源,所以创建和撤销都很快。 (3)通信方式 进程之间主要有6种通信方式:管道、信号、消息队列、共享内存、信号量、socket; 线程之间主要有3种通信方式:锁机制(包括互斥锁、条件变量、读写锁)、信号量机制、信号机制。 线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。 通信方式的内容写得不够详细,后续再补充,下面这些是暂时记录的内容:

信号量:一个初始值为N的信号量允许N个线程并发访问。线程访问资源时首先获取信号量锁,进行如下操作: 1. 将信号量的值减1; 2. 如果信号量的值小于0,则进入等待状态,否则继续执行; 访问资源结束之后,线程释放信号量锁,进行如下操作: 1. 将信号量的值加1; 2. 如果信号量的值小于1(等于0),唤醒一个等待中的线程; 同步:多个事件一起开始,一起结束(一刀切); 异步:多个事件各走各的,完成了通知一下控制中心&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值