bio

BIO、NIO、AIO有什么区别?

梦想的初衷 提交于 2019-12-05 11:00:10
BIO:线程发起 IO 请求,不管内核是否准备好 IO 操作,从发起请求起,线程一直阻塞,直到操作完成。 NIO:线程发起 IO 请求,立即返回;内核在做好 IO 操作的准备之后,通过调用注册的回调函数通知线程做 IO 操作,线程开始阻塞,直到操作完成。 AIO:线程发起 IO 请求,立即返回;内存做好 IO 操作的准备之后,做 IO 操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做 IO 操作完成或者失败。 BIO 是一个连接一个线程。 NIO 是一个请求一个线程。 AIO 是一个有效请求一个线程。 BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的 IO 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理。 适用场景分析 BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序直观简单易理解。 NIO

块设备驱动

﹥>﹥吖頭↗ 提交于 2019-12-04 18:45:02
for (i = 0; i < nr; i++) { struct buffer_head *bh = bhs[i]; submit_bh(rw, bh); struct bio *bio; // 使用bh来构造bio (block input/output) submit_bio(rw, bio); // 通用的构造请求: 使用bio来构造请求(request) generic_make_request(bio); __generic_make_request(bio); request_queue_t *q = bdev_get_queue(bio->bi_bdev); // 找到队列 // 调用队列的"构造请求函数" ret = q->make_request_fn(q, bio); // 默认的函数是__make_request __make_request // 先尝试合并 elv_merge(q, &req, bio); // 如果合并不成,使用bio构造请求 init_request_from_bio(req, bio); // 把请求放入队列 add_request(q, req); // 执行队列 __generic_unplug_device(q); // 调用队列的"处理函数" q->request_fn(q); 驱动程序 1 /* 2 * 块设备驱动程序

NIO、BIO、AIO

坚强是说给别人听的谎言 提交于 2019-12-04 11:28:14
BIO(同步阻塞): Socket编程就是 BIO ,操作时会阻塞线程,并发处理能力低 。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。    NIO(同步非阻塞): 是对BIO的改进 ,基于Reactor模型 。bio在传输数据时大部分时间这个“ 数据通道”是空闲的,但还是占用着线程。NIO改进的就是“一个请求一个线程”,在连接到服务端的众多 socket中,只有需要进行 IO操作的才能获取服务端的处理线程进行 IO 。这样就不会因为线程不够用而限制了socket的接入。    AIO(异步非阻塞): 这种 IO模型 是由操作系统先完成了客户端请求处理再通知服务器去启动线程进行处理 。 AIO也称 NIO2.0 , 在 JDK7开始支持 。 阻塞与非阻塞 :主要指的是访问 IO 的线程是否会阻塞(或者说是等待)    阻 塞 :请求资源时,线程只有等到资源就绪之后才去做其他事情    非阻塞 :请求资源时,资源没准备好就先去做其他事情,过一会又来访问,直到资源准备好为止    同步和异步 :主要是指的数据的请求方式,同步和异步是指访问数据的一种机制    同 步 :请求资源时,直到资源准备就绪获取到结果之后才返回    异 步 :请求资源后

Py---StringIO and BytesIO 读取str

依然范特西╮ 提交于 2019-12-03 22:59:32
# StringIO和BytesIO (1)StringIO顾名思义就是在内存中读写str。(2)StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。 # stringIO 比如说,这时候,你需要对获取到的数据进行操作,但是你并不想把数据写到本地硬盘上,这时候你就可以用stringIO from io import StringIO from io import BytesIO def outputstring(): return 'string \nfrom \noutputstring \nfunction' s = outputstring() # 将函数返回的数据在内存中读 sio = StringIO(s) # 可以用StringIO本身的方法 print(sio.getvalue()) # 也可以用file-like object的方法 s = sio.readlines() for i in s: print(i.strip()) # 将函数返回的数据在内存中写 sio = StringIO() sio.write(s) # 可以用StringIO本身的方法查看 s=sio.getvalue() print(s) # 如果你用file-like object的方法查看的时候,你会发现数据为空 sio = StringIO() sio

Installing Bio::DB::Sam perl module

匿名 (未验证) 提交于 2019-12-03 02:26:02
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: I am trying to install a perl module Bio::DB::Sam on my home directory on a remote server. I downloaded the module, extracted the files, and ran: perl Build.pl prefix=~/local this is what happens next: This module requires samtools 0.1.10 or higher (samtools.sourceforge.net). Please enter the location of the bam.h and compiled libbam.a files: **/some_places/samtools-0.1.19** Found /some_places/samtools-0.1.19/bam.h and /some_places/samtools-0.1.19/libbam.a. Created MYMETA.yml and MYMETA.json Creating new 'Build' script for 'Bio-SamTools'

通过hijack了解bio

匿名 (未验证) 提交于 2019-12-02 23:42:01
通过hijack了解bio 背景 bio是block io,它是一个描述硬盘里面的位置与page cache的页对应关系的数据结构,每个bio对应的 硬盘里面一块连续的位置,每一块硬盘里面连续的位置,可能对应着page cache的多页,或者一页, 所以它里面会有一个 bio_vec *bi_io_vec 的表。 而每个bio_vec都只能描述一个页内数据的连续的数据的偏移和长度: 通过bi_sectors和bi_size来描述硬盘中起始位置和长度。 一个bio的处理:一个bio通常通过 submit_bio 来提交给设备队列,下面会经过bio聚合,转化成request,磁盘调度队列,块设备驱动,磁盘处理,对于bio来说大部分都是异步,所以处理结束通过 bio->bi_end_io 来作为callback获取结果,外部的接口使用bio_endio。同步的读写是通过等待callback事件到来从而完成同步读写。 中间贴的只是代码片段,介绍怎么做的,不能直接运行的。获取全部的代码片段,请联系我 目标 进行块设备加密,磁盘落盘的数据是密文,而对于文件系统来说是明文.加密算法因为用过sm4,所以就选用了最简单的 sm4(ecb) 加解密。 设计 submit_bio是写IO的起手势,所以通过hook submit_bio来进行写加密,保证提交给下面的数据是经过加密的就好了

我对于 JDK中 BIO/NIO/AIO 的理解

老子叫甜甜 提交于 2019-12-02 20:54:53
BIO/NIO/AIO名字的具体含义: BIO:Bloking IO (同步,阻塞IO) NIO:Non-bloking IO (同步,非阻塞IO{由于是在nio包下,称为NIO1 jdk1.6+}) AIO:Asynchronous IO (异步,非阻塞IO。称为NIO2,jdk1.7+) BIO/NIO/AIO区别 BIO:在代码中调用时当前线程会卡在调用的哪一行,直到需要获取写的数据操作完毕,才继续进行下一步操作。 NIO:调用相应非阻塞方法(如) socketChannel.configureBlocking(false); socketChannel.connect(Inet..); ,在相关准备操作完毕之后立即返回,此时会给 socketChannel 实例加上适当的状态。回到主线程中继续执行相关代码,但是需要对 socketChannel 进行忙询问,如通过while循环一直判断该socketChannel是否已完成建立连接,在还没有建立连接时需要做什么。。。 AIO:调用相应非阻塞异步方法,JDK提某类操作完成调用的API(由我们来实现当特定操作完成之后,调用实现接口的方法),在进行相应操作时候自动创建相应线程来调用该实现。总的来说对于AIO,我们只负责在初次调用时,把一切都准备好,然后继续做其他与当前操作无关的事,后续与当前操作有关的由于都已经事先准备好

从实践角度重新理解BIO和NIO

北城以北 提交于 2019-12-02 18:06:53
前言 这段时间自己在看一些Java中BIO和NIO之类的东西,看了很多博客,发现各种关于NIO的概念说的天花乱坠头头是道,可以说是非常的完整,但是整个看下来之后,自己对NIO还是一知半解的状态,所以这篇文章不会提到很多的概念,而是站在一个实践的角度,写一些我自己关于NIO的见解,站在实践过后的高度下再回去看概念,应该对概念会有一个更好的理解。 实现一个简易单线程服务器 要讲明白BIO和NIO,首先我们应该自己实现一个简易的服务器,不用太复杂,单线程即可。 为什么使用单线程作为演示 因为在单线程环境下可以很好地对比出BIO和NIO的一个区别,当然我也会演示在实际环境中BIO的所谓一个请求对应一个线程的状况。 服务端 public class Server { public static void main(String[] args) { byte[] buffer = new byte[1024]; try { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务器已启动并监听8080端口"); while (true) { System.out.println(); System.out.println("服务器正在等待连接..."); Socket socket =

JAVA - IO - IO的类型(AIO, BIO, NIO)

狂风中的少年 提交于 2019-12-02 02:05:08
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 二、NIO NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。 NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。 也就是说,这个时候,已经不是一个连接就要对应一个处理线程了

从实践角度重新理解BIO和NIO

扶醉桌前 提交于 2019-12-01 22:28:14
前言 这段时间自己在看一些Java中BIO和NIO之类的东西,看了很多博客,发现各种关于NIO的概念说的天花乱坠头头是道,可以说是非常的完整,但是整个看下来之后,自己对NIO还是一知半解的状态,所以这篇文章不会提到很多的概念,而是站在一个实践的角度,写一些我自己关于NIO的见解,站在实践过后的高度下再回去看概念,应该对概念会有一个更好的理解。 实现一个简易单线程服务器 要讲明白BIO和NIO,首先我们应该自己实现一个简易的服务器,不用太复杂,单线程即可。 为什么使用单线程作为演示 因为在单线程环境下可以很好地对比出BIO和NIO的一个区别,当然我也会演示在实际环境中BIO的所谓一个请求对应一个线程的状况。 服务端 public class Server { public static void main(String[] args) { byte[] buffer = new byte[1024]; try { ServerSocket serverSocket = new ServerSocket(8080); System.out.println("服务器已启动并监听8080端口"); while (true) { System.out.println(); System.out.println("服务器正在等待连接..."); Socket socket =