Jul 13
内核方面的缺点:
- 缺乏真正的内核级 AIO 支持。
真正的 AIO 必须满足下面的几个要求
- 异步操作和同步操作一样都是可以利用缓存的
- 没有在内部使用辅助线程 , io 操作应该直接提交给 io scheduler。
- 异步操作不会在内部隐式转化成同步操作。比如需要的内容已经在内存的时候, 一个异步 read 会变成同步 read . 尽管read没有阻塞,但是如果是非常大的 buffer 执行拷贝过程可能超过预期,导致不必要的延迟。
- 实现上不能对发起的io个数有限制。可以用 ulimit 限制进程和单个线程能同时发起的io操作个数。
- 异步操作要能用在所有的 文件描述符 上。也就是说,所有的 io 操作都可以是异步的。
- 如果不使用缓存,异步操作需要利用零拷贝技术。直接拷贝到用户提供的 buffer 上而不先拷贝到内核页面。如果用户 buffer 会发生 pagefaut 则应该立即返回错误而不是阻塞。用户提供的 buffer 必须使用 MAP_POPULATED 参数调用 mmap 分配。
- 同步io操作在内核里转化为异步io,或者是在 libc 级别(更好)。
SystemV IPC 糟糕的设计:
- 进程退出后消息列队、共享内存、信号量无法被自动清除。需要在程序里显式删除。 出错的程序可能因此耗尽系统资源
- 全局命名空间, key_t。