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 可以用来实现互斥锁、条件变量、读写锁等同步原语。
相关推荐
律宏阔1 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔1 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴1 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千1 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei371 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei371 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei371 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW1 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW1 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux
yunwei371 小时前
eBPF 开发者教程: 简单的 XDP 负载均衡器
linux·后端·性能优化