嵌入式学习37-TCP并发模型

TCP并发模型:
1.TCP多线程模型:
    缺点:
        1.创建线程会带来 资源开销                                                                                                                2.能够实现的  并发量  比较有限 

2.IO模型:
    1.阻塞IO:
          没有数据到来时,可以让任务挂起                                                                                                        节省CPU资源开销,提高系统效率
    
    2.非阻塞IO:
           程序接收到数据时一直执行        效率很低

    3.异步IO
             只能绑定一个文件描述符用来    读取数据

    4.多路复用IO
        select
            1.select监听的集合中的文件描述符有  上限限制                                                                                                       
            2.select有 内核层 用户层数据空间    拷贝   的过程,占用系统资源开销                                                                                                       
            3.select必须  轮询检测  产生  事件  的文件描述符                                                                                                       
            4.select  只能工作   在  水平触发  模式(低速模式)                                                                                            无法工作  在  边沿触发  模式(高速模式)

        poll   (监听的集合中的文件描述符有  没有上限限制
            1.poll有  内核层 向  用户层 数据空间  拷贝  的过程,占用系统资源开销                                                                                          
            2.poll必须  轮询检测  产生  事件  的文件描述符                                                                                          
            3.poll  只能工作在水平触发模式(低速模式)                              与select相同                                                 无法工作在边沿触发(高速模式)

水平触发:产生事件通知,没处理完成,下次继续通知此事件,阻塞在这里,直到处理完成此事件(低速)。

边沿触发:产生事件的时刻通知,只通知一次,下次通知其它事件,不阻塞。

poll:内部链表结构,所以无上限。

  
3.函数接口:
    1.select 
      int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
      功能:
             select  监听  文件描述符集合                                                                                                              是否 有文件描述编程 ready状态

                                   

select  监听  文件描述符集合 ,若有状态 , 将没有ready状态的T除                                                                                                   若无状态,将阻塞继续等待                                                                参数:
        nfds:                                                                                                                                                             最大文件描述符的值  +1 
        readfds:                                                                                                                                                                读 文件描述符集合
        writefds:                                                                                                                                                             写  文件描述符集合
        exceptfds:                                                                                                                                                             其余  文件描述符集合
        timeout:                                                                                                                                                             等待的时长
                      NULL 一直等待(超时处理
      返回值:
        成功   返回   文件描述符集合中  的  文件描述符个数
        失败   返回   -1 

    void FD_CLR  (int fd, fd_set *set);
    功能:
          将文件描述符   fd  从集合中清除 

    int  FD_ISSET   (int fd, fd_set *set);
    功能:
         判断文件描述符  fd  是否仍在集合中 

    void FD_SET(int fd, fd_set *set);
    功能:
        将文件描述符  fd  加入到 集合中

    void FD_ZERO(fd_set *set);
    功能:
        将文件描述符集合   清0 

    2.poll  
      int poll(struct pollfd *fds, nfds_t nfds, int timeout);
      功能:
             监听  文件描述符集合  是否  有事件发生
      参数:
        fds:                                                                                                                                                             监听  文件描述符集合  数组空间首 地址
        nfds:                                                                                                                                                           监听   文件描述符集合  元素个数
        timeout:                                                                                                                                                           等待的时间   (非0)                                                                                                                                              (-1 一直等待
      返回值:
        成功  返回  产生事件的文件描述符  个数
        失败  返回  -1 

    struct pollfd {
        int   fd;         /* file descriptor */
        short events;     /* requested events */
        short revents;    /* returned events */
    };

    fd:                                                                                                                                                           监听的文件描述符
    events:                                                                                                                                                           要监听的 事件                                                                                                                          POLLIN:                                                                                                                                                                是否 可读                                                                                                                         POLLOUT:                                                                                                                                                           是否 可写
    revents:                                                                                                                                                           实际  产生的  事件 

    3.epoll 
      int epoll_create(int size);
      功能:
          创建 一张 内核事件表
      参数:
        size:                                                                                                                                                           事件的 个数
      返回值:
        成功返回文件描述符
        失败返回-1 
    
      epoll_ctl 
      int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
      功能:
              维护  epoll时间表
      参数:
        epfd:                                                                                                                                                           事件表  的文件描述符
        op:
            EPOLL_CTL_ADD   添加事件
                                                                                                                                                                       EPOLL_CTL_MOD   修改事件
                                                                                                                                                                       EPOLL_CTL_DEL   删除事件
        fd:
            操作 的文件描述符
        event:
            事件 对应的 事件 
        
        typedef union epoll_data {
            void        *ptr;
                int          fd;
            uint32_t     u32;
            uint64_t     u64;
        } epoll_data_t;

        struct epoll_event {
            uint32_t     events;      /* Epoll events */
            epoll_data_t data;        /* User data variable */
        };

      返回值:
        成功返回0 
        失败返回-1 

      epoll_wait 
      int epoll_wait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout);
      功能:
        监听  事件表中  的  事件
      参数:
        epfd:                                                                                                                                                           文件描述符
        events:                                                                                                                                                           存放  实际产生事件  的数组空间 首地址
        maxevents:                                                                                                                                                           最多  存放事件  个数
        timeout:                                                                                                                                                           设定监听的时间(超过该时间  则不再监听
                         -1 一直监听直到有事件发生
      返回值:
        成功返回产生事件的文件描述符个数
        失败返回-1 
        如果时间达到  仍没有事件发生  返回0 

相关推荐

  1. 嵌入36——TCP

    2024-03-13 02:04:01       18 阅读
  2. 嵌入学习35-网络通信UDP聊天及TCP

    2024-03-13 02:04:01       19 阅读
  3. 嵌入学习——网络编程(TCP)——day31

    2024-03-13 02:04:01       8 阅读
  4. 嵌入学习day33

    2024-03-13 02:04:01       20 阅读
  5. 嵌入学习 Day 31

    2024-03-13 02:04:01       20 阅读
  6. 嵌入学习day35

    2024-03-13 02:04:01       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 02:04:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 02:04:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 02:04:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 02:04:01       18 阅读

热门阅读

  1. KSR-imp通过vcpkg安装CGAL

    2024-03-13 02:04:01       22 阅读
  2. 字符串|344.反转字符串

    2024-03-13 02:04:01       19 阅读
  3. CatBoost模型部署与在线预测教程

    2024-03-13 02:04:01       19 阅读
  4. 第十节 JDBC事务

    2024-03-13 02:04:01       17 阅读
  5. Spring Boot 实现文件本地以及OSS上传

    2024-03-13 02:04:01       19 阅读
  6. C++学习

    C++学习

    2024-03-13 02:04:01      24 阅读
  7. 僵尸进程和孤儿进程

    2024-03-13 02:04:01       18 阅读
  8. 从SPI协议学习PX4源码

    2024-03-13 02:04:01       20 阅读
  9. rasterio库简介及函数说明

    2024-03-13 02:04:01       22 阅读
  10. ingress

    2024-03-13 02:04:01       19 阅读
  11. 系统设计学习(一)分布式系统

    2024-03-13 02:04:01       22 阅读