当前位置: 首页 > 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.pierceye.com/news/296181/

相关文章:

  • 邯郸做网站推广找谁jsp做的网站代码
  • php网站开发怎么接私活全能医院网站管理系统
  • 观止网站建设10元建站
  • 什么网站做聚乙烯醇好的三亚旅游攻略
  • 建设网站目的直播间网站开发
  • 网站项目评价怎么在网站上做签到
  • 深圳网站建设制作哪家好长春网站开发培训
  • 模板下载网站网络公司网站开发
  • 广州市酒店网站设计重庆网站seo设计
  • p2p网站如何建设网站建设 源美设计
  • 电商网站建设图片ps网站首页设计图
  • 网站优化简历模板用土豆做美食的视频网站
  • 帮企业建设网站销售微信朋友圈广告在哪里做
  • 曲阜做网站的公司wordpress两个域名
  • 做设备租赁的网站如何把自己做的网站发布到网上
  • 做网站运营有前景吗关于网站建设意见和建议
  • 如何给网站的关键词做排名南海做网站公司
  • 仿站软件邢台手机网站建设价格
  • 学校网站开发与设计什么是网络营销促销?
  • 胶州网站搭建企业wordpress站内信群发
  • WordPress做的网站源代码网站备案失效
  • 承德网站制作与建设wordpress h5播放器
  • .net网站程序网站建设 报告
  • 中国做的电脑系统下载网站好互动网站
  • 网站使用培训方案网站后台工程师
  • 做网站优化找谁简单网站页面
  • 青岛做公司网站佛山网站建设锐艺传播
  • 江苏商城网站制作公司网站备案时间
  • 网站开发用到什么技术公司做影视网站侵权
  • 自己做网站大概多少钱唐山丰南建设局网站