爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【epoll】形象的解释epoll|一句话讲透epoll

      首页 知识中心 其他 文章详情页

      【epoll】形象的解释epoll|一句话讲透epoll

      2025-02-11 09:36:24 阅读次数:14

      epoll,事件,内核,描述符,缓冲区,触发,阻塞

      Epoll触发条件

      • 可读事件, 当文件描述符关联的内核读缓冲区可读,则触发可读事件
        什么是可读呢? 就是内核缓冲区非空,有数据可以读取
      • 可写事件, 当文件描述符关联的内核写缓冲区可写,则触发可写事件
        什么是可写呢?就是内核缓冲区不满,有空闲空间可以写入

      水平触发(level-trggered)

      • 只要文件描述符关联的读内核缓冲区非空,有数据可以读取,就一直发出可读信号进行通知,
      • 当文件描述符关联的内核写缓冲区不满,有空间可以写入,就一直发出可写信号进行通知

      边缘触发(edge-triggered)

      • 当文件描述符关联的读内核缓冲区由空转化为非空的时候,则发出可读信号进行通知,
      • 当文件描述符关联的内核写缓冲区由满转化为不满的时候,则发出可写信号进行通知

      两者的区别在哪里呢?水平触发是只要读缓冲区有数据,就会一直触发可读信号,而边缘触发仅仅在空变为非空的时候通知一次

      更详细的见文章后面的:一句话讲透epoll。

      形象的解释epoll

      转自:我读过的最好的epoll讲解--转自”知乎“_雪不化花不开的博客-CSDN博客_epoll怎么读

         首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。

          不管是文件,还是套接字,还是管道,我们都可以把他们看作流。

          之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办?

      阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做);那么你可以去睡觉了,因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。

      非阻塞忙轮询:接着上面等快递的例子,如果用忙轮询的方法,那么你需要知道快递员的手机号,然后每分钟给他挂个电话:“你到了没?”

          很明显一般人不会用第二种做法,不仅显很无脑,浪费话费不说,还占用了快递员大量的时间。

          大部分程序也不会用第二种做法,因为第一种方法经济而简单,经济是指消耗很少的CPU时间,如果线程睡眠了,就掉出了系统的调度队列,暂时不会去瓜分CPU宝贵的时间片了。

          为了了解阻塞是如何进行的,我们来讨论缓冲区,以及内核缓冲区,最终把I/O事件解释清楚。缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用(你知道它很慢的),当你操作一个流时,更多的是以缓冲区为单位进行操作,这是相对于用户空间而言。对于内核来说,也需要缓冲区。

      假设有一个管道,进程A为管道的写入方,B为管道的读出方。

      假设一开始内核缓冲区是空的,B作为读出方,被阻塞着。然后首先A往管道写入,这时候内核缓冲区由空的状态变到非空状态,内核就会产生一个事件告诉B该醒来了,这个事件姑且称之为“缓冲区非空”。

          但是“缓冲区非空”事件通知B后,B却还没有读出数据;且内核许诺了不能把写入管道中的数据丢掉。这个时候,A写入的数据会滞留在内核缓冲区中,如果内核也缓冲区满了,B仍未开始读数据,最终内核缓冲区会被填满,这个时候会产生一个I/O事件,告诉进程A,你该等等(阻塞)了,我们把这个事件定义为“缓冲区满”。

      假设后来B终于开始读数据了,于是内核的缓冲区空了出来,这时候内核会告诉A,内核缓冲区有空位了,你可以从长眠中醒来了,继续写数据了,我们把这个事件叫做“缓冲区非满”

          也许事件Y1已经通知了A,但是A也没有数据写入了,而B继续读出数据,直到内核缓冲区空了。这个时候内核就告诉B,你需要阻塞了!,我们把这个时间定为“缓冲区空”。

      这四个情形涵盖了四个I/O事件,缓冲区满,缓冲区空,缓冲区非空,缓冲区非满(注都是说的内核缓冲区,且这四个术语都是我生造的,仅为解释其原理而造)。这四个I/O事件是进行阻塞同步的根本。(如果不能理解“同步”是什么概念,请学习操作系统的锁,信号量,条件变量等任务同步方面的相关知识)。

          然后我们来说说阻塞I/O的缺点。但是阻塞I/O模式下,一个线程只能处理一个流的I/O事件。如果想要同时处理多个流,要么多进程(fork),要么多线程(pthread_create),很不幸这两种方法效率都不高。

          于是再来考虑非阻塞忙轮询的I/O方式,我们发现我们可以同时处理多个流了(把一个流从阻塞模式切换到非阻塞模式再此不予讨论):

      忙轮询

      while true {
      
      for i in stream[]; {
      
      if i has data
      
      read until unavailable
      
      }
      
      }

          我们只要不停的把所有流从头到尾问一遍,又从头开始。这样就可以处理多个流了,但这样的做法显然不好,因为如果所有的流都没有数据,那么只会白白浪费CPU。这里要补充一点,阻塞模式下,内核对于I/O事件的处理是阻塞或者唤醒,而非阻塞模式下则把I/O事件交给其他对象(后文介绍的select以及epoll)处理甚至直接忽略。

          为了避免CPU空转,可以引进了一个代理(一开始有一位叫做select的代理,后来又有一位叫做poll的代理,不过两者的本质是一样的)。这个代理比较厉害,可以同时观察许多流的I/O事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中醒来,于是我们的程序就会轮询一遍所有的流(于是我们可以把“忙”字去掉了)。代码长这样:

      检测到数据后无差别轮询

      while true {
      
      select(streams[])
      
      for i in streams[] {
      
      if i has data
      
      read until unavailable
      
      }
      
      }

          于是,如果没有I/O事件产生,我们的程序就会阻塞在select处。但是依然有个问题,我们从select那里仅仅知道了,有I/O事件发生了,但却并不知道是那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。

          但是使用select,我们有O(n)的无差别轮询复杂度,同时处理的流越多,每一次无差别轮询时间就越长。再次

      说了这么多,终于能好好解释epoll了

          epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll之会把哪个流发生了怎样的I/O事件通知我们(放到event list里面,我们去读这个就行)。此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

        在讨论epoll的实现细节之前,先把epoll的相关操作列出:

      epoll_create 创建一个epoll对象,一般epollfd = epoll_create()

      epoll_ctl (epoll_add/epoll_del的合体),往epoll对象中增加/删除某一个流的某一个事件

      比如

      epoll_ctl(epollfd, EPOLL_CTL_ADD, socket, EPOLLIN);//注册缓冲区非空事件,即有数据流入

      epoll_ctl(epollfd, EPOLL_CTL_DEL, socket, EPOLLOUT);//注册缓冲区非满事件,即流可以被写入

      epoll_wait(epollfd,...)等待直到注册的事件发生

      (注:当对一个非阻塞流的读写发生缓冲区满或缓冲区空,write/read会返回-1,并设置errno=EAGAIN。而epoll只关心缓冲区非满和缓冲区非空事件)。

      一个epoll模式的代码大概的样子是:

      while true {
      
      active_stream[] = epoll_wait(epollfd)
      
      for i in active_stream[] {
      
      read or write till
      
      }
      
      }

          限于篇幅,我只说这么多,以揭示原理性的东西,至于epoll的使用细节,请参考man和google,实现细节,请参阅linux kernel source。

      《I/O多路复用之epoll实战 》I/O多路复用之epoll实战 - 23云恋49枫 - 博客园 

      多路复用

      如文初的说明表示,这三者都是 I/O 多路复用机制,且简要介绍了多路复用的定义,那么如何更加直观地了解多路复用呢?这里有张图:

       

      【epoll】形象的解释epoll|一句话讲透epoll

      对于网页服务器 Nginx 来说,会有很多连接进来, epoll 会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。

      一般来说以下场合需要使用 I/O 多路复用:

      • 当客户处理多个描述字时(一般是交互式输入和网络套接口)
      • 如果一个服务器既要处理 TCP,又要处理 UDP,一般要使用 I/O 复用
      • 如果一个 TCP 服务器既要处理监听套接口,又要处理已连接套接口

      一句话讲透epoll

      1. epoll概念

      在Linux的Man文档中,我们可以看到如下定义

      Epoll - I/O event notification facility
      epoll是一种I/O事件通知机制

      I/O事件

      • I/O
        输入输出(input/output),输入输出的对象可以是 文件(file), 网络(socket), 进程之间的管道(pipe), 在linux系统中,都用文件描述符(fd)来表示

      • 事件

        • 可读事件, 当文件描述符关联的内核读缓冲区可读,则触发可读事件
          什么是可读呢? 就是内核缓冲区非空,有数据可以读取
        • 可写事件, 当文件描述符关联的内核写缓冲区可写,则触发可写事件
          什么是可写呢?就是内核缓冲区不满,有空闲空间可以写入

      通知机制

      • 通知机制,就是当事件发生的时候,去通知他
      • 通知机制的反面,就是轮询机制

      以上两点结合起来理解

      epoll是一种当文件描述符的内核缓冲区非空的时候,发出可读信号进行通知,当写缓冲区不满的时候,发出可写信号通知的机制

      2. 水平触发与边缘触发

      水平触发(level-trggered)

      • 只要文件描述符关联的读内核缓冲区非空,有数据可以读取,就一直发出可读信号进行通知,
      • 当文件描述符关联的内核写缓冲区不满,有空间可以写入,就一直发出可写信号进行通知

      边缘触发(edge-triggered)

      • 当文件描述符关联的读内核缓冲区由空转化为非空的时候,则发出可读信号进行通知,
      • 当文件描述符关联的内核写缓冲区由满转化为不满的时候,则发出可写信号进行通知

      两者的区别在哪里呢?水平触发是只要读缓冲区有数据,就会一直触发可读信号,而边缘触发仅仅在空变为非空的时候通知一次,举个例子:

      1. 读缓冲区刚开始是空的
      2. 读缓冲区写入2KB数据
      3. 水平触发和边缘触发模式此时都会发出可读信号
      4. 收到信号通知后,读取了1kb的数据,读缓冲区还剩余1KB数据
      5. 水平触发会再次进行通知,而边缘触发不会再进行通知

      所以边缘触发需要一次性的把缓冲区的数据读完为止,也就是一直读,直到读到EGAIN为止,EGAIN说明缓冲区已经空了,因为这一点,边缘触发需要设置文件句柄为非阻塞

       

      //水平触发
          ret = read(fd, buf, sizeof(buf));
          
          //边缘触发
          while(true) {
              ret = read(fd, buf, sizeof(buf);
              if (ret == EAGAIN) break;
          }
      

      3. epoll接口介绍

      • epoll_create

        • 创建epoll实例,会创建所需要的红黑树,以及就绪链表,以及代表epoll实例的文件句柄

          int epoll_create(int size);
          Man文档中说明了在老的内核版本中,入参size用来指出创建的内部数据结构的大小,目前已经可以动态调整,但是为了兼容老的版本,所以仍然保留,这个size其实意义已经不大

      • epoll_ctl

        • 添加,修改,或者删除 注册到epoll实例中的文件描述符上的监控事件

          int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
          对于添加到epfd的文件描述符fd, 添加或者删除或者修改, 对应的event

          • epfd: 通过epoll_create创建的文件描述符
          • op:操作类型
            EPOLL_CTL_ADD, 为相应fd添加事件
            EPOLL_CTL_MOD, 修改fd的事件
            EPOLL_CTL_DEL,删除fd上的某些事件
          • 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 */
            };
            
              events可以是一组bit的组合
                  EPOLLIN:可读
                  EPOLLOUT: 可写
                  EPOLLET: 边缘触发,默认是水平触发
            
      • epoll_wait

        int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)
        等待注册的事件发生,返回事件的数目,并将触发的事件写入events数组中

        • epfd: epoll实例文件描述符
        • events: 数组出参,用来记录被触发的events,其大小应该和maxevents一致
        • maxevents: 返回的events的最大个数,如果最大个数大于实际触发的个数,则下次epoll_wait的时候仍然可以返回
        • timeout: 等待事件,毫秒为单位 -1:无限等待 0:立即返回

      了解以上这些,面试是足够了,但是对于工程中的实际使用,仍然不足,后续会以epoll在redis中的使用为例,为大家进行剖析

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/bandaoyu/article/details/84113172,作者:bandaoyu,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:错误的集合

      下一篇:哈希表(Hash table)

      相关文章

      2025-05-06 09:20:29

      【运维】如何检查电脑正常异常和关机日志? 1074正常关机或重启 6006正常关机 41非正常关机 6008异常关机

      【运维】如何检查电脑正常异常和关机日志? 1074正常关机或重启 6006正常关机 41非正常关机 6008异常关机

      2025-05-06 09:20:29
      事件 , 关机 , 日志
      2025-04-18 07:10:30

      React 事件机制原理

      React 的事件处理机制可以分为两个阶段:初始化渲染时在 root 节点上注册原生事件;原生事件触发时模拟捕获、目标和冒泡阶段派发合成事件。

      2025-04-18 07:10:30
      boolean , React , void , 事件 , 原生 , 浏览器
      2025-04-16 09:26:27

      告警抑制实例

      告警抑制实例

      2025-04-16 09:26:27
      告警 , 触发
      2025-04-15 09:18:30

      I/O 多路转接之 poll

      I/O 多路转接之 poll

      2025-04-15 09:18:30
      事件 , 函数 , 描述符
      2025-04-15 09:18:30

      五种 IO 模型介绍 与 fcntl实现 非阻塞 IO

      五种 IO 模型介绍 与 fcntl实现 非阻塞 IO

      2025-04-15 09:18:30
      IO , 异步 , 描述符 , 调用 , 阻塞
      2025-04-11 07:08:42

      关于 JavaScript 事件循环 Event Loop 的一些理解

      关于 JavaScript 事件循环 Event Loop 的一些理解

      2025-04-11 07:08:42
      JavaScript , 事件 , 任务 , 引擎 , 浏览器 , 队列
      2025-04-09 09:17:07

      ThreadPoolExecutor线程池的创建

      ThreadPoolExecutor线程池的创建

      2025-04-09 09:17:07
      线程 , 队列 , 阻塞
      2025-04-09 09:16:00

      Java线程的基础概念介绍(结合代码说明)

      线程是操作系统能够进行运算调度的最小单位,它是进程中的实际运作单位。每个线程执行的都是某一个进程的代码的某个片段。

      2025-04-09 09:16:00
      CPU , 多线程 , 方法 , 状态 , 线程 , 进程 , 阻塞
      2025-04-01 10:28:25

      laravel App\\Http\\Controllers\\Auth\\RegisterController 注册用户时候触发了一个没有Listener的是事件

      laravel App\\Http\\Controllers\\Auth\\RegisterController 注册用户时候触发了一个没有Listener的是事件

      2025-04-01 10:28:25
      laravel , 事件 , 注册 , 源码
      2025-04-01 10:28:16

      jq 获取第一个child的方法 以及ajax成化工和返回之后,怎么去使用触发该时间的元素

      jq 获取第一个child的方法 以及ajax成化工和返回之后,怎么去使用触发该时间的元素

      2025-04-01 10:28:16
      ajax , 获取 , 触发
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5252518

      查看更多

      最新文章

      React 事件机制原理

      2025-04-18 07:10:30

      告警抑制实例

      2025-04-16 09:26:27

      I/O 多路转接之 poll

      2025-04-15 09:18:30

      单选按钮控制页面部分的显示的流程

      2025-03-31 08:57:16

      【概率论与数理统计】第一章:概率论基本概念

      2025-03-17 07:50:46

      Android Compose的基本使用

      2025-03-12 09:32:31

      查看更多

      热门文章

      (18):事件

      2023-05-19 05:51:01

      javascript-事件

      2023-03-30 10:05:30

      深入理解Linux启动过程

      2023-05-12 07:20:42

      7. WPF事件

      2023-02-16 09:37:42

      indent用法,linux内核编码风格

      2023-06-19 06:58:36

      java事件处理机制

      2023-05-30 07:48:48

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Linux内核设计与实现(4)---Timers and Time Management

      vue3响应式

      indent用法,linux内核编码风格

      ECharts 折线图点击折线事件

      磁盘管理

      Android 什么是Hook

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号