异步IO和同步IO概念学习

Posted wenzhongyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步IO和同步IO概念学习相关的知识,希望对你有一定的参考价值。

I/O 既 输出/输入 (Input/Output)

既然是输入输出,为什么又会有同步和异步的不同方式呢?

同步 当一个IO操作进行时,系统停下来等待这个IO的操作完成后才会继续进行下面的计算。

异步 当一个IO操作进行时,通过多线程等方法,当CPU去处理那些不需要依赖IO执行结果的计算,充分的利用CPU的运算能力。当IO操作执行完毕时,继续执行后续的操作。

一般情况下,作为单机程序或者IO反应速度非常快等待时间非常短,使用“同步”方式对于编程的稳定性、简单性都是很好的选择,一个操作完成后再去执行其他的操作。

但是如果IO的等待时间比较长,比如打印机、慢速网络,“异步”方式就会显得非常重要了。

想象一下,如果打印机开始打印Word就不能进行任何的操作,用户岂不是要等的心发慌?

异步操作 往往是和多线程 并行 密切相关的,也是目前多路、多核CPU能够释放威力的强大武器

异步I/O的优点:异步I/O是和同步I/O相比较来说的,如果是同步I/O,当一个I/O操作执行时,应用程序必须等待,直到此I/O执行完。相反,异步I/O操作在后台运行,I/O操作和应用程序可以同时运行,提高了系统性能;使用异步I/O会提高I/O流量,如果应用是对裸设备进行操作,这种优势更加明显, 因此像数据库,文件服务器等应用往往会利用异步I/O,使得多个I/O操作同时执行. 而且从官方文档来看,ORACLE也是推荐ORACLE数据库启用异步IO的这个功能的。


根据文档[Note 370579.1] ,可以通过查看slabinfo统计信息查看操作系统中AIO是否运行,slab是Linux的内存分配器,AIO相关的内存结构已经分配,kiocb值的第二列和第三列非0即是已使用

[root@DB-Server ~]# cat /proc/slabinfo | grep kio 
kioctx                62    110    384   10    1 : tunables   54   27    8 : slabdata     11     11      0
kiocb                  0      0    256   15    1 : tunables  120   60    8 : slabdata      0      0      0

kiocb值的第二列和第三列非0表示系统已经启用异步IO。如上所示,表示异步I/O没有在使用。


SQL> alter system set filesystemio_options = setall scope=spfile; 
 
System altered.
 
SQL> alter system set disk_asynch_io = true scope=spfile; 
 
System altered.


关于参数filesystemio_options有四个值: asynch、directio, setall,none. 一般建议设置为setall比较合适。

You can use the FILESYSTEMIO_OPTIONS initialization parameter to enable or disable asynchronous I/O or direct I/O on file system files. This parameter is platform-specific and has a default value that is best for a particular platform. It can be dynamically changed to update the default setting.

FILESYTEMIO_OPTIONS can be set to one of the following values:

 

   · ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.

            在文件系统文件上启用异步I/O,在数据传送上没有计时要求。

· DIRECTIO: enable direct I/O on file system files, which bypasses the buffer cache.

            在文件系统文件上启用直接I/O,绕过buffer cache。

· SETALL: enable both asynchronous and direct I/O on file system files.

            在文件系统文件上启用异步和直接I/O。

· NONE: disable both asynchronous and direct I/O on file system files.

           在文件系统文件上禁用异步和直接I/O。

 

设置完成后重启数据库,验证异步IO特性是否启用。如下所示, kiocb的第二、三列都不为0,表示ORACLE的异步IO特性已经启用。

[oracle@DB-Server ~]$ cat /proc/slabinfo | grep kio 
kioctx                60     80    384   10    1 : tunables   54   27    8 : slabdata      8      8      0
kiocb                  6     30    256   15    1 : tunables  120   60    8 : slabdata      2      2      0
[oracle@DB-Server ~]$ 





以上是关于异步IO和同步IO概念学习的主要内容,如果未能解决你的问题,请参考以下文章

同步/异步/阻塞/非阻塞

Linux五种IO模型(同步 阻塞概念)

python同步和异步IO

IO模式——同步(堵塞非堵塞)异步

Java BIONIOAIO 学习

JAVA - IO模型