精华内容
下载资源
问答
  • IO多路复用

    2020-03-14 00:00:37
  • Io多路复用

    2019-05-12 09:57:09
    io多路复用 文章目录IO多路复用IO多路转换-select函数 IO多路复用 fcntl函数实现(非阻塞方式) select函数实现 非阻塞模型采用遍历动态数组的的方式,找出动态数组中所有的fd并通过这些fd和对应的客户端进行双向通信...

    io多路复用

    IO多路复用

    • fcntl函数实现(非阻塞方式)
    • select函数实现
    • 非阻塞模型采用遍历动态数组的的方式,找出动态数组中所有的fd并通过这些fd和对应的客户端进行双向通信
    • 采用非阻塞方式进行读写,非阻塞的方式单个服务器也能同时服务多个文件描述符

    IO多路转换-select函数

    /* According to POSIX.1-2001, POSIX.1-2008 */
    #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);
    
    void FD_CLR(int fd, fd_set *set);
    int  FD_ISSET(int fd, fd_set *set);
    void FD_SET(int fd, fd_set *set);
    void FD_ZERO(fd_set *set);
    
    
    • 参数nfds是最大的fd加1(max fd plus 1),在三个文件描述符中找出最高的描述符编号值,然后加1,这就是第一个参数值。
    #include <sys/select.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
    
    • maxfdp:被监听的文件描述符的总数,它比所有文件描述符集合中的文件描述符的最大值大1,因为文件描述符是从0开始计数的;

    • readfds、writefds、exceptset:分别指向可读、可写和异常等事件对应的描述符集合。

    • timeout:用于设置select函数的超时时间,即告诉内核select等待多长时间之后就放弃等待。

    展开全文
  • IO 多路复用

    2019-05-09 20:24:00
    IO 多路复用 如何提升并发能力? 多线程模型,创建新的线程处理请求 多进程模型,创建新的进程处理请求 IO 多路复用,实现单进程同时处理多个 socket 请求 PS: 线程、进程创建开销比较大,可以用线程池方式解决...

    IO 多路复用

    如何提升并发能力?
    • 多线程模型,创建新的线程处理请求
    • 多进程模型,创建新的进程处理请求
    • IO 多路复用,实现单进程同时处理多个 socket 请求

    PS:

    • 线程、进程创建开销比较大,可以用线程池方式解决
    • 线程和进程比较占用资源,难以同时创建太多
    阻塞式 IO
    • 内核等待数据
    • 数据从内核拷贝到用户进程

    1240

    什么是 IO 多路复用?
    • 为了实现高并发需要一种机制并发处理多个 socket
    • Linux 常见的是 select/poll/epoll
    • 可以使用单线程单进程处理多个 socket

    1240

    IO 多路复用

    select 可以同时处理多个 socket,有一个就绪应用程序代码就可以处理它。

    代码格式:

    while True:
        events = sel.select()
        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)
    select/poll/epoll 区别

    主要讲一下时间复杂度方面的区别:

    • select: O(n)
    • poll: O(n)
    • epoll: O(1)

    根据时间复杂度我们可以知道,epoll 方法的时间复杂度最低,所以一般情况下都是用 epoll 操作的。

    Python如何实现 IO 多路复用
    • Python 的 IO 多路复用基于操作系统实现(select/poll/epoll)
    • Python2 select 模块
    • Python3 selectors 模块

    转载于:https://www.cnblogs.com/weixuqin/p/10840784.html

    展开全文
  • io多路复用

    2020-01-01 21:59:26
    io多路复用 TEXT: io多路复用 出现场景 一个网络服务器,供多个网络客户端连接,并处理这些连接传上来的请求 假设有一个网络服务器,5个连接,fdA,fdB,fdC,fdD,fdE 实现思路 多线程 RPC框架 并不...
    io多路复用
    io多路复用

    TEXT:

    io多路复用

     

    • 出现场景
      • 一个网络服务器,供多个网络客户端连接,并处理这些连接传上来的请求
      • 假设有一个网络服务器,5个连接,fdA,fdB,fdC,fdD,fdE
    • 实现思路
      • 多线程
        • RPC框架
          • 并不是最优方案
        • cpu线程切换(上下文)消耗资源
      • 单线程
        • 依赖DMA请求不会丢失
        • DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块
        • 模拟逻辑代码
        • while(true){
        • for(fdx in (fdA~fdE)){
        • if(fdx 有数据){
        • 读取 fdx;
        • 处理 fdx;
        • }
        • }
        • }
          • 如果用c写,有一定效率
          • 但判断是否有数据,依旧是程序判断的,这里效率还是比较低的
    • 单线程实现
      • io多路复用
        • select(198?年的api)
          • 代码解析
            • 准备部分(while上面部分)
              • 定义一个文件描述符的数组fds,下标:0~4;数组存的值是 243,579等值,非0~4并且找到最大值赋值给max
              • while循环;select函数;for循环读取数据,处理数据;
            • select函数
              • select(max+1,&rset,NULL,NULL,NULL);
                • 参数说明
                  • max+1:截取有数据段
                  • 读文件描述符集合
                  • 写文件描述符集合
                  • 异常文件描述符集合
                  • 超时时间
              • 最关注的是读文件描述符集合
              • &rset:bitmap:1024
                • bitmap存的是哪些文件描述符被启用|监听
              • 运行时,用户态中 &rset全拷贝到内核态,内核中判断rset中是否有数据
              • 如果没有数据到来,select会阻塞,等待
              • 如果有数据来,内核中
                • fd置位
                • select返回
            • for循环处理
              • for循环判断&rset中每个元素是否被置位
                • 如果置位,则读取数据,并处理数据
          • 简言之:select函数做这样一件事,将fds拷贝到内核态,内核进行监听fds,遍历fdx,如果无数据则阻塞,有数据则置位,select返回(可能哟多个置位)。返回后fds再遍历,将有置位的fdx进行读取数据和处理数据处理。提高效率的核心是将fds判断扔到内核中判断。
          • 仍有几个缺点
            • A 默认大小1024,bitmap
            • B fdset不可重用:fdset中fd置位后,被内核修改,每次rset在while(true)时都会重新赋空值,select置位赋值
            • C 用户态→内核态:fds从用户态到内核态的切换,仍有一个开销
            • D O(n):每次select返回后,能确定有返回,但不确定有几个返回,具体位置,需要全遍历执行
        • poll
          • 准备阶段
            • 构造数组
          • poll
            • 核心是构建了一个结构体
            • `struct pollfd{`
            • `int fd;`
            • `short events;`
            • `short revents;`
            • `};`
            • 用户态→内核态
              • 因为结构体的存在,置位是实质置位结构体中的revents=POLLIN;通俗讲没有置位对象,而是置位java对象的某属性。
            • 解决了select中的 A,B问题
          • for循环处理
            • for循环处理中又会revents=0;
        • epoll
          • 准备阶段
            • 构造白板
          • epoll_event结构体
          • `struct epoll_event{`
          • `int fd;`
          • `short events;`
          • `};`
          • 代码组成
            • epoll_create(10)
              • 10可以是其他值,无实质指代意义
            • epol_ctl(...)
            • epoll_wait(...)
              • 用户态与内核态共享一块内存
                • 有数据:置位(重排序),将有数据的时间重排到数组的前面
                • 返回实际有数量的count,3个置位就返回3,一个置位就返回1
                • 时间复杂度O(1)
            • 解决了select中的 C,D问题
    • 抛出问题
      • ssd为啥比机械硬盘快
        • 虽然SSD和HDD都能存储内容,但两者结构完全不一样。HDD内部有马达、碟片、磁头等机械结构,工作时碟片转动,所以HDD工作时会有轻微震动,并且伴有声音。
        • SSD的内部结构更像是U盘,拥有主控、闪存芯片等。由于工作的时候没有机械结构转动或移动,所以SSD工作的时候没有震动,也不会有声音。
        • 两者工作方式不同,机械硬盘是一个旋转的金属磁盘和磁头来存取数据的,它找到数据需要一个寻道时间,而固态硬盘是电子芯片读写是几乎不需要寻道时间的,没有运动部件都是电子芯片时间当然要快得多。
      • DB对ssd有哪些优化
      • 优化原理
        • 基于SSD的数据库优化法则
          • 将sequential logging修改为In-page logging
          • SSD作为写cache-append write
          • SSD作为读cache-flashcache
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,973
精华内容 3,589
关键字:

io多路复用