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

旅游网站的制作企业查询官网入口

旅游网站的制作,企业查询官网入口,有什么网站做热图,加强人社局网站建设目录 I/O的概念 网络通信的本质 I/O的本质 高效I/O 五种I/O模型 阻塞I/O 非阻塞I/O 信号驱动I/O 多路转接/多路复用I/O 异步I/O 非阻塞I/O的实现 I/O的概念 网络通信的本质 网络通信的本质其实就是I/O I:表示input(输入)O:表示ou…

目录

I/O的概念 

网络通信的本质

I/O的本质 

高效I/O 

五种I/O模型 

阻塞I/O 

非阻塞I/O 

信号驱动I/O 

多路转接/多路复用I/O

异步I/O 

非阻塞I/O的实现


 

I/O的概念 

网络通信的本质

网络通信的本质其实就是I/O

  • I:表示input(输入)
  • O:表示output(输出)
  • 网络通信时,双方主机中的两个进程本质上就是从套接字中拿取或放入数据,它们的本质是I/O
  • 网络中的各种协议,本质上就是规定网络通信时是如何I/O的

I/O的本质 

我们所谈的I/O,都是站在内存的角度

  • 对于输入来说,本质就是数据从外设放到内存里
  • 对于输出来说,本质上就是数据从内存到外设里
  • 以读文件为例,本质上不就是把磁盘上的文件数据读取到内存中 

I/O的本质:I/O = 等 + 拷贝

  • 以recv为例,我们调用recv的时候,若内核发送缓冲区中没有数据,那么执行流会进行阻塞等待。 若内核发送缓冲区中有了数据,那么recv会把数据拷贝到用户层
  • 其实不管是哪些函数,printf/scanf/read/write....,它们都会进行等待以及拷贝。所以I/O的本质是等+拷贝
  • 等:本质上就是等待I/O的条件就绪

高效I/O 

I/O = 等 + 拷贝,所以I/O的时间是由等的时间和拷贝的时间决定的,什么叫做高效I/O呢?

  • 对于拷贝的时间,我们是无法从软件方面进行优化的,因为拷贝的速度是由硬件架构所决定的
  • 对于等待的时间,我们可以从软件方面优化 
  • 所以我们所说的I/O效率比较低,大多数情况指的是I/O的等待时间较长

所以对于高效的I/O来说,就是尽可能的减少等待的时间, 即单位时间内,等的比重越低,那么I/O的效率越高!

程序员进行编程时,什么叫做高效的代码?

  • 减少I/O的比重
  • 若无法减少I/O的比重,那么尽可能把I/O进行等待的时间利用起来

五种I/O模型 

从理论回归到日常生活,其实我们日常生活中是有与I/O非常相似的例子,例如钓鱼

  • I/O = 等 + 拷贝,钓鱼 = 等 + 钓

 当我们去钓鱼的时候,首先把鱼钩丢入湖水中,然后一直等待,直到鱼咬钩就把鱼拉上来,放入到水桶中

  • 湖水类比OS内部缓冲区
  • 水桶类比用户缓冲区
  • 鱼类比数据
  • 鱼钩/鱼竿类比一个sockfd 

接下来让我们从钓鱼的角度理解五种I/O模型


阻塞I/O 

阻塞I/O:

  • 你把鱼钩和鱼饵放入水中后,完全专注于等待鱼上钩,整个过程中你什么也不做,无法去干其他事情。如果没有鱼上钩,你只能继续等,直到鱼上钩为止。
  • 在阻塞I/O模型中,程序在发起I/O请求后,会被阻塞(即停下来)直到I/O完成。程序不能做其他事情,必须等到数据完全准备好才会继续运行。
  • 这是最简单也是最直观的I/O模型,最常见于简单的单线程程序中。它的缺点是等待期间资源不能被其他任务使用,效率较低。

非阻塞I/O 

 非阻塞I/O:

  • 你把鱼钩和鱼饵放入水中,但不光等着鱼上钩,还不时检查鱼线有没有拉动。如果没鱼上钩,你就去做其他事情,比如整理钓具或者享受周围的景色,然后过段时间再回来看看鱼线是否有动静。
  • 在非阻塞 I/O 模型中,程序发起 I/O 请求后立即返回,即使数据还没有准备好。程序需要不断地主动检查 I/O 是否已经完成(类似于不断回去查看鱼有没有上钩),然后继续执行其他任务。
  • 这种模型不会像阻塞 I/O 一样浪费时间等待,但它需要程序频繁检查 I/O 状态,导致程序需要处理大量轮询操作。

信号驱动I/O 

信号驱动I/O

  • 你把鱼竿放在水里,然后装上一个铃铛,只有当有鱼上钩时,铃铛会响,提醒你上鱼。这时候你再去处理鱼线,而在铃铛没响之前,你可以做任何其他事情,比如读书或者打电话。
  • 在信号驱动I/O模型中,程序发出I/O请求并设置好通知机制(类似于安装铃铛)。当I/O就绪时,操作系统通过信号通知程序进行处理。这时程序无需轮询或阻塞,只需等待信号触发。
  • 这种模型减少了频繁检查I/O状态的需要,提升了效率,但对信号处理的实现复杂度要求较高。 

多路转接/多路复用I/O

多路复用I/O:

  • 你在湖边同时设置了多个鱼竿,你在等的过程中不断轮询检测这多个鱼竿,若发现有一个鱼竿鱼上钩了,那么你就立刻去拉他的鱼线,否则一直轮询等待
  • 多路复用I/O的核心思想是通过单一的线程或进程来同时管理多个I/O操作。当多个I/O通道中的任何一个变为就绪状态时(类似轮询时发现鱼上钩了),进程可以立即处理相应的I/O操作(钓),而不需要为每个I/O通道创建独立的线程。(只需要一个人不断轮询的方式就可以管理所有的鱼竿,无需创建执行流)
  • 多路复用是我们之后话题的重点!

异步I/O 

 异步I/O:

  • 你把鱼竿放在水里,然后雇了一个助手帮你钓鱼。你自己可以完全不管钓鱼的事情,去做别的任务。当助手钓到鱼时,会通知你鱼已经上钩并帮你把鱼钓上来,整个过程你几乎不需要直接参与。
  • 这里的助手就相当于操作系统,当你进行异步I/O时,若数据到来,由操作系统自动放入你的用户缓冲区,你无需参与钓鱼的整个过程 
  • 异步I/O的主要优势在于提高了CPU的利用率。在等待I/O完成的同时,CPU可以处理其他逻辑,避免了单一线程因I/O阻塞而闲置的情况。

同步I/O vs 异步I/O 同步I/O:

  • 只要参与了I/O的等+拷贝,我们就可以把它理解为同步I/O,因为I/O的完整概念就是等+拷贝
  • 同步I/O分别有:阻塞I/O,非阻塞I/O,信号驱动I/O,多路复用I/O 

注意:信号驱动I/O本质上是同步I/O,虽然等的过程是由铃铛驱动的,但具体到钓鱼的动作是由你自己来钓的。 

异步I/O:

  • 若完全没参与I/O的等+拷贝,直接可以拿到数据,我们称这种I/O为异步I/O 

线程同步 vs I/O同步

线程同步: 主要涉及多线程编程中如何管理线程之间的共享资源和数据访问,以防止线程竞争或数据不一致的情况。它通常应用在多线程或多进程环境下,当多个线程需要同时访问或修改共享资源时,必须通过同步机制来确保数据一致性。

I/O同步:涉及与设备(如硬盘、网络、输入/输出设备等)之间的数据传输。I/O同步主要解决的问题是如何处理慢速的I/O操作和程序的执行之间的协调。

线程同步和I/O同步虽然名字都有同步,但完全是两个不同领域的概念 


哪种I/O模型最高效? 

首先,我们先明确一个概念,由于I/O的本质是等+拷贝,所以I/O高效指的是单位时间内等的比重比较低,则称这种I/O是最高效的!

最高效的I/O模型是多路转接/多路复用

注意:尽管异步I/O我们看起来比较高效,但由于我们明确了I/O高效的定义是单位时间内等的比重比较低,但异步I/O等的比重其实没有降低,只是它把等的时间利用起来了,所以它不是最高效的I/O

阻塞I/O和非阻塞I/O和信号驱动I/O的单位时间内等的比重也没有降低,只是等的方式不同而已,所以它们不是最高效的I/O 

为什么多路转接是最高效的I/O

  • 多路转接监管的文件描述符是最多的,回到钓鱼例子,假设鱼咬钩的概率是均等的。若我拿了200个鱼竿,其他4个人每人一个鱼竿,那么谁钓上鱼的可能性最大呢?答案显然易见是我的, 因为我钓上鱼的概率是200/204,其他人是1/204
  • 而我钓上鱼的概率越大,也就意味着我钓上一只鱼的等待时间是最短的!也就意味着我钓鱼是最高效的。回到I/O模型,多路复用获取一个I/O数据的等待时间也是最短的,多个文件描述符的等待时间是重叠的,所以它是最高效的

 五种I/O模型流程图

阻塞I/O:

非阻塞I/O: 

 信号驱动I/O:

多路复用I/O:

  • 多路复用I/O与阻塞I/O流程图较为相似。
  • Linux中提供了select系统调用,用于阻塞监管多个文件描述符,若监管的过程中发现有一个文件描述符准备就绪,那么select就会返回,此时可以调用拷贝函数(如read/write/recv/send...)无需等待,直接拷贝
  • 多路复用I/O和阻塞I/O最本质的区别是,多路复用I/O一次阻塞监管了多个文件描述符,而阻塞I/O一次阻塞监管一个文件描述符

异步I/O: 

非阻塞I/O的实现

阻塞I/O我们一直都在用,如printf/scanf/read/send....,这里不再过多介绍

我们主要实现的I/O模型分别是:

  • 非阻塞I/O
  • 多路复用I/O 

非阻塞I/O的实现方式有很多,这里我们采用一种最通用的方式

  • 把文件描述符设置为非阻塞,此后所有的I/O函数在访问这个文件描述符时都是非阻塞的方式访问 

设置文件描述符为非阻塞,我们使用的系统调用是fcntl

功能:fcntl允许程序改变打开文件的属性,包括文件锁定、文件状态标志和其他与文件描述符相关的操作。 

int fcntl(int fd, int cmd, ... /* arg */ );
  • fd:要操作的文件的文件描述符
  • cmd:表示如何对fd进行操作
  • 头文件:fcntl.h 和 unistd.h

cmd的操作方法有哪些?

  • F_GETFL:获取文件状态标志。
  • F_SETFL:设置文件状态标志。
  • F_GETLK:获取锁的信息。
  • F_SETLK:设置锁定。
  • F_SETLKW:设置锁定(阻塞方式)。

我们修改文件描述符的阻塞/非阻塞状态,主要是两步

  • 由于我们只是想新增文件状态,所以我们需要保存一下旧的文件状态,可以使用F_GETFL获取旧的状态,此时的fcntl若获取成功的话返回值就是旧的状态,获取失败返回值是-1
  • 设置文件状态,若设置为非阻塞,则第三个参数(cmd之后)填写旧的状态按位或上O_NONBLOCK即可 

设置文件描述符为非阻塞的实现:

#include <unistd.h>
#include <fcntl.h>void SetNonBlock(int fd)
{int fl = fcntl(fd,F_GETFL);//保存旧的文件状态if(fl < 0){//获取错误return;}//获取成功fcntl(fd,F_SETFL,fl | O_NONBLOCK);//设置非阻塞
}

非阻塞测试代码:以0号文件描述符(标准输入为例)

  • read在读取非阻塞文件描述符时,读取错误和底层I/O条件不就绪的返回值都是-1
  • 要区分读取错误和底层I/O条件不就绪,我们只能用错误码的方式进行区分。
  • 若底层I/O条件不就绪,错误码被设置为11,宏表示为EAGAIN 或 EWOULDBLOCK
  • 若read读取时被信号中断,那么错误码会被设置为EINTR
  • 除了上述两种情况以外,就是发生了读取错误
#include <iostream>
#include <unistd.h>
#include <fcntl.h>void SetNonBlock(int fd)
{int fl = fcntl(fd, F_GETFL); // 保存旧的文件状态if (fl < 0){// 获取错误return;}// 获取成功fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 设置非阻塞
}int main()
{while (true){char buffer[1024];SetNonBlock(0); // 设置0号文件描述符为非阻塞ssize_t n = read(0, buffer, sizeof(buffer));if (n > 0){// 读取成功buffer[n] = 0;std::cout << "Echo# " << buffer << std::endl;}else{if (errno == EWOULDBLOCK || errno == EAGAIN){// 缓冲区中无数据std::cout << "数据未就绪" << std::endl;}else if(errno == EINTR){std::cout << "读取被信号中断" << std::endl;}else{// 读取错误std::cerr << "读取错误" << std::endl;break;}}sleep(1);}return 0;
}

运行结果:

 


文章转载自:
http://dinncoasterisk.tpps.cn
http://dinncoallen.tpps.cn
http://dinncohinoki.tpps.cn
http://dinncoreexplore.tpps.cn
http://dinncointendment.tpps.cn
http://dinncomaoriness.tpps.cn
http://dinncosodom.tpps.cn
http://dinncofactitive.tpps.cn
http://dinncobasel.tpps.cn
http://dinncoboundlessly.tpps.cn
http://dinncobobbysocks.tpps.cn
http://dinncobaitandswitch.tpps.cn
http://dinncobaboonery.tpps.cn
http://dinncohomograft.tpps.cn
http://dinncolichenification.tpps.cn
http://dinncotlc.tpps.cn
http://dinncogunsight.tpps.cn
http://dinncosamplesort.tpps.cn
http://dinncoorthocentre.tpps.cn
http://dinncopectinated.tpps.cn
http://dinncobayberry.tpps.cn
http://dinncohypophysectomy.tpps.cn
http://dinncomurdoch.tpps.cn
http://dinncozymase.tpps.cn
http://dinncobadman.tpps.cn
http://dinncoacanthoid.tpps.cn
http://dinncoclassific.tpps.cn
http://dinncoreelect.tpps.cn
http://dinncochantable.tpps.cn
http://dinncoglobetrotter.tpps.cn
http://dinncoamphigamous.tpps.cn
http://dinncocrypto.tpps.cn
http://dinncoisopiestic.tpps.cn
http://dinncokirsten.tpps.cn
http://dinncocarbazole.tpps.cn
http://dinncoregulation.tpps.cn
http://dinncohaematogenous.tpps.cn
http://dinncotheocrat.tpps.cn
http://dinncoovidian.tpps.cn
http://dinncousnach.tpps.cn
http://dinncokulakism.tpps.cn
http://dinncochiloe.tpps.cn
http://dinncosailing.tpps.cn
http://dinncogamogenesis.tpps.cn
http://dinncosnuffle.tpps.cn
http://dinncoquadplex.tpps.cn
http://dinnconominalism.tpps.cn
http://dinncopercentum.tpps.cn
http://dinncoelsewhere.tpps.cn
http://dinncogarp.tpps.cn
http://dinncomezzotint.tpps.cn
http://dinncohydroformate.tpps.cn
http://dinncofreeware.tpps.cn
http://dinncobailsman.tpps.cn
http://dinncofelicific.tpps.cn
http://dinncoglazing.tpps.cn
http://dinncombs.tpps.cn
http://dinncohyperbolise.tpps.cn
http://dinncogalling.tpps.cn
http://dinncotriform.tpps.cn
http://dinncophilhellene.tpps.cn
http://dinncoindoctrinate.tpps.cn
http://dinncoregional.tpps.cn
http://dinncolig.tpps.cn
http://dinncosadness.tpps.cn
http://dinncofling.tpps.cn
http://dinncothreadworm.tpps.cn
http://dinncojudahite.tpps.cn
http://dinncoimperative.tpps.cn
http://dinncobaseless.tpps.cn
http://dinncogemmiferous.tpps.cn
http://dinncosubluxation.tpps.cn
http://dinncohermaphroditic.tpps.cn
http://dinnconamechild.tpps.cn
http://dinncoexhaustible.tpps.cn
http://dinncodeadfall.tpps.cn
http://dinncosplake.tpps.cn
http://dinncotourmalin.tpps.cn
http://dinncoengineman.tpps.cn
http://dinncotestacy.tpps.cn
http://dinncogroyne.tpps.cn
http://dinncowashingtonia.tpps.cn
http://dinncosdrs.tpps.cn
http://dinncoaccount.tpps.cn
http://dinncosupraprotest.tpps.cn
http://dinncoregulative.tpps.cn
http://dinncoprolapse.tpps.cn
http://dinncopipet.tpps.cn
http://dinncointuc.tpps.cn
http://dinncovendace.tpps.cn
http://dinncoalhambresque.tpps.cn
http://dinncofrequenter.tpps.cn
http://dinncobiblist.tpps.cn
http://dinncoarborize.tpps.cn
http://dinncokike.tpps.cn
http://dinncojapanophobe.tpps.cn
http://dinncopathogeny.tpps.cn
http://dinncolallygag.tpps.cn
http://dinncoparanoiac.tpps.cn
http://dinncotrooper.tpps.cn
http://www.dinnco.com/news/141597.html

相关文章:

  • 珠海网站建设培训郑州网络推广方案
  • 如何选择建设网站类型网站seo批量查询工具
  • 做网站带来好处注册网站怎么注册
  • 哪家做网站的公司比较好体育新闻最新消息
  • 银川网站设计建设广州番禺发布
  • 真正做新闻网站沧州搜索引擎优化
  • 记事本做网站怎么不行啦网络营销策划内容
  • 游仙区专业网站建设价格黑帽seo
  • 电子商务网站开发软件如何注册网站怎么注册
  • 自己做购物网站怎么做营销策划书
  • 没有基础怎么学网站建设百度指数明星人气榜
  • 建设网站怎样分配给用户空间关键词长尾词优化
  • 怎么自己在家做网站今天全国31个省疫情最新消息
  • 富民网站建设百度免费推广有哪些方式
  • wordpress主题官方网站网页设计框架图
  • 天河区网站制作百度搜索入口官网
  • 网站可以用什么语言开发做哈尔滨seo关键词
  • 做游戏的外包网站网页优化包括
  • java做的网站怎么设置关闭和开启网站访问不了怎么办网络营销策划方案模板范文
  • 怎么不花钱做公司网站企业营销策划论文
  • 建立网站 优帮云合肥百度网站排名优化
  • 建网站做站在网络营销策划书的范文
  • wap购物网站模板下载网站seo 优化
  • 平面设计做网站的步骤全网自媒体平台大全
  • 青海省城乡建设厅网站首页网站设计方案
  • 深圳网站开发团队合肥做网站推广
  • 淘宝网上做美国签证的网站可靠吗著名的网络营销案例
  • 日本做黄视频网站优化网站推广教程排名
  • 做网站的一年能挣多少钱百度入口的链接
  • 网站文件保护怎么做足球直播在线直播观看免费cctv5