Unix进程间通信之简介-总体概述和引子

2023-12-18 22:28

本文主要是介绍Unix进程间通信之简介-总体概述和引子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录标题

  • 0. 前言
  • 1. 概述
  • 2. 进程、线程与信息共享
  • 3. IPC对象的持续性
  • 4. 名字空间
  • 5. fork、exec和exit对IPC对象的影响
  • 6. 出错处理: 包裹函数
  • 7. Unix标准
  • 8. 小结

0. 前言


进程间通信这块是学习linux-c编程的关键, 这篇为后续进程间通信技术的引子篇,后续讲到单独的某一个系统调用 都附该引用。

1. 概述


IPC是进程间通信(interprocess communication)的简称。系统上不同进程之间消息传递(message passing)的方式。
共享内存需要某种实行的
同步
(synchronization)参与运作。

发展阶段。

  • 管道(pipe) 是第一个广泛使用的IPC形式, 使用在Kernel之上的(应用程序或shell)。

    • 问题在于智能父子进程之间使用。
    • 解决方案是FIFO(无名管道)。
  • System V消息队列(System V message queue)

    • 用在同一主机上有亲缘关系或无亲缘关系的进程之间。
    • 大多数版本的Unix都支持。

    有亲缘关系不仅指父子,还包含子子关系,比如fork两次,派生2个子进程。
    所有Unix进程与init进程都有亲缘关系。

  • Posix消息队列

  • 远程过程调用(Remote Procedure Call, RPC)

    • 20世纪80年代中期,它是从一个系统(客户端主机)上某个程序调用另外一个系统(服务器主机)上某个函数的一种方法,是作为显式网络编程的一种替代方法开发的。

同步演变

  • 需要某种同步形式(往往是为了防止多个进程同时修改同一文件)的早期程序使用了文件系统的诡秘特性。
  • 记录上锁(record locking) 1988年由Posix.1标准化。
  • System V信号量(System V semaphore)是System V消息队列加上System V内核的同事伴随System V共享内存(System V shared memory)加入的。
  • Posix信号量(Posix semaphore)和Posix共享内存也由Posix实时标准加入。
  • 互斥锁(mutex)和条件变量(condition variable)是由Posix线程标准定义的两种同步形式。尽管往往用于线程间的同步,他们也能提供不同进程间的同步。
  • 读写锁(read-write lock)是另一种形式的同步。

2. 进程、线程与信息共享


在这里插入图片描述

按照传统的Unix编程模型,我们在一个系统上运行多个进程,每个进程都有各自的地址空间。Unix进程间的信息共享可以有多个方式:
1)左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息,每个进程都得穿越内核(例如read,write, lseek等)。当一个文件有待更新时,某种形式的同步是必要的,这样即可保护多个写入者,防止相互干扰,也可保护一个或多个读出者,防止写入者的干扰。
2)中间的两个进程共享驻留于内核中的某些信息。管道是这种共享类型的一个例子,System V消息队列和System V 信号量也是。现在访问共享信息的每次操作涉及对内核的一次系统调用。
3)右边的两个进程有一个双方都能访问的共享内存区。每个进程一旦设置好该共享内存区,就能根本不涉及内核而访问其中的数据。共享该内存区的进程需要某种形式的同步。
注意没有任何东西限制任何IPC技术只能使用两个进程。我们讲述的技术适用于任意数目的进程。

线程
虽然Unix系统中进程的概念已使用很久,一个给定进程中多个线程(thread)的概念却相对较新。Posix.1线程标准 (称Pthreads)是于1995年通过的。从IPC角度看来,一个给定进程内的所有线程共享同样的全局变量。
然而我们必须关注的是各个线程间对全局数据的同步访问。同步尽管不是一种明确的IPC形式,但它确实伴随许多形式的IPC使用, 以控制对某些共享数据的访问。

3. IPC对象的持续性


我们可以把任意类型的IPC的持续性(persistence)定义成该类型的一个对象一直存在多长时间。以下展示了三种类型的持续性。
在这里插入图片描述

  • 随进程持续的(process-persistent) , 例如管道和FIFO就是这种对象。
  • 随内核持续的(kernel-persisten) 例如System V的消息队列,信号量和共享内存区就是该类对象。Posix的消息队列,信号量和共享内存必须至少是随内核持续的,但也可以是随文件系统持续的,具体取决于实现。
  • 随文件系统持续的(filesystem-persistent)。 Posix消息队列,信号量和共享内存如果是使用映射文件实现的(不是必需条件),那么他们就是随文件系统持续的。
    在定义一个IPC对象的持续性时我们必须小心,因为它并不总是像看起来的那样。例如管道内的数据是在内核中维护的,但管道具备的是随进程的持续性而不是随内核的持续性:最后一个将某个管道打开着用于读的进程关闭该管道后,内核将丢弃所有的数据并删除该管道。类似的,尽管FIFO在文件系统中有名字,他们也只是具备随进程的持续性,因为最后一个将某个FIFI打开着的进程关闭该FIFI后,FIFI中的数据将被丢弃。
IPC类型持续性
管道随进程
FIFO随进程
Posix互斥锁随进程
Posix条件变量随进程
Posix读写锁随进程
fcntl记录锁随进程
Posix消息队列随内核
Posix有名信号量随内核
Posix基于内存的信号量随进程
Posix共享内存区随内核
System V消息队列随内核
System V信号量随内核
System V共享内存区随内核
TCP套接字随进程
UDP套接字随进程
Unix域套接字随进程

注意该列表中没有任何类型的IPC具备随文件系统的持续性,但是我们说过有三种类型的Posix IPC可能会具备该持续性, 这取决于它们的实现。显然,向一个文件写入数据提供了随文件系统的持续性,但这通常不作为一种IPC形式使用。多数形式的IPC并没有在系统重新自举后继续存在的打算,因为进程不可能跨越重新自举继续存活。对于一种给定形式的IPC,要求它具备随文件系统的持续性可能会将其性能降低,而IPC的一个基本的设计目标是高新能。

4. 名字空间


  • 当两个或多个无亲缘关系的进程使用某种类型的IPC对象来彼此交换信息时,该IPC对象必须有一个某种形式的名字或标识符,这样其中一个进程(往往是服务器)可以创建该IPC对象,其余进程则可以指定同一个IPC对象。
  • 管道没有名字,因为不能用于无亲缘关系的进程间,但是FIFO有一个在文件系统中的Unix路径名作为其标识符(因此可用于无亲缘关系的进程间)。对于一种给定的IPC类型,其可能的名字的集合称为它的名字空间。名字空间非常重要,因为对于除普通管道以外的所有形式的IPC来说,名字是客户与服务器彼此连接以交换消息的手段。
IPC类型用于打开或创建IPC的名字空间IPC打开后的标识Posix.1 1996Unix98
管道没有名字描述符**
FIFO路径名描述符**
Posix互斥量没有名字pthread_mutex_t指针**
Posix条件变量没有名字pthread_cond_t指针**
Posix读写锁没有名字pthread_rwlock_t指针*
fcntl记录上锁路径名描述符**
Posix消息队列Posix IPC名字mqd_t值**
Posix有名信号量Posix IPC名字sem_t指针**
Posix基于内存的信号量没有名字sem_t指针**
Posix共享内存区Posix IPC名字描述符**
System V消息队列key_t键System V IPC标识符*
System V 信号量key_t键System V IPC标识符*
System V共享内存区key_t键System V IPC标识符*
路径名描述符
Sun RPC程序/版本RPC句柄
TCP套接字IP地址与端口描述符.1g*
UDP套接字ip和端口描述符.1g*
Unix域套接字路径名描述符.1g*

尽管Posix.1标准化了信号量,他们依然是可选的。

5. fork、exec和exit对IPC对象的影响


6. 出错处理: 包裹函数


7. Unix标准


8. 小结


这篇关于Unix进程间通信之简介-总体概述和引子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509972

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

rust 中的 EBNF简介举例

《rust中的EBNF简介举例》:本文主要介绍rust中的EBNF简介举例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 什么是 EBNF?2. 核心概念3. EBNF 语法符号详解4. 如何阅读 EBNF 规则5. 示例示例 1:简单的电子邮件地址

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与