当前位置: 首页 > news >正文

网络文化有限公司网站建设策划书海外免费网站推广

网络文化有限公司网站建设策划书,海外免费网站推广,如何自己做网站站长,注册域名网站前言#xff1a;对于传统的BIO#xff08;同步阻塞#xff09;模型#xff0c;当有客户端连接达到服务端#xff0c;服务端在对改连接进行连接建立#xff0c;和数据传输过程中#xff0c;是无法响应其他客户端的#xff0c;只有当服务端完成对一个客户端处理后#x…前言对于传统的BIO同步阻塞模型当有客户端连接达到服务端服务端在对改连接进行连接建立和数据传输过程中是无法响应其他客户端的只有当服务端完成对一个客户端处理后才能去处理其他客户端的连接管道的读写请求如果只有几个客户端连接还好如果现在需要多个客户端都连接到服务端就很有可能造成多个客户端的阻塞虽然可以引入多线程技术每个客户端进入都交由一个线程进行处理如果有成千上万个客户端就需要维护n多个线程显然线程并不是越多越好它除了会占用大量资源也会造成上下文的频繁切换那么有没有其它方式来解决呢。 1 同步阻塞IO数据接收过程 用户进程创建socket 并与服务端建立tcp连接用户进程向内核空间所要数据如果内核空间中没有数据则将当前进程放入到socket 等待队列没个socket都有一个等待队列进程等待队列存放了服务端的用户进程 A 的进程描述符和回调函数并挂起当前进程让出CPU资源当服务端有数据返回达到客户端电脑的网卡数据进入准备阶段向cpu 发出中断信息号并将数据从网卡拷贝到系统空间数据准备完成每个socket 中都有一个数据接收队列内核收到中断信号后会将网卡复制到内存的数据根据数据报文的 IP 和端口号将其拷贝到内核中对应 socket 的接收队列cpu将内核空间的数据拷贝到对应进程下的用户空间中复制阶段完成遍历socket 的等待队列从socket 等待队列中移除对应的进程将对应的进程放回到工作队列中进程获取cpu时间片从进程下的用户空间获取数据进程 获取 CPU片 后会回到之前调用 recvfrom() 函数时阻塞的位置继续执行这时发现 socket 内核空间的等待队列上有数据会在内核态将内核空间的 socket 等待队列的数据拷贝到用户空间然后才会回到用户态执行进程的用户程序从而真的解除阻塞 2 CPU 对于任务的处理 我们知道系统中进程的运行依赖于从CPU获得时间片只有在工作队列中的进程才有获的CPU时间片的机会 当一个进程发生阻塞时会从工作队列中进行移除并将改进程放入到阻塞队列中 当发生中断时会将阻塞队列中满足条件的进程从阻塞队列中移除并将其重新加入到工作队列中如果我们将CPU看做是一个服务端将多个进程看做是与其连接的客户端是否也可以只有一个线程来管理多个客户端我们将客户端统一放入到一个地方只有当客户端满足一定的条件可以将其看做是可以进行数据处理的客户端并将其放入一个有效队列中然后程序中只与有效队列中的客户端进行通信 3 NIO 多路复用IO: IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取它就通知该进程进行处理多路复用通过将关心的socket 都注册到一个Select 上,由Select 完成对多个socket 的监听当发现有通道准备就绪可读或者可写就告诉进程来处理 3.1 select,poll 的实现方式 本文中socket 内核对象 ≈ fd 文件描述符 ≈ TCP连接服务端通过将连接到的socket 的文件描述符放入到一个集合中然后将改socket集合拷贝到内核空间内核空间通过遍历文件描述符集合的方式当有事件发生将对应的socket 标记为可读或可写然后将socket 集合拷贝到用户空间用户空间遍历socket 集合找到可读或者可写的socket 进行处理 过程 1当进程A调用select语句的时候会将socket 集合拷贝到内核空间并将进程A添加到多个监听socket的等待队列中: 2当网卡接收到数据然后网卡通过中断信号通知cpu有数据到达执行中断程序中断程序主要做了两件事 将网络数据写入到对应socket的接收缓冲区里面;唤醒队列中的等待进程(A),重新将进程A放入工作队列中. 3工作队列的线程A 获取cpu时间片将数据从内核的socket 数据接收队列中将数据拷贝到用户空间用户空间的进程从用户空间获取数据进行处理 3.2 select,poll 区别 select和poll在内部机制方面并没有太大的差异。相比于select机制poll只是取消了最大监控文件描述符数限制并没有从根本上解决select存在的问题。 select 使用固定长度的 BitsMap表示文件描述符集合而且所支持的文件描述符的个数是有限制的在 Linux 系统中由内核中的 FD_SETSIZE 限制 默认最大值为 1024只能监听 0~1023 的文件描述符。poll 不再用 BitsMap 来存储所关注的文件描述符取而代之用动态数组以链表形式来组织突破了 select 的文件描述符个数限制当然还会受到系统文件描述符限制。但是 poll 和 select 并没有太大的本质区别都是使用「线性结构」存储进程关注的 Socket 集合因此都需要遍历文件描述符集合来找到可读或可写的 Socket时间复杂度为 O(n)而且也需要在用户态与内核态之间拷贝文件描述符集合这种方式随着并发数上来性能的损耗会呈指数级增长。 select,poll 问题 在网络中往往可以进行通信的只是占所有socket 的一部分每次调用 Select 都需要将进程加入到所有监视 Socket 的等待队列而每次唤醒都需要从每个socket等待队列中移除。这里涉及了两次遍历而且每次都要将整个 FDS 列表传递给内核有一定的开销。进程被唤醒后程序并不知道哪些 Socket 收到数据还需要遍历一次 3.3 epoll 的实现方式 3.3.1 epoll 在原有的select,poll 主要解决socket多次遍历问题 1 epoll 中放弃了数组使用红黑树来存放关心的socket 这样每次添加socket和移除socket 只需要遍历红黑树 时间复杂度 O(logn)epoll 在内核里使用红黑树来跟踪进程所有待检测的文件描述字把需要监控的 socket 通过 epoll_ctl() 函数加入内核中的红黑树里红黑树是个高效的数据结构增删查一般时间复杂度是 O(logn)通过对这棵黑红树进行操作这样就不需要像 select/poll 每次操作时都传入整个 socket 集合只需要传入一个待检测的 socket减少了内核和用户空间大量的数据拷贝和内存分配。 2 epoll 使用事件驱动的机制内核里维护了一个链表来记录就绪事件当某个 socket 有事件发生时通过回调函数内核会将其加入到这个就绪事件列表中当用户调用 epoll_wait() 函数时只会返回有事件发生的文件描述符的个数不需要像 select/poll 那样轮询扫描整个 socket 集合大大提高了检测的效率。 epoll 的方式即使监听的 Socket 数量越多的时候效率不会大幅度降低能够同时监听的 Socket 的数目也非常的多了上限就为系统定义的进程打开的最大文件描述符个数. 3.3.2 epoll 的事件触发机制 epoll 支持两种事件触发模式分别是边缘触发edge-triggeredET和水平触发level-triggeredLT 使用边缘触发模式时当被监控的 Socket 描述符上有可读事件发生时服务器端只会从 epoll_wait 中苏醒一次即使进程没有调用 read 函数从内核读取数据也依然只苏醒一次因此我们程序要保证一次性将内核缓冲区的数据读取完 使用水平触发模式时当被监控的 Socket 上有可读事件发生时服务器端不断地从 epoll_wait 中苏醒直到内核缓冲区数据被 read 函数读完才结束目的是告诉我们有数据需要读取 1如果使用水平触发模式当内核通知文件描述符可读写时接下来还可以继续去检测它的状态看它是否依然可读或可写。所以在收到通知后没必要一次执行尽可能多的读写操作。 2如果使用边缘触发模式I/O 事件发生时只会通知一次而且我们不知道到底能读写多少数据所以在收到通知后需要一次性的把缓冲区的数据读完为止也就是一直读直到读到EGAIN(EGAIN说明缓冲区已经空了)为止否则可能出现读取数据不完整的问题。因此我们会循环从文件描述符读写数据那么如果文件描述符是阻塞的没有数据可读写时进程会阻塞在读写函数那里程序就没办法继续往下执行。所以边缘触发模式一般和非阻塞 I/O 搭配使用程序会一直执行 I/O 操作直到系统调用如 read 和 write返回错误错误类型为 EAGAIN 或 EWOULDBLOCK。 3一般来说边缘触发的效率比水平触发的效率要高因为边缘触发可以减少 epoll_wait 的系统调用次数系统调用也是有一定的开销的的毕竟也存在上下文的切换。 4select/poll 只有水平触发模式epoll 默认的触发模式是水平触发但是可以根据应用场景设置为边缘触发模式。 5多路复用 API 返回的事件并不一定可读写的在Linux下select() 可能会将一个 socket 文件描述符报告为 “准备读取”而后续的读取块却没有。例如当数据已经到达但经检查后发现有错误的校验和而被丢弃时就会发生这种情况。也有可能在其他情况下文件描述符被错误地报告为就绪如果使用阻塞 I/O 那么在调用 read/write 时则会发生程序阻塞因此最好搭配非阻塞 I/O以便应对极少数的特殊情况。 3 总结 传统的BIO通信为了支持多个客户端通信需要多个线程来维护socket有多少个客户端就需要有多少个线程线程过多会造成频繁的cpu 上下文切换占有大量资源且执行效率低为了解决多个线程问题引入NIO 多路复用通过将多个感兴趣的socket 注册到selctor 中然后在拷贝到内核空间有内核空间监测事件的发生标记对应的socket 可读可写然后用户空间的线程在遍历每个socket 对可读或者可写的socket 进行数据通信处理但是随着socket 的增多显然 感兴趣的socket 集合会越来越大频繁的遍历和复制socket 集合也会占用资源使用epoll 模型通过将感兴趣的socket 放入到红黑树中进行遍历并将可读可写的socket 单独放入到链表中这样及时大量的客户端连接增删socket 和复制可读可写的socket 链表效率依然很高selectpollepoll本质上都是同步I/O因为他们都需要在读写事件就绪后自己负责进行读写也就是说这个读写过程是阻塞的在早期的JDK1.4和1.5 update10版本之前Selector基于select/poll模型实现在JDK1.5 update10和linux core2.6以上版本sun优化了Selctor的实现底层使用epoll替换了select/poll 参考 1 Select、Poll、Epoll详解 2 深入学习IO多路复用select/poll/epoll实现原理 3 这次答应我一举拿下 I/O 多路复用
http://www.dnsts.com.cn/news/1384.html

相关文章:

  • 文化类网站的前置审批百度q3财报减亏170亿
  • vivo官方网站进入简述优化搜索引擎的方法
  • wordpress上传doc文件大小厦门网站综合优化贵吗
  • 简单的网站设计案例长春网站建设路
  • 做语文高考题网站网络服务器价格
  • 网站关键字优化地点自媒体视频发布平台
  • 网站管理过程你就知道
  • 网站目录程序广东seo网站优化公司
  • app可以申请专利吗石家庄seo网络优化的公司
  • wordpress 三款站群插件之比较网站销售怎么推广
  • 茂易网站建设免费做网站
  • 网站域名如何管理青岛seo结算
  • 河南服务器托管浙江专业网站seo
  • 合肥市建设通网站seo推广案例
  • 网站后台更新无法在网页显示免费观看行情软件网站进入
  • 南阳哪有做网站公司知乎推广渠道
  • 网站建设平台优量汇广告平台
  • 网站互点联盟竞价排名名词解释
  • 宁波网站推广优化公司百度seo找哪里
  • 济南互联网网站建设价格平谷头条新闻
  • 武汉市大型的网站制作公司一手渠道推广平台
  • 做私活网站今天最新消息
  • 东莞网站建设效果seo分析工具
  • 电商是什么?一般是干嘛的兰州seo
  • 网站文章更新注意什么宣传推广计划
  • 企业网站建设模拟实验产品推广
  • 做网站是什么专业什么工作谷歌账号
  • 网站建设信息在哪儿发布贵港网站seo
  • 动漫网站建设网络优化工程师招聘信息
  • html5网站修改优化公司结构