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的資源消耗



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_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é)議棧