Linux基础 -- 进程间通讯概览

Linux Kernel 进程间通信研究项

进程间通信(IPC)是 Linux 内核进程管理中的重要组成部分,提供了多个进程之间交换数据和同步执行的机制。以下是需要研究的进程间通信的细分项:

1. 信号(Signals)

信号是一种异步通信机制,用于通知进程发生某些事件,如异常、定时器到期或用户输入。

  • 常用信号类型
    • SIGKILL:强制终止进程,无法被捕获或忽略。
    • SIGTERM:请求终止进程,进程可以捕获该信号并进行清理。
    • SIGSTOP:停止进程的执行。
    • SIGCHLD:子进程终止或状态变化时发送给父进程。
  • 信号处理机制
    • 信号处理程序:通过 signal()sigaction() 函数注册信号处理函数。
    • 信号屏蔽:使用 sigprocmask() 函数屏蔽或解屏信号。
    • 信号队列:实时信号可通过信号队列传递额外的信息。

2. 管道和命名管道(Pipes and Named Pipes)

管道是 Unix 风格的进程间通信机制,允许一个进程写入数据,另一个进程读取数据。

  • 匿名管道
    • 通过 pipe() 系统调用创建,只能在父子进程或兄弟进程之间使用。
    • 通常用于短期通信。
  • 命名管道(FIFO)
    • 通过 mkfifo() 系统调用创建,存在于文件系统中,任何进程都可以通过路径名访问。
    • 适合无亲缘关系的进程间通信。

3. 消息队列(Message Queues)

消息队列允许进程以消息为单位进行通信,并可以为消息设置优先级。

  • System V 消息队列
    • 通过 msgget()msgsnd()msgrcv() 等系统调用进行操作。
    • 消息队列具有消息的结构化格式,支持对消息的优先级排序。
  • POSIX 消息队列
    • 提供与 System V 类似的功能,但通过文件描述符进行操作,具备实时性和可靠性。
    • 支持异步通知和消息通知机制。

4. 共享内存(Shared Memory)

共享内存是最快的 IPC 机制之一,允许多个进程直接访问同一块内存,从而实现高速的数据交换。

  • System V 共享内存
    • 通过 shmget()shmat()shmdt() 系统调用分配和操作共享内存。
    • 进程必须使用同步机制(如信号量)来避免竞态条件。
  • POSIX 共享内存
    • 通过文件描述符来映射共享内存,使用 shm_open()mmap() 进行内存映射。
    • 简化了内存分配和释放的过程。

5. 信号量(Semaphores)

信号量是一种用于进程同步的机制,确保多个进程在访问共享资源时不会发生冲突。

  • System V 信号量
    • 提供信号量集(多个信号量),通过 semget()semop()semctl() 操作信号量。
    • 通常与共享内存结合使用,防止并发访问带来的问题。
  • POSIX 信号量
    • 提供简单的计数信号量,分为有名信号量(通过 sem_open() 创建)和无名信号量(在进程间使用共享内存传递)。

6. 套接字(Sockets)

套接字不仅用于网络通信,还可以用于本地进程间通信,尤其是使用 Unix 域套接字。

  • Unix 域套接字
    • 通过 socket()bind()listen()accept()connect() 系统调用操作。
    • 支持数据流和数据报两种通信模式。
    • 适合大规模数据传输和复杂交互,尤其适用于本地进程间通信。
  • TCP/UDP 套接字
    • 常用于跨网络通信,但也可以用于同一主机内的进程间通信。
    • 提供可靠的面向连接的通信(TCP)或无连接的通信(UDP)。

Netlink 是 Linux 内核提供的一种特殊套接字,用于在用户空间与内核空间之间进行通信。

  • 使用场景
    • 通常用于网络子系统,支持路由、设备配置等。
    • 用户进程可以通过 Netlink 套接字与内核模块通信,获取系统状态或配置系统资源。
  • Netlink API
    • 使用 socket()sendmsg()recvmsg() 系统调用与内核交换消息。

8. Futex(Fast Userspace Mutexes)

Futex 是一种轻量级的用户空间锁机制,允许在用户空间处理大部分的锁操作,只有在发生冲突时才进入内核。

  • 原理
    • 使用共享内存中的整数变量作为锁,进程通过 futex() 系统调用在用户态和内核态之间切换。
    • 高效且适用于高性能多线程程序中的进程同步。
  • 常见用法
    • Futex 可以用来实现互斥锁、条件变量、读写锁等同步原语。
相关推荐
朝九晚五ฺ2 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream2 小时前
Linux的桌面
linux
xiaozhiwise3 小时前
Makefile 之 自动化变量
linux
意疏5 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu5 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿5 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
我的K84097 小时前
Flink整合Hudi及使用
linux·服务器·flink
1900437 小时前
linux6:常见命令介绍
linux·运维·服务器
Camellia-Echo7 小时前
【Linux从青铜到王者】Linux进程间通信(一)——待完善
linux·运维·服务器