同步、异步、阻塞、非阻塞、并发、并行在网络IO、磁盘IO中的具体概念

同步 异步 阻塞 非阻塞 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 并发 并行

我们一般讲的这些概念一般指的都是在IO模型中的概念,也就是网络IO/磁盘IO,在这两种不同的IO模型中,它们的概念是会有一些区别的。

一、什么是IO

IO其实就是Input/output,就是读取和输入,也可以说是读/写。针对不同的对象,IO模型可以划分为磁盘IO模型和网络IO模型

网络IO:所谓的网络IO就是客户端、服务端通过网络协议对socket套接字进行读/写操作。
			   两端使用TCP协议进行通讯时(注:每次通信都会创建连接),都会将数据包放入socket中并划分缓冲区,网络IO操作的就是这个缓冲区的数据
磁盘IO:应用程序通过read()方法从内核缓冲区中读取数据/通过write()往内核缓冲区中写入数据

二、网络IO

1、同步、异步

同步、异步的概念只与客户端有关,此处的客户端在B/S架构中就是浏览器,在C/S架构中就是应用程序

(2)同步:当客户端向服务端发起通信请求、创建连接时,客户端会一直等待,直到服务端的结果数据复制到对应进程的Socket缓冲区中,客户端能够从缓冲区中获取到数据才会返回调用,执行其他操作。
(3)异步:当客户端向服务端发起通信请求、创建连接时,客户端不需要等待服务端的结果数据复制到缓冲区中,在进行下一步或者其他操作,可以直接返回调用,执行其他操作,客户端通过回调函数、状态通知或者轮询来查看请求结果,异步一般会启用消息队列来提升性能
2、阻塞、非阻塞
(1)阻塞、非阻塞的概念是针对服务端,针对请求的处理线程来讲。是处理线程在等待调用结果时的状态
(2)阻塞:服务端接收请求后发起处理线程,处理请求,在此期间,此线程会被挂起,一直等待请求结果,不会被释放
(3)非阻塞:服务端接收请求后发起处理线程,处理请求,在此期间,此线程不会被挂起等待请求结果,可以自由的处理其他的请求连接,处理线程通过回调函数、状态通知或者轮询来查看请求结果	

三、磁盘IO

1、同步、异步在磁盘IO中不存在

严格意义上来讲,在磁盘IO中并不存在同步、异步这种概念,与磁盘IO相关的只有阻塞、非阻塞的概念。
因为磁盘IO是操作系统的指令通过应用程序在cpu上执行,也就是说它与网络socket套接字无关,也就不存在同步、异步了。
但是它与进程、线程有关系,因为进程是应用程序分配和管理资源的基本单位,而线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源,而阻塞、非阻塞就是与线程相关的概念了。它们是不可以混淆的!

2、阻塞、非阻塞
(1)阻塞:在一个线程中,cpu执行代码的速度很快,但是一旦遇到磁盘IO操作(如:读写文件)时,此线程就得等待磁盘IO操作完成,才能进行其他操作,而其他需要被此线程执行的代码就无法被执行了,只能等待磁盘IO执行完成。
(2)非阻塞:当线程需要执行磁盘IO操作时,此线程只调用IO操作,并不等待IO操作的结果,可以同时执行其他操作,等待IO执行完成才进行处理

四、同步阻塞、同步非阻塞、异步阻塞、异步非阻塞

由上可得同步、异步、阻塞、非阻塞同时存在的只有网络IO中,它们两两组合就形成了四个组合概念

(1)同步阻塞:客户端发送请求,创建连接后,一直等待socket缓冲区中有请求数据,而服务端接收到请求后发起处理线程,用于处理请求,在此期间处理线程一直挂起等待请求结果。
(2)同步非阻塞:客户端发送请求,创建连接后,一直等待socket缓冲区中有请求数据,而服务端接收到请求后发起处理线程,用于处理请求,在此期间处理线程不会被挂起,还可以进行其他操作,比如处理其他请求连接,同时通过间隔时间轮询、回调函数、状态通知查看请求结果
(3)异步阻塞:客户端发送请求,创建连接后无需等待socket缓冲区中有请求数据,直接返回调用,进行其他操作,客户端通过回调函数、状态通知或者轮询来查看请求结果(异步一般会启用消息队列来提升性能),服务端接收请求后发起处理线程,处理请求并在此期间挂起等待请求结果
(4)异步非阻塞:	创建连接后无需等待socket缓冲区中有请求数据,直接返回调用,进行其他操作,客户端通过回调函数、状态通知或者轮询来查看请求结果,而服务端接收请求发起处理线程后,处理线程在处理请求期间不会挂起,可以正常进行其他的操作,同时通过间隔时间轮询、回调函数、状态通知查看请求结果

四、并发、并行

1、并发是一种比较宽泛的概念,无论是cpu执行方式还是程序执行方面,它单纯代表计算机可以同时处理多个任务。
如果是单核处理器,cpu是通过时间片轮转来进行交替执行的,也就是无序执行,执行一个任务一段时间、然后切换到另一个任务执行一段时间,如此往复,这个过程也称为线程或进程的上下文切换
2、并行是指多核cpu的情况下,真正的多个线程同时执行(当然,如果进程或线程数量过多,还是以时间片轮转的方式交替执行的)

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...