IO模型的发展

再讲IO演变之前,首先要提到两个概念,一个是内核(kernel),一个是文件描述符(file descriptor)。

什么是内核(kernel)

        内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用 

什么是文件描述符(file descriptor)

       首先,在Linux操作系统中,可以将一切都看作是文件,包括普通文件,目录文件,字符设备文件(如键盘,鼠标…),块设备文件(如硬盘,光驱…),套接字等等,所有一切均抽象成文件,提供了统一的接口,方便应用程序调用。

        那么,既然一切都被看作是文件,那么对于一个打开的文件,应用程序如何与其对应上,

就引出了文件描述符file descriptor(以下简称fd)

        当应用程序请求内核打开/新建一个文件时,内核会返回一个文件描述符用于对应这个打开/新建的文件,其fd本质上就是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

接下来介绍一下IO的演变:

 上图为早起的BIO模型,因为socket在这个时期是blocking。

(顺带提一嘴: 技术的推动发展 一定是为了解决某种问题)

上图为NIO(同步非阻塞),在用户态发生轮询,如果有10000个fd,则用户进程需要轮询调用10000次内核kernel,成本问题非常大

为了解决这个问题,则需要考虑缩短轮询调用的次数,根据这个思路延伸,上图

    #include <sys/select.h>

    /* According to earlier standards */
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>

    int select(int nfds, fd_set *readfds, fd_set *writefds,
                fd_set *exceptfds, struct timeval *timeout);

 实现了多路复用之后,还能不能进一步优化提升(此刻内核还是会继续发展......)

该epoll登场了~~~!!! epoll(event poll 事件驱动)

#include <sys/epoll.h>

    int epoll_create(int size);
    int epoll_create1(int flags);

    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

    int epoll_wait(int epfd, struct epoll_event *events,
                int maxevents, int timeout);
    int epoll_pwait(int epfd, struct epoll_event *events,
                int maxevents, int timeout,
                const sigset_t *sigmask);

epoll_create&epoll_create1用于创建一个epoll实例

epoll_ctl用于往epoll实例中增删改要监测的文件描述符

epoll_wait则用于阻塞的等待可以执行IO操作的文件描述符直到超时

内核和用户开辟共享空间,从共享空间中读取,只关心“活跃”的链接,无需遍历全部描述符集合。

能够处理大量的链接请求(系统可以打开的文件数目)

后续会讲到redis中 epoll的使用~~!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值