32-答疑篇:Linux文件系统性能优化答疑
问题1:阻塞、非阻塞I/O与同步、异步I/O的区别和联
阻塞和非阻塞I/O
根据应用程序是否阻塞自身运行,可以把I/O分为阻塞I/O和非阻塞 I/O
- 阻塞I/O,是指应用程序在执行I/O操作后,如果没有获得响应,就会阻塞当前线程,不能执行其他任务
- 非阻塞I/O,是指应用程序在执行I/O操作后,不会阻塞当前的线程,可以继续执行其他的任务
同步I/O和异步I/O
根据I/O响应的通知方式的不同,可以把文件I/O分为同步I/O和异步I/O
- 同步I/O,是指收到I/O请求后,系统不会立刻响应应用程序
等到处理完成,系统才会通过系统调用的方式,告诉应用程序I/O结果 - 异步I/O,是指收到I/O请求后,系统会先告诉应用程序I/O请求已经收到,随后再去异步处理
等处理完成后,系统再通过事件通知的方式,告诉应用程序结果
阻塞/非阻塞和同步/异步,其实就是两个不同角度的I/O划分方式
它们描述的对象也不同,阻塞/非阻塞针对的是I/O调用者(即应用程序)
而同步/异步针对的是I/O执行者(即系统)
例子1:比如在Linux I/O调用中
系统调用read是同步读,所以,在没有得到磁盘数据前,read不会响应应用程序
而aio_read是异步读,系统收到AIO读请求后不等处理就返回了
而具体的read结果,再通过回调异步通知应用程序
例子2:在网络套接字的接口中
使用send()直接向套接字发送数据时,如果套接字没有设置O_NONBLOCK标识
那么send()操作就会一直阻塞,当前线程也没法去做其他事情
当然如果用了epoll,系统会告诉你这个套接字的状态,那就可以用非阻塞的方式使用
当这个套接字不可写的时候,可以去做其他事情,比如读写其他套接字
find命令全局搜索文件,会不会导致系统缓存升高
通过学习Linux文件系统的原理知道,文件名以及文件之间的目录关系,都放在目录项缓存中
而这是一个基于内存 的数据结构,会根据需要动态构建
所以,查找文件时,Linux就会动态构建不在缓存中的目录项结构,导致dentry缓存升高
[root@local_sa_192-168-1-6 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 34568 1323176 2140 2278276 0 0 0 0 139 160 0 0 100 0 0
1 0 34568 1295240 2140 2305888 0 0 208 0 596 546 6 7 85 2 0
0 0 34568 1293264 2140 2307192 0 0 2080 0 1069 1079 2 3 95 1 0
0 0 34568 1289752 2140 2307816 0 0 2732 0 1120 1345 0 3 96 1 0
0 0 34568 1281816 2140 2310688 0 0 4348 946 1214 1582 2 5 70 23 0
0 0 34568 1280064 2140 2311104 0 0 1336 11 1252 1043 1 2 98 0 0
1 0 34568 1277808 2140 2311708 0 0 1652 0 1349 1030 1 2 97 0 1
转载请注明出处哟~
https://www.cnblogs.com/lichengguo