32-答疑篇:Linux檔案系統性能優化答疑
阿新 • • 發佈:2021-12-23
問題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