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

织梦怎么制作手机网站辽宁省工程造价信息

织梦怎么制作手机网站,辽宁省工程造价信息,wordpress 不同分类页面,专业网站设计网络服务简介 五种IO模型   阻塞IO   非阻塞IO   信号驱动IO   IO多路转接    异步IO 代码书写 非阻塞IO 再次理解IO 什么是IO#xff1f;什么是高效的IO#xff1f; 为了理解后面的一个问题#xff0c;我们首先要再重新理解一下什么是IO 在之前的网络介绍中#xff…简介 五种IO模型           阻塞IO           非阻塞IO           信号驱动IO           IO多路转接            异步IO 代码书写         非阻塞IO 再次理解IO 什么是IO什么是高效的IO 为了理解后面的一个问题我们首先要再重新理解一下什么是IO 在之前的网络介绍中我们其实已经知道了IO的本质其实就是拷贝 通过前面的 网络 过程中我们所做的一切都是在把数据在拷贝来拷贝去但是等这个部分就是由操作系统来控制的因为把数据发送出去的前提是把数据从外设的磁盘中先把数据拷贝到发送缓冲区之中通常IO的大部分时间的占比都是 等 这个行为造成的拷贝数据其实快不了多少拷贝速度只能依靠设备自身的配置所以为了实现高效IO我们只能 等 这方面入手 所谓的高效就是把 等 的时间占比降低只要减少 等 就是在实现高效拷贝数据只能从硬件方面入手换设备之类的啊硬盘用SSD的啊这类不是我们需要考虑的我们这里只考虑 等 五种IO模型 我们用钓鱼的例子理解 故事背景 分析 解释 其中阻塞式IO、非阻塞式IO、信号驱动式IO、多路转接/多路复用、异步IP统称为IO的五种模型现在的全部的IO脱离不开这五种模型 需要注意的是我们通常大部分使用的其实还是阻塞式IO因为简单但是高效就是指的多路转接/多路复用 差别 阻塞IO 阻塞IO是最常见的IO模型 阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式. 非阻塞IO 非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码 非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一般只有特定场景下才使用. 信号驱动IO 信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作 IO多路转接 IO多路转接: 虽然从流程图上看起来和阻塞IO类似. 实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态. select只负责等这个行为并且可以等多个文件描述符是操作系统专门准备的一个接口recvfrom只负责拷贝这个行为也是操作系统专门准备的接口因为这两个接口是解耦的所以当select准备好了话那么recvfrom就一定有数据可以拷贝一定可以拷贝成功 并且进程\线程的消耗是比较大的但是多路转接就不会创建多个进程\线程于是它的成本也是比较低的 异步IO 异步IO: 由内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据) 操作系统自己等待数据进程只是发起者操作系统把数据都放在一个缓冲区之中当满的时候就直接执行进程传进来的方法就行了进程本身不参与IO等待任何一个行为 小结 任何IO过程中, 都包含两个步骤. 第一是等待, 第二是拷贝. 而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让IO更高效, 最核心的办法就是让等待的时间尽量少. 非阻塞IO 在代码接口中我们可以通过传递参数来使用哪一种IO读取方式 不过我们通常是有一个函数可以专门来解决这方面的问题的 函数fcntl 使用前先获取文件操作符 非阻塞选项 书写非阻塞转化函数 注意头文件的引入 阻塞式IO 如下图0号文件描述符就是stdin,这里直接就是代表了键盘的输入了 设置为非阻塞 直接把之前写的函数用上 这里因为0号是键盘而这里的1号就是屏幕因为非阻塞所以键盘的输入是不会影响屏幕的打印的这里的提示符一直在不停的循环打印(这里是sleep一秒的结果)0号当没有数据来的时候就会立刻返回这样就可以做其他的事情了 我们可以进一步封装当没有数据来的时候可以让它做其他的事情 在循环内不断调用这个函数 存放的函数用来演示作用 返回值怎么区别错误 因为非阻塞当它没有数据的时候会立即返回当你打印出来这个值的时候会发现是-1和错误信息返回用的同一个值那么我们如何区别真的错误还是因为没有数据导致的返回呢 我们再一次查看read接口的返回值就可以知道当被返回时还会有一个动作即错误码被立即设置 这时候我们可以直接通过打印出错误码的形式看到是因为什么原因导致的返回其次我们知道错误码本质上是一个个的宏利用这些宏我们就可以实现区分这些错误信息了 结果显示这里给的错误信息是资源未就绪这样我们就可以知道是什么原因了 其实在read返回值里面专门提供了这么一个宏来标识这类的信息 可以看出来其实就是 11 为此我们这样修改代码将空闲时候执行其他函数的行为放到错误码被置为-1并且本身不是错误的时候执行 这种错误其实是系统调用被中断了即当正在读取的时候一个信号过来直接把读取中断了这种错误也不算是失败错误所以再做一个判断 至此非阻塞就不再深入了 源码 makefile testNonBlock:main.ccg -o $ $^ -stdc11 .PHONY:clean clean:rm -f testNonBlock main.cc #include util.hpp #include cstdio #include vector #include functionalusing func_t std::functionvoid();// 这是一个宏函数用来把函数加载到数组当中去的 #define INIT(v) \do \{ \v.push_back(pringLog); \v.push_back(download); \v.push_back(executeSql); \} while (0)// 这是一个宏函数用来运行函数数组里面存放的函数的 #define EXEC_OTHER(cbs) \do \{ \for (auto const cb : cbs) \cb(); \} while (0)int main() {std::vectorfunc_t cbs;INIT(cbs); // 调用宏函数运行存放在函数数组中的函数的setNonBlock(0);char buffer[1024];while (true){printf( ); // 提示符fflush(stdout);ssize_t s read(0, buffer, sizeof(buffer) - 1);if (s 0){buffer[s - 1] 0;std::cout echo# std::endl;}else if (s 0){std::cout read end std::endl;break;}else{// 1.当不输入的时候底层没有数据这算是错误吗 不算错误只不过以错误的形式返回了(-1)// 2.那么如何区别真的错误还是因为底层没有数据导致的错误返回// std::cout EAGAIN: EAGAIN EWOULDBLOCK: EWOULDBLOCK std::endl;if (errno EAGAIN){std::cout 我没错, 只是没有数据 std::endl;EXEC_OTHER(cbs); // 宏调用用来把函数加载到函数数组中去}else if(errno EINTR){continue; // 系统信号导致的返回直接让它继续读取就行了}else{//这类表示真正的错误在前面已经把其他非错误的错误码处理解决之后将错误信息打印出来std::cout s : s errno: strerror(errno) std::endl;break;}}sleep(1);} } util.hpp #pragma once#include iostream #include unistd.h #include fcntl.h #include cstring #include cerrno// 这是一个讲文件描述符转为非阻塞式的函数 void setNonBlock(int fd) {int f1 fcntl(fd, F_GETFL);if(f1 0){std::cerr fcntl : strerror(errno) std::endl;return;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK); // 设置为非阻塞 }// 工具函数 void pringLog() {std::cout this is a log std::endl; }void download() {std::cout this is a download std::endl; }void executeSql() {std::cout this is a executeSql std::endl; } 下期预告I/O多路转接之select
http://www.zqtcl.cn/news/296181/

相关文章:

  • 网站建设seo网络推广专业的营销团队哪里找
  • 能用的网站关于申请开通网站建设的请示
  • 蓬莱网站建设哪家专业怎么样模仿网站
  • 网站建设有什么好处如何查看网站开发源码
  • 惠州做棋牌网站建设哪家好老域名新网站
  • 机械毕业设计代做网站如何快速模仿一个网站
  • seo网站推广优化就找微源优化网页设计自学要多久
  • 网站资源做缓存国外做饮料视频网站
  • 用asp.net做的购物网站西安手机网站制作
  • wordpress 自定义主题wordpress自带数据库优化
  • 电子商务网站建设与维护的考试用自己的电脑做网站划算
  • 微商招商网站源码wordpress怎么改后台
  • 哪些网站有搜索引擎作弊的社群营销平台有哪些
  • 建地方的网站前景苏州做视频网站广告公司
  • 制作网站的主题海口网站自助建站
  • dede二手车网站源码网络工程师
  • 吴桥网站新网站优化怎么做
  • 做网站要求什么条件0资本建设网站
  • 免费做网站排名洛阳软件开发公司有哪些
  • 网站搜索优化方法东莞seo全网营销
  • 广州微网站建设哪家好wordpress怎样将小工具放到左侧
  • 汕头网站搜索优化嘉兴网络项目建站公司
  • 怎么查询网站是什么时候做的网站app的意义
  • 曹妃甸网站建设合肥的房产网站建设
  • 怎么做网站前台二级区域网站名
  • 服务器租用相关网站一个空间怎么放两个网站吗
  • 每个城市建设规划在哪个网站南宁seo怎么做优化团队
  • 做资讯类网站ccd设计公司官网
  • 写作网站5妙不写就删除抚州建设网站
  • 沙田网站建设公司网站风格设计原则