进程通信

1.管道 字节流 顺序(不能lseek),单向,相关进程(继承fd) pipe() fds[2]
空管道读阻塞,关闭返回0,
写入不超过PIPE_BUF是原子的,超过可能交叉写入,满write阻塞
FIFO 有名称的管道(在文件系统中),可用于非相关进程之间

2.systemV ipc对象 内核持久
共享内存中指针要是偏移量

3.posix mq_open(消息队列) shm_open+mmap(共享内存) 内核持久
mq:描述符和文件类似,进程级别句柄
异步通过直mq_notify 只有一个进程可注册,只有边缘触发,收到后要再次注册,一次性
posix的共享内存。linux的tmpfs上,内核持久性。无关进程共享,mmap只能用共享文件映射,必须用磁盘。posix可以不用磁盘。sysV需要一整套新的系统调用和命令。shm_open+mmap

4.内存映射mmap
私有文件映射:共享库等初始化
私有匿名映射:分配新内存,大块内存,fork。
共享文件映射:减少拷贝,节省一个缓冲区(只有一个内核缓冲区).msync控制文件同步
共享匿名映射:共享RAM页。相关进程才能通信
预留 交换空间 OOM

mlock 将虚拟内存区域锁进RAM

5.socket
流/数据报(connect也能提升性能) unix内核/inet/inet6
5.1
Unix socketaddr_un{sa_family_t,sun_path}
socketpair() 相当于双向管道,对其他进程不可见。除非有sun_path,否则无名的或者为NULL的这种抽象namespace的都是相关进程才可见。
file无name比如netsocket,pipe等,不在filesystem namespace中,只能相关进程访问,除非fd passing。这种无inode,否则有inode
5.2 inet domain
地址若是数字有大小端区分。用系统调用htons等
readn,writen
shutdown(write有缓冲区,sendfile无,加tcp_cork数据和并)
recv,send
sendfile
sendmsg/recvmsg 可以实现recv,send等分散聚合功能。常用于同一个主机传递fd面舒服

IO
select(nfds,readxx) nfds比要检查的fd大1,read等感兴趣位图和结果位图,要遍历
什么是就绪?IO不阻塞就是就绪,普通文件一直不阻塞,不能用
select和poll都是水平触发
信号驱动IO IO/文件nofity 边缘触发
epoll 可边缘/水平。
边缘:注意不再通知,还要注意防止饥饿。维护一个就绪文件描述符列表,读到EAGAIN移除,循环读取处理

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理