操作系统面试题九

零拷贝

假如需要进行文件传输,使用传统I/O,数据读取和写入是用户空间到内核空间来回赋值,而内核空间的数据是通过操作系统的I/O接口从磁盘读取或者写入,这期间发生了多次用户态和内核态的上下文切换,以及多次数据拷贝。

为了提高I/O性能,就需要减少用户态和内核态的上下文切换和内存拷贝的次数,

零拷贝技术主要有

  • mmap+write

    mmap()系统调用函数会直接把内核缓冲区中的数据映射到用户空间,这样操作系统内核和用户空间就不需要进行任何的数据拷贝操作。

  • sendfile

    在linux内核2.1版本中,提供一个专门发送文件的系统调用函数sendfile()。

    它可以替代前⾯的 read() 和 write() 这两个系统调⽤,这样就可以减少⼀次系统调⽤,也就减少了 2 次上下⽂切换的开销。

    其次,该系统调⽤,可以直接把内核缓冲区⾥的数据拷⻉到 socket 缓冲区⾥,不再拷⻉到⽤户态,这样就只有 2 次上下⽂切换,和 3 次数据拷⻉。

I/O多路复用

使用一个进程或者线程维护Socket,这个多路复用就是多个连接复用一个进程/线程。

I/O多路复用实现机制:

  • select

    实现多路复用的方式是:

    将已连接的Socket都放到一个文件描述符集合fd_set,然后调用select函数将fd_set集合拷贝到内核中,让内核检查是否有网络事件发生,检查的方式是通过遍历fd_set,当检查到有事件产生后,将此socket标记为可读或可写,接着再把整个fd_Set拷贝回用户态里。然后用户态需要通过遍历找到可读或可写的Socket,对其进行处理。

    select使用固定长度的bitMap,表示文件描述集合,而且所支持的文件描述符的个数是有限制的,在Linux 系统中,由内核中的 FD_SETSIZE 限制, 默认最⼤值为 1024 ,只能监听 0~1023 的⽂件描述符。

    select机制的缺点:

    • 每次调用select,都需要把fd_set集合从用户态拷贝到内核态,如果fd_Set集合很大,这个开销也很大。如果百万连接却只有少数活跃连接时这样做就太没有效率。
    • 每次调用select都需要在内核中遍历传递进来的fd_Set,如果fd_set集合很大,开销也很大。
    • 为了减少数据拷贝带来的性能损坏,内核对被监控的fd_set集合大小做了限制,一般为1024,如果想要修改会比较麻烦,可能还需要编译内核。
    • 每次调用select之前都需要遍历监听集合,重复工作。

poll

poll不在使用bitmap来存储所关注的文件描述符,取而代之为动态数组,以链表形式组织,突破select文件描述符的限制,但会受到系统描述符限制。

poll和select没有很大区别,都是使用线性结构存储关注的socket集合,因此都需要遍历文件描述符集合来找到可读或可写的socket,时间复杂度为O(n),而且需要在内核态和用户态之间拷贝文件描述符集合,随着并发数上升,性能损耗呈指数级上升。

epoll

epoll通过两方面解决poll/select的问题。

第一点:epoll在内核中使用红黑树来跟踪进程所有待检测的文件描述符,把需要监控的socket通过epoll_ctl() 函数加⼊内核中的红⿊树⾥,红⿊树是个⾼效的数据结构,增删查⼀般时间复杂度是O(logn) ,通过对这棵⿊红树进⾏操作,不需要每次操作时都传入整个socket集合,只需要传入一个待检测的socket,减少内核和用户空间大量数据拷贝和内存分配。

第二点:epoll使用事件驱动的机制,内核里**维护了一个链表记录就绪事件,**当某个 socket 有事件发⽣时,通过回调函数,内核会将其加⼊到这个就绪事件列表中,当⽤户调⽤ epoll_wait() 函数时,只会返回有事件发⽣的⽂件描述符的个数,不需要像 select/poll 那样轮询扫描整个 socket 集合,⼤⼤提⾼了检测的效率。

epoll 的⽅式即使监听的 Socket 数量越多的时候,效率不会⼤幅度降低,能够同时监听的 Socket 的数⽬也⾮常的多了,上限就为系统定义的进程打开的最⼤⽂件描述符个数。因⽽,epoll 被称为解决 C10K 问题的利器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值