聊聊JAVA中的I/O

I/O即为输入输出的意思,在实际应用中的I/O操作主要是针对磁盘或者网络。磁盘的I/O主要是针对文件读写,而网络I/O是针对socket中的数据的读写。

I/O的原理

计算机资源都是由操作系统控制的,jvm通过系统调用去实现数据的读写。操作系统读取数据的时候首先会将数据读取到内核的缓冲区,然后再从内核读取到应用控制的内存中。当要写的数据输出也是先将数据写入到内核在写入磁盘或者网卡。这样的好处是对磁盘的读取可以缓存起来,当其他的应用需要读取同样的数据的时候就避免了磁盘的操作,用户与内核隔离这样,用户修改了数据不会影响内核。

linuxIO.png

当然linux还提供了mmap技术,可以参考linux内存映射mmap原理分析。mmap技术是将应用的内存映射到磁盘上面,当用户要读取数据的时候直接从磁盘读取到内存中,当将这段内存的数据进行修改之后,操作系统会将这个修改同步到磁盘上,mmap的好处就是可以读取或者写数据的时候可以减少一次数据拷贝,提升速度。还有就是零拷贝技术,就是在进行文件复制传输的时候,同样不需要讲数据拷贝到用户的进程中,而是直接在内核中完成晚间的传输。(java nio的 FileChannel.transferTo()/transferFrom() ,就是这种模式)。

mmap.png

mmap虽然好但是有缺点:

  1. mmap映射是按照页映射的,如果是大量小文件映射会造成内存的浪费

  2. 不再安全,应用对内存的修改将直接影响磁盘上的数据,如果有其他的应用读取该文件,将受到影响

java传统的I/O操作

传统的java的I/O操作都是基于流进行的,主要为基于字节的InputStream、OutputStream和基于字符操作的Reader和Writer。每当读取一个字节或者字符的时候就进行一次系统调用,从磁盘上读取一个字节或字符进入内存,这样操作的效率是十分低下的。所以java提供了一直 Bufferd+*( BufferdInputStream、BufferdReader等)的操作,就是在之前的基础上增加了一个缓冲区,每次读取都先读取一大块数据到缓冲区再从缓冲区拷贝到应用内存中,写数据一样先写入缓冲区再一起写入磁盘或者网络,这样就可以提升读写的效率。

而cpu的处理速度和内存的读写速度是远远大于磁盘和网络数据的读写,传统的io是阻塞的,每当读取数据的时候,当前线程就会被阻塞。假如网络上有很多客户端连接本地,就需要多少个线程,这样是很消耗计算机资源的,这就需要非阻塞的IO。

linux中的I/O模型

  1. 阻塞I/O:进程通过系统调用读取数据,当数据成功读取到进程内存中的时候才返回

  2. 非阻塞I/O:进程通过系统调用读取数据,这个时候如果内核中缓冲区没有数据就直接返回并告知进程内核现在在准备数据,此时进程就可以处理其他事情,然后随时去查询内核准备数据的状态,如果准备ok就从内核拷贝过来,内存的读写速度是比磁盘快很多,这个时候的拷贝其实是很快的。

  3. I/O复用模型:通过一个线程处理多个I/O操作,基于select/poll系统,将多个非阻塞的I/O交给该系统,该系统不断去轮询每个I/O的状态,如果ok就处理这个I/O的数据。select/poll的轮询机制存在缺陷,后面升级为基于事件的epoll的模式。

  4. 信号驱动I/O:进程通过系统调用读取数据,马上返回,然后内核数据准备好之后通过信号量通知进程数据准备好了,不需要进程来主动查询信号状态。

  5. 异步I/O:和信号驱动一样,调用之后等待系统的信号,但是这个时候数据已经完全写入内存了,无需进程再从内核读取出来。

java NIO

NIO是基于channel操作的,这个channel是双向的,可以读也可以写。并且提供了上述提到的对Buffter(缓冲区)的操作。通过将channel注册到selectors上实现非阻塞的读写,selectors是基于上述提到的epoll模式,当selectors感知到channel数据准备ok就对数据进行读写的操作。

Netty

直接使用JAVA NIO进行网络编程开发是费时费劲的,Netty是基于Java NIO 实现的网络编程框架,使用Netty编写高并发的网络服务应用。

参考

  1. 《Netty权威指南》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Synopsis: Richard Stevens所著的《UNIX® Network Programming Vo...
    Moscow1147阅读 675评论 0 0
  • 1. 硬链接和软连接区别 硬连接-------指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区...
    杰伦哎呦哎呦阅读 2,198评论 0 2
  • I/O基本知识 整个I/O操作由应用程序、文件系统和磁盘共同完成,应用程序将I/O命令发送到文件系统,文件系统在合...
    修塔寻千里阅读 1,698评论 0 4
  • 一.管道机制(pipe) 1.Linux的fork操作 在计算机领域中,尤其是Unix及类Unix系统操作系统中,...
    Geeks_Liu阅读 3,671评论 1 9
  • Linux进程通信实现机制有很多,也有各自优缺点和适用场景,关于她们之间的对比,等各种通信机制一一介绍后,再来一个...
    batbattle阅读 4,048评论 3 13