面试题--操作系统

操作系统

IO 多路复用是什么?有哪些 api?

通过一种同步 IO 模型,实现一个进程可以监视多个文件描述符,一旦某个文件符就绪,就通知程序进行相应的读写操作。
api:

select 和 epoll 的区别?水平触发和边缘触发的区别是啥?使用的时候需要注意什么?

  1. epoll 没有对描述符数目的限制,它所支持的文件描述符上限是整个系统最大可以打开的文件数目,select 32位机默认是1024个。64位机默认是2048.
  2. select 和 poll 基本类似,都是使用内核定义的数据结构来进行文件描述符的存储,select 采用 bitmap ,poll 采用数组。select 会受到最大连接数的限制,而 poll 在一定程度上解决了这个问题。而 epoll 则是内核专门维护了一颗红黑树来存储文件描述符信息。前两个文件描述符信息需要用户空间维护,而后者是在内核空间维护的。
  3. select 和 poll 都需要将有关文件描述符的数据结构在用户空间和内核空间来回拷贝,而 epoll 只会在新增/修改/删除的时候进行拷贝工作。
  4. select 和 poll 采用轮询的方式来检查文件描述符是否处于就绪状态,而 epoll 采用回调机制。造成的结果是,随着文件描述符的增加,select 和 poll 的效率会线性降低,而 epoll 受到的影响较小,除非活跃的 Socket 较多。
  5. select 、poll 以及 epoll 虽然都会返回就绪的文件描述符数量。但是 select 和 poll 并不会明确指出是哪些文件描述符就绪,而 epoll 可以做到。用户进程返回后,调用 select 和 poll 的程序需要遍历监听整个文件描述符,而 epoll 得益于内核就绪链表则可以直接处理。
    注意,虽然 epoll 的性能最好,但是在连接数少并且连接都十分活跃的情况下,select 和 poll 的性能可能比 epoll 好,毕竟 epoll 的通知机制需要很多函数回调,这也是需要有开销的。
    水平触发
    当内核有事件到达,会拷贝给用户空间,如果应用程序没有处理完或者压根都没有处理,那么会在下一次再次返回没有处理的事件。这样,如果应用程序永远不处理这个事件,就导致每次都会有该事件从内核空间到用户空间的拷贝,消耗性能。但是水平触发相对安全,最起码事件不会丢掉,除非用户处理完毕。
    边缘触发
    边缘触发,相对跟水平触发相反,当内核有事件到达,只会通知应用程序一次,至于应用程序处理还是不处理,以后将不会再通知。这样减少了拷贝过程,增加了性能,但是会产生事件丢失的情况。
    对于 select 和 poll 来说,其触发都是水平触发。而 epoll 既支持水平触发也支持边缘触发。

    poll 储存描述符的数据结构是什么?

    操作系统内核维护一颗红黑树来存储文件描述符相关信息和维护一个链表来存放准备就绪的文件描述符对应的 Socket 相关的事件信息。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!