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)。
 
7. Netlink 套接字(Netlink Sockets)
Netlink 是 Linux 内核提供的一种特殊套接字,用于在用户空间与内核空间之间进行通信。
- 使用场景 :
- 通常用于网络子系统,支持路由、设备配置等。
- 用户进程可以通过 Netlink 套接字与内核模块通信,获取系统状态或配置系统资源。
 
- Netlink API :
- 使用 socket()和sendmsg()、recvmsg()系统调用与内核交换消息。
 
- 使用 
8. Futex(Fast Userspace Mutexes)
Futex 是一种轻量级的用户空间锁机制,允许在用户空间处理大部分的锁操作,只有在发生冲突时才进入内核。
- 原理 :
- 使用共享内存中的整数变量作为锁,进程通过 futex()系统调用在用户态和内核态之间切换。
- 高效且适用于高性能多线程程序中的进程同步。
 
- 使用共享内存中的整数变量作为锁,进程通过 
- 常见用法 :
- Futex 可以用来实现互斥锁、条件变量、读写锁等同步原语。