1. 程式人生 > 其它 >32-答疑篇:Linux檔案系統性能優化答疑

32-答疑篇:Linux檔案系統性能優化答疑





問題1:阻塞、非阻塞I/O與同步、非同步I/O的區別和聯

阻塞和非阻塞I/O
根據應用程式是否阻塞自身執行,可以把I/O分為阻塞I/O和非阻塞 I/O

  1. 阻塞I/O,是指應用程式在執行I/O操作後,如果沒有獲得響應,就會阻塞當前執行緒,不能執行其他任務
  2. 非阻塞I/O,是指應用程式在執行I/O操作後,不會阻塞當前的執行緒,可以繼續執行其他的任務

同步I/O和非同步I/O
根據I/O響應的通知方式的不同,可以把檔案I/O分為同步I/O和非同步I/O

  1. 同步I/O,是指收到I/O請求後,系統不會立刻響應應用程式
    等到處理完成,系統才會通過系統呼叫的方式,告訴應用程式I/O結果
  2. 非同步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