异步io

http协议

拜拜、爱过 提交于 2020-01-02 20:56:07
http 协议:   1)http协议格式:     URL:scheme://server[:port]/path/to/source (服务器上的每一个资源都有一个对应的url与之对应)     request:       <method> <url> <version>       <HEADERA>       <body>     response:       <verion> <status> <reason phrase>       <HEADERS>       <body> 其中:   method:     除了get,head,post,put,delete,trace,options还有很多其他的方法   status:     1XX:信息类     2XX:成功类,200     3XX:重定向类301,302,304     4XX:客户端错误类,403,404     5XX:服务端错误类,502   HEADER:     通用首部(请求/响应都可以使用)     请求首部       If-Modified-Since,If-None-Match     响应首部     实体首部(用在body中)     扩展首部   协议格式:文本、二进制   2)Web页面:一个页面通常含有多个资源,也就是说我们浏览器访问的是一个页面的入口

网络IO模型

陌路散爱 提交于 2020-01-02 17:50:58
网络IO模型 一、同步阻塞型 二、同步非阻塞型 三、IO多路复用型 四、信号驱动型 五、异步 更加详细的解释: https://blog.csdn.net/u013205877/article/details/94228455 同步/异步:关注的是事件处理的消息通信机制,即在等待⼀件事情的处理结果时,被调⽤者是否提供完成通知。 阻塞/⾮阻塞:关注调⽤者在等待结果返回之前所处的状态 阻塞:locking,指IO操作需要彻底完成后才返回到⽤⼾空间,调⽤结果返回之前,调⽤者被挂起,⼲不了别的事情。 ⾮阻塞:nonblocking,指IO操作被调⽤后⽴即返回给⽤⼾⼀个状态值,⽆需等到IO操作彻底完成,最终的调⽤结果返回之前,调⽤者不会被挂起,可以去做别的事 情。 一、同步阻塞型   程序向内核发送IO请求后⼀直等待内核响应,如果内核处理请求的IO操作不能⽴即返回,则进程将⼀直等待并不再接受新的请求,并由进程轮训查看IO是否完成,完成后进程将IO结果返回给Client,在IO没有返回期间进程不能接受其他客⼾的请求,⽽且是有进程⾃⼰去查看IO是否完成,这种⽅式简单,但是⽐较慢,⽤的⽐较少。 二、同步非阻塞型   程序向内核发送请IO求后⼀直等待内核响应,如果内核处理请求的IO操作不能⽴即返回IO结果,进程将不再等待,⽽且继续处理其他请求,但是仍然需要进程隔⼀段时间就要查看内核IO是否完成。 三

网络IO模型

拈花ヽ惹草 提交于 2020-01-02 09:21:16
在介绍网络IO模型,我们先来看一下同步和异步,以及阻塞和非阻塞的概念。 同步和异步关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函数等。 阻塞和非阻塞主要关注的是等待结果返回调用方的状态 阻塞:是指结果返回之前,当前线程被挂起,不做任何事 非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。 然后我们就来了解一些基本的网络IO模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 、poll和epoll) (I/O multiplexing) 信号驱动I/O (signal driven I/O (SIGIO)) 异步I/O (asynchronous I/O ) 阻塞I/O模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待,知道数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。 当调用recvfrom()函数时,系统首先查是否有准备好的数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recvfrom()函数时,未必用户空间就已经存在数据

并发编程(IO多路复用)

被刻印的时光 ゝ 提交于 2019-12-31 23:29:37
转: https://www.cnblogs.com/cainingning/p/9556642.html 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 IO模型介绍   为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6

Netty实践与NIO原理

风格不统一 提交于 2019-12-31 00:43:23
一、阻塞IO与非阻塞IO Linux网络IO模型(5种) (1)阻塞IO模型 所有文件操作都是阻塞的,以套接字接口为例,在进程空间中调用recvfrom,系统调用直到数据包到达且被复制到应用进程缓冲区或发生错误时才返回,期间会一直等待(阻塞)。模型如图: (2)非阻塞IO模型 recvfrom从应用层到内核时,如果该缓冲区没数据,直接返回一个EWOULDBLOCK错误,反复轮询检查这个状态,看是否有数据到来。如图: (3)IO复用模型 Linux提高select/poll,进程通过将一个或多个fd(file descriptor)传递给select或poll系统调用,阻塞在select操作上,侦测多个fd是否处于就绪状态。select/poll顺序扫描fd是否就绪,而且支持的fd数量有限。Linux还提供了一个epoll系统调用,使用基于事件驱动的方式代替顺序扫描,性能更高。当有fd就绪时,立即回调函数rollback。如图: (4)信号驱动IO模型 首先开启套接口信号驱动IO功能,通过系统调用sigaction执行一个信号处理函数,该函数立即返回,进程继续工作,它是非阻塞的。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recfrom来读取数据,通知主循环函数处理数据。如图: (5)异步IO模型 告知内核启动某个操作,让内核在整个操作完成后

Netty、NIO、多线程

99封情书 提交于 2019-12-31 00:42:07
一:Netty、NIO、多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手。过年期间 @李林锋hw 发布了一个 Netty5.0架构剖析和源码解读 ,看完也是收获不少。前面的文章我们分析了Netty的结构,这次咱们来分析最错综复杂的一部分-Netty中的多线程以及NIO的应用。 理清NIO与Netty的关系之前,我们必须先要来看看Reactor模式。Netty是一个典型的多线程的Reactor模式的使用,理解了这部分,在宏观上理解Netty的NIO及多线程部分就不会有什么困难了。 本篇文章依然针对Netty 3.7,不过因为也看过一点Netty 5的源码,所以会有一点介绍。 二:Reactor,反应堆还是核电站? 1、Reactor的由来 Reactor是一种广泛应用在服务器端开发的设计模式。Reactor中文大多译为“反应堆”,我当初接触这个概念的时候,就感觉很厉害,是不是 它的原理就跟“核反应”差不多?后来才知道其实没有什么关系,从Reactor的兄弟“Proactor”(多译为前摄器)就能看得出来,这两个词的中文 翻译其实都不是太好,不够形象。实际上,Reactor模式又有别名“Dispatcher”或者“Notifier”,我觉得这两个都更加能表明它的本 质。 那么,Reactor模式究竟是个什么东西呢?这要从事件驱动的开发方式说起。我们知道

java常用的IO模型

半城伤御伤魂 提交于 2019-12-29 22:51:26
IO模型 区分 一个输入操作通常包括两个阶段: 等待数据准备好 从内核向进程复制数据 对于一个套接字上的输入操作,第一步通常涉及等待网络数据从网络到达。当所等待数据到达后,它被复制到内核中的某个缓冲区。第二部就是把数据从内核缓冲区复制到应用进程缓冲区。 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求过程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。 阻塞IO和非阻塞IO的区别在第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。 阻塞式IO 应用进程被阻塞,知道数据复制到应用进程缓冲区才返回。在阻塞过程中,其他程序还可以执行,因此阻塞并不意味着整个操作系统被阻塞。因为其他程序还可以运行,因此不消耗CPU时间,这种模型的CPU利用率会比较高。 非阻塞IO 应用程序执行系统调用之后,内核返回一个错误码。应用程序还可以继续运行,但是需要不断的执行系统调用来获知IO是否完成,这种方式成为轮询。 由于CPU要处理更多的系统调用,因此这种模型的CPU利用率比较低。 IO复用 使用select或者poll等待数据,并且可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回

聊聊IOCP,聊聊异步编程

∥☆過路亽.° 提交于 2019-12-28 03:53:23
/*--> */ /*--> */ /*--> */ /*--> */ 前言 IO完成端口(IO completion ports)在多核计算机的并行异步IO请求方面提供了一种高效的线程模型。当进程创建一个IO完成端口时,系统创建一个相关联的队列,其唯一目的是服务与那些请求。IO完成端口通常和预先分配的线程池配合,相比于一个一个创建线程,这使其更快更高效。IOCP在进程之间并不共享,一个IOCP及其句柄只和创建它的进程关联,但是一个进程中的多个线程可共享。IOCP最关键的地方就是,IOCP在IO请求和接收动作完成之后,激活线程池中的任意线程继续操作,而不是在IO请求和接受完成之后,激活原等待中的线程。这样的好处是防止等待线程闲置,和必须激活/切换到原等待线程的开销。 大多应用存在的问题 曾见过很多服务,几台,几十台,几百台服务器的,它们cpu大多数时间处于空闲状态,也许需要大量计算的应用并没有那么多,我们常见的应用大多主要读写关系数据库,读写内存数据库/缓存,RPC调用接口。IO耗时过多,CPU大量闲置,导致没看到服务器资源大量消耗,便已不能承受日益增加的访问量,再加服务器,依然大量浪费了资源。 CPU资源昂贵,每一个核心,同一时刻只能有一个线程在运行,超线程cpu同一时刻可以有两个逻辑线程运行,所以说线程不是创建的越多越好,过多的线程只会增加线程切换带来的成本。试想一下

操作系统-网络IO模型

荒凉一梦 提交于 2019-12-27 04:01:28
操作系统-网络IO模型 用户空间及内核空间 Linux 网络 IO 模型 阻塞IO(Blocking IO) 非阻塞IO(Non-Blocking IO) IO复用(IO Multiplexing) 信号驱动的IO(Singal Driven IO) 异步IO 5中IO模型的对比 参考文档 用户空间及内核空间 我们知道现代操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接访问内核,保证内核的安全,操作系统将虚拟存储空间划分为两部分——一部分为内核空间,一部分为用户空间。针对Linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为内核空间;而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为用户空间。每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。 寻址空间是用来干嘛的?和内存空间有何差别? Linux寻址空间分配如下图所示: 有了用户空间和内核空间,整个Linux内部结构可以分为三部分,从最底层到最上层依次是:硬件–

IO:BIO NIO AIO网络编程模型

痴心易碎 提交于 2019-12-26 16:41:52
参考视频: https://www.bilibili.com/video/av76223318?p=5 I/O模型简单的解释:用什么样的通道进行数据的发送和接收,很大程度上决定了程序通讯的性能 Java共支持三种网络编程模型: BIO,NIO,AIO BIO:Blocking IO 同步并阻塞(传统阻塞型) ,服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器端就需要启动一个线程进行处理,如果这个连续不做任何事情会造成不必要的线程开销。可以通过线程池机制改善(实现多个客户连接服务器)。 放在java.io包下 适用场景: 连接数目小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。jdk1.4之前的唯一选择,但程序简单易理解 BIO简单流程: 1 服务器端启动一个ServerSockert 2 客户端启动Socket对服务器进行通讯,默认情况下服务器端需要对每个客户建立一个线程与之通讯 3 客户端发送请求后,先咨询服务器是否有线程响应 3.1 如果没有响应,则会等待,或者被拒绝 3.2 如果有响应,客户端线程会等待请求结束后,再继续执行 public class BioServerSocket { public static void main(String[] args) throws Exception{ //创建ServerSocket