技術原理思考20190904

先記錄幾個問題,今天把詳細答案整理出來

一、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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章