点击上方“JAVA”,星标公众号

重磅干货,第一时间送达

Linux 基础知识回顾

用户空间和内核空间

现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节。

对 32 位操作系统而言,它的寻址空间(虚拟存储空间)为 4G(2 的 32 次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。

针对 linux 操作系统而言:将最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)供内核使用,称为内核空间。而将较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF)供各个进程使用,称为用户空间。

直接 I/O 和缓存 I/O

文件系统 IO 分为 DirectIO(直接I/O)和 BufferIO(缓存 I/O),其中 BufferIO 也叫 Normal IO(标准 I/O)。大多数文件系统的默认 I/O 操作都是缓存 I/O。

缓存 I/O

读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘中读取,然后缓存在操作系统的缓存中。

写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显示地调用了sync同步命令。

以 write 为例,数据会先被拷贝进程缓冲区,在拷贝到操作系统内核的缓冲区中,然后才会写到存储设备中。

直接 I/O(少了拷贝到应用进程缓冲区这一步)

阻塞与同步

阻塞(Block) / 非租塞(NonBlock)

阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,比如当数据没有准备就绪的时候。

阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。

非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。

同步(Synchronization) / 异步(Asynchronization)

同步和异步都是基于应用程序私操作系统处理 IO 事件所采用的方式,比如:

同步:是应用程序要直接参与 IO 读写的操作。

异步:所有的 IO 读写交给操作系统去处理,应用程序只需要等待通知。

同步方式在处理 IO 事件的时候,必须阻塞在某个方法上面等待我们的 IO 事件完成(阻塞 IO 事件或者通过轮询 IO 事件的方式)。

对于异步来说,所有的 IO 读写都交给了操作系统。这个时候,我们可以去做其他的事情,并不需要去完成真正的 IO 操作,当操作完成 IO 后会给我们的应用程序一个通知。

常见 IO 模型

对于一次 IO 访问,它会经历两个阶段:等待数据准备就绪 (Waiting for the data to be ready);将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。

举例来说:

读函数:分为等待系统可读和真正的读。

写函数:分为等待网卡可以写和真正的写。

说明:

等待就绪的阻塞是不使用 CPU 的,是在“空等”。而真正的读写操作的阻塞是使用 CPU 的,真正在“干活”,而且这个过程非常快,属于 memory copy,宽带通常在 1GB/s 级别以上,可以理解为基本不耗时。

下图是几种常见 I/O 模型的对比:

以 socket.read() 为例子:

传统的 BIO 里面 socket.read(),如果 TCP RecvBuffer 里没有数据,函数会一直阻塞,直到收到数据,返回读到的数据。

对于 NIO,如果 TCP RecvBuffer 有数据,就把数据从网卡读到内存,并且返回给用户;反之则直接返回 0,永远不会阻塞。

最新的 AIO(Async I/O) 里面会更进一步:不但等待就绪是非阻塞的,就连数据从网卡到内存的过程也是异步的。

换句话说,BIO 里用户最关心“我要读”,NIO 里用户最关心"我可以读了",在 AIO 模型里用户更需要关注的是“读完了”。

NIO 一个重要的特点是:socket 主要的读、写、注册和接收函数,在等待就绪阶段都是非阻塞的,真正的 I/O 操作是同步阻塞的(消耗 CPU 但性能非常高)。

作者:ens
链接:https://juejin.im/post/5e894a32e51d4546f87858c1

END

历史推荐

1、这么写参数校验(Validator)就不会被劝退了~

2、Java基础知识点总结

3、Java 基础系列:图解Java内存

4、问:Java对象的访问方式有几种?

公众号ID|javabaiwen

小编微信|619531440

每天分享技术干货

视频 | 电子书 | 面试题 | 开发经验

阻塞io阻塞io_面试官:直接IO、缓存IO、阻塞与同步?相关推荐

  1. 【高并发】面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?...

    写在前面 往往开始做一个项目时,不会过多的考虑性能问题,以快速迭代功能为主.后续随着业务的快速发展,系统运行的性能越来越慢,此时,就需要对系统进行相应的优化,而效果最显著的就是给系统加上缓存.那么,问 ...

  2. 面试官问面向对象特点_最好的面试官有什么共同点?

    面试官问面向对象特点 by Aline Lerner 通过艾琳·勒纳(Aline Lerner) 最好的面试官有什么共同点? 我们查看了成千上万的真实访谈以找出答案. (What do the bes ...

  3. 大厂面试官喜欢这样问Redis,双写一致性、并发竞争、线程模型,我整理好了

    你知道的越多,你不知道的越多 点赞再看,养成习惯 https://github.com/java-已经开源,有面试脑图 前言 正文 上几期吊打系列我们提到了Redis的很多知识,还没看的小伙伴可以回顾 ...

  4. Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如Red ...

  5. 《吊打面试官》系列-Redis常见面试题

    前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难. 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞 ...

  6. 《如何与面试官处朋友》系列-缓存击穿、穿透、雪崩场景原理大调解

    前面我们提到分布式多级缓存架构的全貌,但总感觉少了些什么东西.在这样大的场景下面,如果遇到缓存使用问题那可咋办?但自古英雄出少年,相信此刻你已踏马西去,正走在寻找答案上得夕阳西下.每每面谈Redis大 ...

  7. 面试官问我HTTP,我真的是

    面试官:今天要不来聊聊HTTP吧? 候选者:嗯,HTTP「协议」是客户端和服务器「交互」的一种通迅的格式 候选者:所谓的「协议」实际上就是双方约定好的「格式」,让双方都能看得懂的东西而已 候选者:所谓 ...

  8. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  9. 面试官:请讲一讲IO流核心模块与基本原理是什么?

    前言 一.IO流与系统 IO技术在JDK中算是极其复杂的模块,其复杂的一个关键原因就是IO操作和系统内核的关联性,另外网络编程,文件管理都依赖IO技术,而且都是编程的难点,想要整体理解IO流,先从Li ...

最新文章

  1. 收藏 | 机器学习模型与算法最全分类汇总!
  2. Android studio 刷新文件状态
  3. The Genymotion virtual device could not obtain an IP address
  4. 怎样用python批量处理文件夹_套娃式文件夹如何通过Python批量处理
  5. ES6箭头函数和模板字符串
  6. mockito 静态方法_Mockito –带有注释和静态方法的额外接口
  7. matlab软件imag函数_「复变函数与积分变换」基本计算代码
  8. windows7如何实现屏幕不休眠
  9. Java工作笔记-判断文件是否被正在被写入
  10. Flutter AlertDialog弹框的基本使用、Flutter showDialog方法使用概述
  11. 物联网毕设 --(STM32f407连接云平台检测数据)
  12. 自然语言处理--Keras 实现循环神经网络分类 IMDB 电影评论数据集
  13. 蓍草占卜Python法
  14. STM32F4开发板硬件平台简介
  15. 福昕阅读器自定义快捷键
  16. 个人博客作业Week3
  17. Tensorflow中的tf.argmax()函数
  18. A Review on Deep Learning Applications in Prognostics and Health Management (翻译)
  19. 传输层协议TCP—RTTM(11)
  20. 普通qq客服,不加好友临时会话

热门文章

  1. Android Sqlite 数据的存储
  2. github 提速方法
  3. Linux虚拟内存那点事儿
  4. apktool d test.apk报错:Unsupported major.minor version 52.0
  5. Android4.1MediaPlayer无缝播放
  6. android 4.3以上修改DNS流程(netd)
  7. CMSampleBufferRef获取h264 char*数据及sps/pps
  8. UIImageView 加入子UIImageView 导致内存泄露的问题
  9. Crtmpserver编译
  10. GB28181之H264打包PS