先記錄幾個問題,今天把詳細答案整理出來
一、netty底層使用的是epoll,還有其他的poll,select,他們直接的區別是什麼?
https://www.cnblogs.com/Anker/p/3265058.html
epoll是poll和select的加強版,poll和select主要是對fd的描述不同,epoll解決了poll和select的三個缺點,第一.直接將fd註冊在內核裏面,只需要一次從用戶態到內核態的拷貝;第二.select和poll每次調用的時候,都會遍歷fd列表,檢查就緒狀態,而epoll則只需要通過epoll_ctl將fd綁定在設備等待隊列上,並設置回調事件,當設備準備繼續時,調用回調函數,將fd放在就緒鏈表上。當調用epoll_timeout的時候,就直接獲取就緒的fd,而不用去遍歷所有的fd了。第三個是沒有fd大小限制。
二、使用dubbo協議和hession2協議,進行200k數據傳輸的時候,性能反而沒有http協議和rmi協議快,原因是什麼?
三、線程切換會有開銷,具體是什麼樣的開銷?
四、linux爲什麼要分爲內核態和用戶態,內核態包括哪些,用戶態包括哪些內容?
五、fd是啥東西?
linux中, 每一個進程在內核中,都對應有一個“打開文件”數組,存放指向文件對象的指針,而 fd 是這個數組的下標。
我們對文件進行操作時,系統調用,將fd傳入內核,內核通過fd找到文件,對文件進行操作。
既然是數組下標,fd的類型爲int, < 0 爲非法值, >=0 爲合法值。在linux中,一個進程默認可以打開的文件數爲1024個,fd的範圍爲0~1023。可以通過設置,改變最大值。
在linux中,值爲0、1、2的fd,分別代表標準輸入、標準輸出、標準錯誤輸出。在上一篇文章中,使用重定向 2>/dev/null 就是把標準錯誤輸出重定向到位桶中去,不顯示出來。因爲 0 1 2已經被linux使用了,通常在程序中打開的fd,是從3開始的。但我們在判斷一個fd是否合法時,依然要使用>=0的判斷標準。
fd的分配原則,是從小到大,找到第一個不用的進行分配。
除了open之外, socket編程的socket()/accept()等函數,也會返回一個fd值。
1)Linux系統下,所有進程允許打開的最大fd數量。查詢語句:
/proc/sys/fs/file-max
2)Linux系統下,所有進程已經打開的fd數量及允許的最大數量。查詢語句:
/proc/sys/fs/file-nr
3)單個進程允許打開的最大fd數量.查詢語句:
ulimit -n
4)單個進程(例如進程id爲5454)已經打開的fd.查詢語句:
ls -l /proc/5454/fd/