第一次发文章,写的不好请见谅,写错了请指正。
文章使用到饮水机接水来打比方、下文中杯子没有接水和没有接满水统称为没有接满水。
当我们想要喝水的时候需要拿着杯子到饮水机旁接水,这个过程就是我们需要IO操作场景。正常情况下是饮水机里有水,我们接完后就直接走掉了,但是有的时候我们倒霉,刚好碰到了没有水的情况,面对这些没有水的倒霉情况,我们就产生了不同的应对策略,也就是我们说的阻塞IO、非阻塞IO、多路复用IO、异步IO。
阻塞IO
当饮水机里没有水的时候,我们的杯子没有接满水,这个时候阻塞IO的策略就像我们拿着杯子,一直等到饮水机里有水,然后我们接满后才离开。
在等待的过程中,我们什么事情都不做就是等着有水然后接水。把我们想成是一个线程,我们的老大是操作系统,我们的老大希望我们赶紧接完水,然后去工作。同时接水的可能有很多人,老大就需要来回的查看我们有没有接满水,也就是线程的上下文切换,这就让浪费了老大的时间,就是产生了很大的系统开销。
非阻塞IO
这个策略是当我们碰到没有水的的情况或者我们没有接满水,我们返回到我们的工位,继续干我们的活,然后每过一段时间就去查看饮水机有没有水,有水我们就接满然后继续干活。
这个策略解决了系统上下文切换的开销的问题,但同时也产生了我们需要每隔一段时间就要看饮水机有没有水。
多路复用IO
回到阻塞IO,一个房间里有很多个人在等接水,老大看我们人有点多,于是就安排了一个人负责指定房间里等接水的人。当有饮水机有水时,站在这个饮水机前的人就可以准备接水了,这个时候这个人就会通知老大,然后老大就找到这个人(线程拿到CPU),接满水后就拉走继续干活。
异步IO
这个策略就是给我们一个智能设备,当饮水机里没有水的时候我们就继续回去干活,当饮水机里有水的时候,这个设备就会通知我们,然后我们去接满水,然后继续干活,使我们不停的在干活(资本家听了都流泪),效率就得以提升。
补充
因为个人的表达原因,上述每个人物代表的东西有些问题。
实际上计算机需要IO操作,饮水机相当于缓冲区,操作系统需要在这里读取数据,也就是接水。例子里面接水的是我们,实际上在计算机中执行IO操作的(接水这个过程)是CPU,也就是老大,我们扮演的角色是线程,实际上并没有执行能力。
由于个人的表达原因,讲述的不是很好,对实际上IO操作各个部件的功能有些扭曲,这个问题可以自行百度,然后加以总结就行。