异步io

【转】linux5种io模型

我怕爱的太早我们不能终老 提交于 2020-03-02 03:17:00
转, 原文: https://blog.csdn.net/youyou1543724847/article/details/83445226 同步与异步? ------- 指的调用方式来说 阻塞与非阻塞 ?--------指的调用方,是采取什么方式 会有四种组合方式,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。 —————————————————————————————————————————————— Unix5中IO模型 Unix下共有五种I/O模型 a. 阻塞I/O b. 非阻塞I/O c. I/O复用(select和poll) d. 信号驱动I/O(SIGIO) e. 异步I/O(Posix.1的aio_系列函数) 5.1阻塞I/O模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待。。。。 数据准备好了,从内核拷贝到用户空间 I/O函数返回成功指示 5.2 非阻塞I/O模型 我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试 数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。 5.3 I/O复用模型 I/O复用模型会用到select或者poll函数

高并发的概念及应对方法

喜夏-厌秋 提交于 2020-03-01 17:30:48
为什么学习高并发? 作为一名非CS科班出生的同学,在经过多年IT从业之后,明显能感受到职业生涯发展的后继无力,由于从事的是传统金融行业,对应的公司其实内心深处是不重视IT部门的,而我这种IT从业人员虽然已经是团队或者是部门非常重要的人员,但是最后再发展下去也就是一个业务专家,业务专家本质上的知识不是自身的知识体系,而是公司的知识体系,而只有技术知识体系才是自己的。于是早在18年我就开始了自己的转型学习之路,前期学习了网络知识、Java并发编程,再要想学习JVM时,命运无情的枷锁打断了我的学习进程,19年就在沉闷和潜伏中度过,终于到了20年了,也即将迈入而立之年,给自己定个目标,今年上半年一定要转型完成进入一家心仪的公司,在职业生涯的黄金时期认认真真的再CODE一下。先说一下转型目标,希望能从事高并发、高性能相关的开发工作,为什么会定这个目标?除了自己对这个领域感兴趣外,确实也能从某些知名大型企业的社会招聘能看到这些领域的需求岗位是比较旺盛的,截图如下: 什么是高并发? 再谈论什么是高并发之前,我觉得非常有必要先搞清楚并发、并行和高并发这几个概念,至少对于非CS科班出身的我,一直就不知道这几个是什么高深的内容。 并发、并行和高并发 网易公开课《清华大学公开课:7.3进程的特点》中是这么定义的并发和并行,并发是指在一个时间段内有多个进程在执行,只不过在人的角度看

多线程笔记 - 伪异步IO

北战南征 提交于 2020-03-01 16:24:58
BIO的时候, 一个客户端对应服务器的一条线程, 比较耗线程资源. 在此基础上, 对起线程进行优化, 创建一个线程池, 对线程进行管理, 可以设置一个最大线程数 maxThreadCount. 这样, 达到线程可控的目的. 即使外面有远大于线程数的连接过来, 也不至于让服务器撑爆. 多出的客户端, 就进入线程池的队列中排队. 伪异步IO 是Netty权威指南里面提到的, 并不是一个公认的说法或者官方的说法 . 这里只需要修改服务端的代码即可: server: public class Server implements Runnable { private Socket socket; public Server(Socket socket) { this.socket = socket; } @Override public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); System.out.println("server : 客户端接入

zz`linux块设备IO栈浅析

丶灬走出姿态 提交于 2020-03-01 13:56:43
http://www.sysnote.org/2015/08/06/linux-io-stack/ 块存储,简单来说就是使用块设备为系统提供存储服务。块存储分多种类型,有单机块存储,网络存储(如NAS,SAN等),分布式块存储(目前主流的如AWS的EBS,青云的云硬盘,阿里云的云磁盘,网易云硬盘等)。通常块存储的表现形式就是一块设备,用户看到的就是类似于sda,sdb这样的逻辑设备。本文主要介绍Linux块设备,对Linux的块设备I/O栈进行分析。 1.块设备基本概念 块设备将信息存储在固定大小的块中,每个块都有自己的地址。对操作系统而言,块设备是以字符设备的外观展现的,例如/dev/sda,虽然对这种字符设备可以按照字节为单位访问,但是实际上到块设备上却是以块为单位(最小512byte,即一个扇区),这之间的转换是由操作系统来实现的。 下面介绍几个块设备的基本概念: 1)扇区:磁盘盘片上的扇形区域,逻辑化数据,方便管理磁盘空间,是硬件设备数据传送的基本单位,一般512Byte; 2)块:块是VFS和文件系统数据传送的基本单位,必须是扇区的整数倍,格式化文件系统时,可以指定块大小(一般512,1024,2048,4096字节); 3)段:一个内存页或者内存页中的一部分,包含一些相邻磁盘扇区中的数据;磁盘的每个I/O操作就是在磁盘与一些RAM单元之间相互传一些相邻扇区的内容

socket网络编程实现并发服务器——IO多路复用

你。 提交于 2020-02-28 22:44:27
一 五种网络I/O模型 在Linux下进行网络编程时,服务器端编程经常需要构造高性能的IO模型,常见的IO模型有五种: (1)同步阻塞IO (2)同步非阻塞IO(Non-blocking IO) (3)IO多路复用(IO Multiplexing) :IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数 可以避免同步非阻塞IO模型中轮询等待的问题,此外poll、epoll都是这种模型。 (4) 信号驱动IO(signal driven IO) (5)异步IO(Asynchronous IO) 各服务器源代码:https://gitee.com/constructorvirgil/lingyun_apue/tree/master/yangjianing 二 多路复用–select select()函数允许进程指示内核等待多个事件(文件描述符)中的任何一个发生,并只在有一个或多个事件发生或经历一段指定时 间后才唤醒它,然后接下来判断究竟是哪个文件描述符发生了事件并进行相应的处理。 # include <sys/select.h> # include <sys/time.h> struct timeval { long tv_sec ; //seconds long tv_usec ; //microseconds } ; FD_ZERO ( fd

高性能Server---Reactor模型

◇◆丶佛笑我妖孽 提交于 2020-02-28 07:30:09
转载自: http://www.jianshu.com/p/2461535c38f3 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) ...... C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量,更别说天猫双11的瞬间访问量了!这就对服务器有很高的要求!能够快速处理海量的用户请求

Python IO

烈酒焚心 提交于 2020-02-28 00:45:37
I/O 在计算机中I/O是 Input/Output 的简写,表示输入和输出。由于程序和运行时的数据是在内存中驻留,并由CPU计算核心来执行,涉及到数据交换的地方比如磁盘、网络等时,就需要I/O接口。 通常程序完成I/O操作会有 Input 和 Output 两个数据流,当然也有只用一个的情况,比如从磁盘读取文件到内存,就只会使用 Input 操作。相反将数据从内存写入到磁盘文件时也只有一个 Output 操作。 输入输出是相对的,需要考虑具体的对象是什么。一般而言,当编写的程序需要读取磁盘文件时,相当于将磁盘的数据输入到程序中,对于程序而言读取的数据就属于 Input ,对于磁盘而言则相当于将数据输出给程序,输出的数据是属于 Output 。 Stream I/O编程中,流 Stream 是一个很重要的概念,可以把流想象成一根管道,数据就是水管中的水,但只能单向流动。 Input Stream 输入流是数据从外部比如磁盘或网络流进内存, Output Stream 输出流则是数据从内存 流到外部。例如,对于浏览网页来说,浏览器和服务器之间至少需要建立了两条水管才能收发数据。 同步异步 由于CPU和内存的速度远高于外设的速度,所以I/O编程中存在速度验证不匹配的问题 。 比如说要将100MB的数据写入磁盘,CPU输出100MB数据只需0.01秒

浅谈5种IO模型的概念

ぐ巨炮叔叔 提交于 2020-02-25 20:53:06
文章目录 IO的概念 什么是用户空间和内核空间 同步、异步的概念 什么是阻塞和非阻塞 5种IO模型详解 阻塞IO模型 非阻塞IO模型 IO复用模型 select ,poll,epoll的区别 信号驱动IO模型 全异步IO模型 5种IO模型的区别 IO的概念 IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。 比如你打开浏览器,访问腾讯首页,浏览器这个程序就需要通过网络IO获取腾讯的网页。浏览器首先会发送数据给腾讯服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Output,腾讯服务器把网页发过来,这个动作是从外面接收数据,叫Input。所以,通常,程序完成IO操作会有Input和Output两个数据流。当然也有只用一个的情况,比如,从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作。 流是什么?可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。 Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去 。对于浏览网页来说,浏览器和腾讯服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。 I

Java的BIO,NIO和AIO的区别于演进

落爺英雄遲暮 提交于 2020-02-25 07:28:20
作者:公众号: 我是攻城师 前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊。 BIO BIO全称是Blocking IO,是JDK1.4之前的传统IO模型,本身是同步阻塞模式,针对网络通信都是一请求一应答的方式,虽然简化了上层的应用开发,但在性能和可靠性方面存在着巨大瓶颈,试想一下如果每个请求都需要新建一个线程来专门处理,那么在高并发的场景下,机器资源很快就会被耗尽,当然,我们可以通过线程池来优化这种情况,但即使是这样,仍然改变不了阻塞IO的根本问题,就是在IO执行的两个阶段都被block了。拿一个read操作来举例子,在linux中,应用程序向linux发起read操作,会经历两个步骤: 第一个阶段linux内核首先会把需要读取的数据加载到操作系统内核的缓冲区中(Linux文件系统是缓存IO,也称标准IO) 第二个阶段应用程序拷贝内核里面的数据到自己的用户空间中 如果是socket操作,类似也会经历两个步骤: 第一个阶段:通常涉及等待网络上的数据分组包到达,然后被复制到内核的缓冲区 第二个阶段:把数据从内核缓冲区,从内核缓冲区拷贝到用户进程的内存空间里面 同步阻塞IO之所以效率低下,就是因为在这两个阶段,用户的线程或者进程都是阻塞的,期间虽然不占cpu资源

Boost::Asio入门剖析

时光总嘲笑我的痴心妄想 提交于 2020-02-24 17:26:21
Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。 作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子 你的程序需要一个io_service对象,io_service把你的程序和操作系统I/O设备链接起来。 boost::asio::io_service io_service; 你的程序需要一个I/O对象来执行I/O操作,比如tcp socket boost::asio::ip::tcp::socket socket(io_service); 执行一个同步的连接操作时,会顺序发生下列事件 1.你的程序通过调用I/O对象来启动连接操作 socket.connect(server_endpoint); 2.I/O对象转发请求给io_service 3.io_service通知操作系统执行连接操作 4.操作系统把连接操作的结果返回给io_service 5.io_service把操作的错误转化成boost::system::error_code,一个error_code可能同特定的值进行比较,或者作为一个boolen(false结果意味着没有错误发生),结果被传送会I/O对象。 6.如果操作失败I