17. Interview-Linux

1 用過哪些Linux命令?

2 寫過shell腳本嗎?shell腳本基本格式?

3 Linux I/O讀寫方式

Linux提供了3種磁盤與主存之間數(shù)據(jù)傳輸方式:

  • 輪詢
    • 基于死循環(huán)對I/O端口不斷檢測
  • I/O中斷
    • 當(dāng)有數(shù)據(jù)到達(dá)時,磁盤主動向CPU發(fā)起I/O中斷請求,由CPU負(fù)責(zé)數(shù)據(jù)的傳輸過程
  • DMA傳輸
    • 在I/O中斷基礎(chǔ)上引入了DMA(Direct Memory Access,直接存儲器訪問技術(shù)),由DMA負(fù)責(zé)數(shù)據(jù)的傳輸,減少I/O中斷操作對CPU的資源消耗
傳統(tǒng)I/O
I/O中斷
DMA傳輸

4 Linux select&poll&epoll

  • select(1983年在BSD里實現(xiàn))

    • 時間復(fù)雜度O(n)
    • 會修改傳入的參數(shù)
    • 輪詢sock查找數(shù)據(jù),數(shù)據(jù)量大開銷很大
    • 線程非安全
    • 只能監(jiān)視1024個連接
  • poll(1997年實現(xiàn))

    • 時間復(fù)雜度O(n)
    • 線程非安全
  • epoll(2002年實現(xiàn),Linux系統(tǒng)是epoll,F(xiàn)reeBSD和macosx用的是kqueue)

    • 時間復(fù)雜度O(1)
    • 不用輪詢sock查找數(shù)據(jù)就能知道哪個sock有數(shù)據(jù)
    • 線程安全
    • select函數(shù)是阻塞的,可以注冊自己感興趣的IO請求,等到數(shù)據(jù)來時再處理,可以提高CPU利用率,epoll利用Reactor設(shè)計模式實現(xiàn)了這一機(jī)制。
    • 只支持Linux系統(tǒng)

表面上看epoll的性能最好,但是在連接數(shù)少并且連接都十分活躍的情況下,select和poll的性能可能比epoll好,畢竟epoll的通知機(jī)制需要很多函數(shù)回調(diào)。

epoll數(shù)據(jù)結(jié)構(gòu)(紅黑樹+雙鏈表+回調(diào)機(jī)制)

epoll數(shù)據(jù)結(jié)構(gòu)

第一步:epoll_create()系統(tǒng)調(diào)用。此調(diào)用返回一個句柄,之后所有的使用都依靠這個句柄來標(biāo)識。

第二步:epoll_ctl()系統(tǒng)調(diào)用。通過此調(diào)用向epoll對象中添加、刪除、修改感興趣的事件,返回0標(biāo)識成功,返回-1表示失敗。

第三部:epoll_wait()系統(tǒng)調(diào)用。通過此調(diào)用收集收集在epoll監(jiān)控中已經(jīng)發(fā)生的事件。

5 Linux sendfile(零拷貝)

傳統(tǒng)的IO傳輸方式(read/write)

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

目標(biāo)數(shù)據(jù)被復(fù)制了4次,涉及四次內(nèi)核態(tài)和用戶態(tài)的上下文切換:硬盤—>內(nèi)核buf—>用戶buf—>socket相關(guān)緩沖區(qū)—>協(xié)議引擎

senfile傳輸

sendfile(socket, file, len);

硬盤 >> kernel buffer (快速拷貝到kernel socket buffer) >> 協(xié)議棧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容