Linux下常用的IO模型

devtools/2025/1/12 3:38:59/

Linux下常用的IO模型:

1. 阻塞IO
    fgets
    read
    getchar
    fread
    fgetc
    recv
    recvfrom
    1. 让多个IO事件以同步方式处理,
    2. 多个IO事件之间互相影响
    3. CPU占有率低

2. 非阻塞IO
       将IO对应的文件描述符设置成非阻塞方式。
        O_NONBLOCK
        fcntl
     1.非阻塞一般搭配轮询方式同时监测多个IO
     2.cpu占有率高

3. 信号驱动IO
      SIGIO
     1.实现异步IO操作,节省CPU开销
     2.只能针对比较少的IO事件

4. IO多路复用(IO多路转接)*
       在不创建新的进程和线程的前提下, 在一个进程中,同时监测多个IO
    1. select
          1. 文件描述符集合以数组(位图)的方式保存,最多监测1024个文件描述符。
          2. 文件描述符集合创建在应用层,需要应用层和内核层反复拷贝
          3. 内核层返回整个文件描述符集合,需要用户层遍历查找到达事件的文件描述符
          4. 只能工作在水平触发模式(低速模式)
    2. poll
          1. 文件描述符集合以链表的方式保存,监测文件描述符可超过1024。
          2. 文件描述符集合创建在应用层,需要应用层和内核层反复拷贝
          3. 内核层返回整个文件描述符集合,需要用户层遍历查找到达事件的文件描述符
          4. 只能工作在水平触发模式(低速模式)
    3. epoll 
          1. 文件描述符集合以树型结构(红黑树)保存,监测文件描述符可超过1024, 提高了数据的查找速度。
          2. 文件描述符集合创建在内核层;
          3. 返回的是到达事件的文件描述符集合,无需遍历查找
          4. 可以工作在水平触发模式(低速模式),也可以工作在边沿触发模式(高速模式)

使用select实现IO多路复用的步骤:

1. 创建文件描述符集合
2. 添加关注的文件描述符到集合
3. 传递给内核,内核开始监测IO事件  select  
4. IO事件到达则返回结果

使用select实现IO多路复用的主要函数接口:

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
功能:通知内核监测IO事件并返回事件结果
参数:
        nfds:最大文件描述符+1
        readfds: 文件描述符读事件集合
        writefds:文件描述符写事件集合
        exceptfds:其他
        timeout : 超时时间
返回值:
    成功:返回达到的事件的个数
    失败:-1
    设置超时:超时时间到,但没有事件到达:0

       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);

使用epoll实现IO多路复用的主要函数接口:

int epoll_create(int size);
功能:创建epoll的文件描述符集合
参数:
        size:集合保存数据的最大个数
返回值:
       成功:返回一个文件描述符(代表集合)
       失败:-1

       int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:对集合中的文件描述符进行操作
参数:
         epfd:文件描述符集合
          op:操作
                 EPOLL_CTL_ADD : 添加
                 EPOLL_CTL_DEL : 删除
                 EPOLL_CTL_MOD:修改

         fd : 要操作的文件描述符
         event:文件描述符事件结构体地址
                       EPOLL_CTL_DEL : 删除----》NULL

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

 int epoll_wait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout);
功能:开始监测IO事件
参数:
      epfd:文件描述符集合
      events:  保存返回的事件集合的地址
      maxevents : 监测的文件描述符的个数
      timeout:超时时间
                   -1 :不设置超时时间
返回值:
       成功:返回实际到达的事件的个数
        失败:-1
       设置超时事件,超时没有事件到达:0

使用select实现TCP并发服务器

         


http://www.ppmy.cn/devtools/149769.html

相关文章

如何学习Vue设计模式

如何学习Vue设计模式 Vue 设计模式是 Vue.js 框架中用于解决常见问题的可复用解决方案。这些模式帮助开发者更有效地组织和管理代码,提升代码的可维护性、可扩展性和可读性。以下是一些常见的 Vue 设计模式: 1. 数据存储模式 可组合函数:用…

vue3使用vue3-video-play播放m3u8视频

1.安装vue3-video-play npm install vue3-video-play --save2.在组件中使用 import vue3-video-play/dist/style.css; import VideoPlay from vue3-video-play;// 视频配置项 const options reactive({src: https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8, //视频源mute…

leetcode 面试经典 150 题:两数之和

链接两数之和题序号1题型数组解题方法1. 哈希表,2. 暴力法难度简单熟练度✅✅✅✅✅ 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输…

用c实现C++类(八股)

在 C 语言中,虽然没有内建的面向对象编程(OOP)特性(如封装、继承、多态),但通过一些编程技巧,我们仍然可以模拟实现这些概念。下面将用通俗易懂的方式,逐步介绍如何在 C 中实现封装、…

怎么把word试题转成excel?

在教育行业、学校管理以及在线学习平台中,试题库的高效管理是一项核心任务。许多教育工作者和系统开发人员常常面临将 Word 中的试题批量导入 Excel 的需求。本文将详细介绍如何快速将试题从 Word 转换为 Excel,帮助您轻松解决繁琐的数据整理问题&#x…

策略模式详解

策略模式(Strategy Pattern)是一种常用的行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户。下面对策略模式进行详细讲解: 一、角色…

chrome浏览器的更新提示弹窗无法更新Chrome解决方法

使用组策略编辑器 此方法适用于 Windows 系统且系统为专业版及以上版本,家庭版系统没有组策略功能。 按下Win R键,打开 “运行” 对话框,输入gpedit.msc并回车,打开组策略编辑器。 在组策略编辑器中,依次展开 “计算机…

基于Qt/C++二维码生成器(附工程源码链接)

简介 本项目是一个基于C和Qt框架开发的二维码生成器。它通过简单的用户交互,能够快速生成二维码图像并显示在用户界面上。以下将从代码结构、实现逻辑和功能扩展等方面对该项目进行详细讲解,便于集成到其他程序中。 项目代码结构 项目的主要文件包括以…