I/O(阻塞、非阻塞,同步、异步)的概念:1、阻塞;2、非阻塞;3、同步;4、异步。阻塞是指调用结果返回之前,当前线程会被挂起。I/O(阻塞、非阻塞,同步、异步)的区别:1、阻塞与非阻塞;2、同步与异步;3、阻塞与同步。
一、I/O(阻塞、非阻塞,同步、异步)的概念
IO(Input/Output)操作是计算机中的一种常见操作,常用于从磁盘、网络或其他外部设备读取或写入数据。它的四个相关概念:
1、阻塞
阻塞在读写数据时会一直等待,直到数据准备好或者超时。在此期间,进程会被挂起,无法执行其他任务,直到 IO 操作完成。
2、非阻塞
非阻塞在读写数据时不会一直等待,它会立即返回,无论数据是否准备好或者超时,然后进程可以进行其他任务。因此非阻塞 IO 操作常常需要循环多次来检查数据是否准备好。
3、同步
所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。 简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。 例如:B/S模式中的表单提交,具体过程是:客户端提交请求->等待服务器处理->处理完毕返回,在这个过程中客户端(浏览器)不能做其他事。
4、异步
异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
对于通知调用者的三种方式,具体如下:
- 状态:即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。
- 通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
- 回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。
例如:B/S模式中的ajax请求,具体过程是:客户端发出ajax请求->服务端处理->处理完毕执行客户端回调,在客户端(浏览器)发出请求后,仍然可以做其他的事。
二、I/O(阻塞、非阻塞,同步、异步)的区别
1、阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
2、同步与异步
同步与异步关注的是消息通信机制(synchronous communication/ asynchronous communication)。所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以就没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出之后,被调用者通过“状态”、“通知”、“回调”三种途径通知调用者。
总结来说,同步和异步的区别:请求发出后,是否需要等待结果,才能继续执行其他操作。
3、阻塞与同步
有人会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。
三、什么是IO操作
1、IO流
I:就是input 、O:就是output ,称为输入输出流。
IO操作,就是将数据写入内存或从内存输出的过程,也指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。常见IO流操作,一般指内存与磁盘间的输入输出流操作。
2、目的
持久化数据到硬盘,确保数据永久保存。
文件操作流程:打开文件、读写数据、关闭文件。读入写出,是站在内存角度界定的。
3、数据流分类
根据数据流动方向:
- 输入流,也称写入流。
- 输出流,也称读出流。
根据数据类型:
- 字节流:FileInputStream、FileOutputStream,缓冲字节流:BufferedInputStream、BufferedOutputStream
- 字符流:InputStreamReader、OutputStreamWriter,字符流便捷类:FileWriter,字符缓冲流:BufferedReader、BufferedWriter
延伸阅读1:计算机内存和磁盘的关系
内存和磁盘的关系可以用缓存的概念来形象地解释。计算机中的缓存就是利用一块比较快速的存储介质来暂存比较慢速的存储介质中的数据,以提高访问速度。通常情况下,计算机会将最近使用的数据从磁盘读入内存中进行操作,并在操作完成后将结果存回磁盘中。这就像是将读取到的数据暂存在内存中的缓存里,以提高计算机的响应速度。