1. 程式人生 > >Linux核心工程導論——linux學習和職業曲線(初學者,中級,高階都可參考)

Linux核心工程導論——linux學習和職業曲線(初學者,中級,高階都可參考)

Linux世界介紹

給自己定級

門外漢:
不會安裝作業系統
不會用虛擬機器(安裝和使用)
入門級:
熟悉常見的發行版,甚至裝過並且能用一些特殊發行版(例如kali)做過一些簡單的圖形介面的使用。
會一些最基礎的命令(例如cd、ps、top、ls、ifconfig等這個級別的)
基礎級:
可以使用一些常見的命令(touch、tail、date、find、du、fdisk、less、pidof等這個級別的命令)
圖形介面操作的比較熟練,並且能夠對應一部分的後臺命令。
知道一些常用的配置檔案的作用(如/etc/hosts、/etc/resolv.conf、/etc/passwd+、/etc/mtab等)
中級:
掌握一些高階的命令(如iftop、iptraf、rsync、ngrep、sar、acct、sg系列、inotail、nmap、lsof、ip、dig、wall、write、mkfs、grub系列、awk、sed、cron等)
熟悉一些高階配置檔案的使用(如ld.conf)
熟悉proc、sys檔案系統(進行諸如tcp調優等工作)
熟悉uevent(hotplug)、inotify等高階系統特性
懂得根據自己的需求配置編譯核心,可以使用指令碼程式設計
會使用iptables
高階:
可以掌握系統的高階特性。如安全的capability、suid、pam、lsm,如詳細的kobject體系(可以通過檢視sys檔案系統取代常用的命令),netfilter的hook使用和bpf(tcpdump)和ebpf的使用),程序的優先順序排程(幾種實時優先順序和非實時優先順序的設定),oom分數的調整、cgroup
可以自由的選擇使用高階的檔案系統(如squashfs、gfs、ecryptfs、configfs等)
熟悉X系統、ssh(轉發、反彈等高階操作)、socks、tcp wrapper等遠端訪問相關
可以進行核心的高階定製編譯(適當的修改核心程式碼,追蹤解決核心bug)
可以編寫基礎的核心模組,使用常用的核心程式設計介面
懂得二進位制原理(elf檔案格式、objdump、ld、nm、strings等常用二進位制軟體的熟練使用)
各種bootloader的製作和安裝

專家級:
此級別一般是專業方向,不是通用技能。系統的瞭解和預備知識的準備同樣重要。例如tcp的深刻理解才會知道如何做syn的ddos防護(不是核心的那個開關),對無線理論的深刻了解,才能搞無線的核心和應用內容。
核心虛擬化、核心儲存邏輯(scsi、pci、usb等專一的和串聯的)、無線子系統、音訊子系統、顯示卡子系統、電源管理子系統、網路子系統、電源管理子系統

專家級之前的一般都要學會,工作中都會用到。這裡的定級也限於對linux作業系統的使用,一般是軟體和系統特性,也並沒有涉及太多的程式設計要求。程式設計是另外的一個方面,程式設計能力不好不一定linux水平不行,所以這裡的定級不怎麼考慮程式設計水平。

學習方式

使用者

對linux的使用者有用來替代windows的普通桌面使用者(如使用startos),可能原因是覺得windows不好用,或者是感情問題,或者是版權問題,或者是為以後深入linux做平滑準備的。
也有命令使用者。這部分人涵蓋了很多實際的工作崗位,典型的是運維。運維有很多細分的子崗位:系統管理,軟體管理,後臺伺服器管理(例如資料庫,http server),軟體部署,安全等。安全有時候劃入運維,有時候單獨列出。所以,linux用好了就是可以當飯吃的。

桌面使用者

使用桌面可以滑鼠點點就行,但是也可以用的很銷魂。也有專門的職業工作就是怎麼把桌面用起來。例如嵌入式裡的裁剪和啟動桌面(讓startx命令跑起來)。

普通桌面使用者

linux的桌面有很多。普通的使用者一般會直接使用這幾個桌面提供的環境和軟體。

發行版

    發行版有很多,一般是不同風格或者是服務於不同目的的專用發行版。常見的通用的發行版有:Ubuntu、opensuse、fedora、debian、Mandriva、mint、。目前ubuntu大有一統之勢,越來越多的使用者和開發者轉向ubuntu,甚至伺服器後端以前常用的centos也在慢慢的丟失市場給ubuntu server。
    專用如kali(網路滲透),puppy,lubuntu(精簡),coreos,ubuntu core(虛擬化),router os(路由器)。這些專用發行版一般提供給專業使用者,普通使用者也可以使用,要發揮其全部威力,通常需要更多的行業知識。

桌面環境

    常見桌面環境有很多:ubuntu的unity、gnome、kde、Cinnamon、mate、lxde、xfce。一般各個發行版都會攜帶不同的桌面魂晶,每個桌面環境的視窗風格都是不一樣的,還包括隨桌面管理器攜帶的配套軟體一般也是不一樣的(例如計算器,包管理器,音樂播放器等)。但是有的流行的軟體還是會被移植到不同的桌面管理器上,但是大部分沒有。
    gnome、kde、unity的使用者最多。unity目前只用於Ubuntu。ubuntu也並不是只支援unity一種,幾乎所有的桌面環境ubuntu都有對應的支援版本。unity的使用率隨著ubuntu的普及而迅速上升。

高階桌面使用者

    高階的桌面使用者一般可以自由的選擇不同的桌面環境,理解每個桌面環境工作的原理,理解X系統,可以遠端多終端使用X,自由的選擇啟動甚至不啟動X或者X的一部分。理解X和桌面管理器與視窗管理器的區別。

FrameBuffer

    framebuffer模式的顯示卡本身不具有任何運算資料的能力,他好比是一個暫時存放水的水池.CPU將運算後的結果放到這個水池,水池再將結果 流到顯示器.中間不會對資料做處理.在這中情況下,所有顯示任務都有CPU完成,CPU負擔很重.從frambuffer這個名字我們就能猜測到他的功能 了(資料偵緩衝).
在linux核心中有有framebuffer機制,摹仿framebuffer顯示卡的這種功能.他的好處是把顯示卡的硬體結構抽象掉,把所有的顯示卡都當做一個”水池”來用.應用程式也可以直接讀取這個水池的內容.framebuffer的裝置名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空螢幕.如果你的X用的是framebuffer的驅動,螢幕將全變黑.通過移動滑鼠,切換視窗等動作可以讓原先的內容重新顯示.
    如果你不用framebuffer驅動,可以在字元模式下做這個試驗.螢幕將全部被清空.
以下的命令:
#dd if=/dev/fb of=fbfile
可以將fb中的內容儲存下來,以後可以重新寫回螢幕:
#dd if=fbfile of=/dev/fb
作用類似於螢幕截圖,但是截下的圖不能用普通圖片瀏覽器看.

    linux字元介面在高解析度下,啟動時會有一個小企鵝logo,這個logo就是用framebuffer功能寫上螢幕的.

X

Linux核心給使用者提供了顯示frame buffer,所有要顯示的東西寫到buffer去就好了。也就是核心提供了顯示的機制,但是沒有提供顯示的內容。所以顯示內容需要 作業系統去實現。
幾乎所有的linux顯示的核心都是X系統,X是一種顯示協議,實現這個協議的常用軟體是Xfree86、motif(商用),xorg、xnest等。所以X也可以實現在windows中,蘋果作業系統也是用的X,只是是實現在核心中。現在的髮型版一般都預設使用xorg。好多人都看到x11這個詞,X11R6 實際上是 X Protocol version 11 Release 6(X協議第11版第六次發行)的意思。

命令使用者

基礎的命令完成基礎的功能

運維使用者

   運維人員可以說是最專業的linux使用者了,因為他們要關心linux整個系統的執行狀況,是對linu系統的使用挖掘的最深的一群人。研發可能會更深入,但是一般不如運維的廣度和揮灑自如。
   一個運維的基本功應該是檢視系統狀態的命令和指令碼的編寫,深入一些的運維對linux有很深刻的瞭解。

命令

   運維常用的檢視系統資源的命令有:
- 網路
- iftop:檢視ip——ip的流量。還可以互動的檢視埠到埠,以及進行過濾
- netstat(可以用ss替代)
- iptraf:圖形化的觀看ip流量
- nethogs
- tcpdump:抓包直接列印或者儲存為pcap檔案,甚至可以生成bpf程式碼
- ngrep:把網路資料包當成grep檔案一樣過濾。快速檢視網路資料的神器
- mascan:掃描器
- hscan:掃描器
- nmap:掃描器
- 記憶體
- vmstat
- io
- iostat:
- iotop
- 程序
- top:基礎的程序檢視工具。可以動態的檢視程序的記憶體、cpu等系統資源。可以互動
- htop:增強的top,介面更漂亮,功能也略多
- 其他:
- sar
- lsof
- acct
- monit
   一些方便的工具應用:
nping、incron(使用inotify機制,當檔案發生變化時自動執行註冊指令碼,對應於cron是基於時間的,incron基於檔案事件),rsync(遠端檔案同步)、inotial(不是輪訓的tail,而是基於檔案變化事件的tail)

機制

  • proc檔案系統和sys檔案系統是運維人員的提高篇,可以從 /proc/pid/下面的檔案中看到在上述命令中看到的東西,從/proc/sys/中看到和修改系統當前的引數配置。從/sys/目錄下面看到系統當前的物理資源(例如通過rotational檔案來判斷一個裝置是否是ssd),
  • sys檔案系統內部的kobject、ksystem、kset機制和uevent,hotplug、udev等要熟悉
  • 可以升級linux核心,熟練使用grub
  • 熟悉使用inotify、rsync、zk、ansible等基礎設定軟體進行釋出和同步
  • 基於對scsi在linux的重要性的瞭解,瞭解sg系列命令的使用

指令碼

一般的運維人員都會讓自己的shell儘量的帥起來,例如使用guake,tmux,zsh等,還要熟練使用ssh遠端管理系統,以及相關配置。通常大家都是編寫bash指令碼。
一般的,運維人員的cron和自動化指令碼都是管理的每臺機器必有的。

系統管理員

系統管理員與運維人員很類似,不過運維一般出現在網際網路企業,系統管理員一般出現在傳統企業。一般的,系統管理員比運維更偏向於使用現有工具,而運維對系統的瞭解和指令碼的使用更熟悉一些。

一般對升級核心要求不多,但是升級系統版本還是有的,庫的部署,部署環境(docker),解決環境問題,軟體釋出,配置管理等。
一般對etc下的配置檔案都要很熟
一個大頭的工作很可能是:修電腦。。。。

後臺服務管理員

例如資料庫管理員、http server、ntp、dns server、ftp server等各種常見的伺服器的搭建和配置管理。說起來容易,但每個軟體的配置檔案都是一坨。詳細閱讀doc,多踩坑,祝君好運。

安全使用者

linux的安全系統發展至今很全面,但是還是遠遠不夠,linux距離一個安全的作業系統還有很長的路要走。
- 在linux中的基礎安全是UGO檔案許可權,對於程序的能力限制capbilities。
- 提高的是核心的安全框架lsm,以及在lsm下實現的各種防火牆,例如實現flask框架的selinux和apparmor。
- 還有針對檔案的,mount檔案系統的時候指定acl就可以針對檔案進行訪問控制。還有開源的防毒程式clamav
- 還有訪問控制模組pam,可以把程序的認證工作由程式設計師轉交給系統管理員

核心使用者

核心剪裁、編譯、修改、移植
   核心的使用者多見於嵌入式開發和運維的核心升級。但是運維的核心升級一般涉及的功能裁剪較少,涉及的漏洞更新和功能增強較多。換句話說運維做核心是為了升級,嵌入式做核心是大部分為了降級。
   很重要的一點,linux核心從2.6.30版本開始,基本不適用於嵌入式系統。雖然仍聲稱為嵌入式應用做了諸多優化,但是業界的嵌入式開發基本停步在2.6.30版本的核心。你可以看到核心的新功能和增強基本都是為了網際網路而產生的,而針對這樣的核心進行裁剪也越來越難,甚至要高版本的核心在嵌入式板子上跑起來這個基本的工作也越來越複雜。這也從側面反映出了網際網路的活力和嵌入式行業的守舊。
   核心的裁剪工作最基本的不要求對核心如何實現有太多的瞭解,但是需要知道核心實現的那些功能有什麼,為何需要。例如你得現有net裝置,之後net功能才是可選,並且net功能的繁多,一個嵌入式裝置根本大部分不需要。核心的編譯排版很重要的一點是按照功能的層級劃分的,而不是按照功能的重要性劃分的。比如你會發現無線系統裡rfid,led,業餘無線電和wifi是平級的,但是大部分人對前三者是不會使用的,只需要wifi。但是核心的編譯選項的組織並沒有針對這種需求上的流行程度進行優化。
   所以一個核心裁剪者需要知道幾乎所有核心選項的作用,最好多試試。至於針對修改,核心的實現大部分為了通用性,對效率和安全的考量是非常少的。如果你深入核心的程式碼層次的研究,你會發現核心的實現大部分在你使用的場景,你會有更優的演算法。你會想去重新實現。但是,這裡有一點linux核心最大的哲學:
核心的主要目的是搶佔市場。
   所以,核心會覆蓋儘可能多的功能,但是大部分功能的實現都不是企業級的。例如如果你的產品要支援印表機,你一般不會去用核心內建的功能,你會去購買更產品化的核心模組(例如kcodes),如果你的產品要支援samba,你會發現核心對ntfs的支援就是搞笑的,你還是會去購買商用的ntfs核心模組(商用的和開源的是同一個公司開發的)。當你多關注核心的發展時,你會發現開源發展的最好的模組一般是企業支援的,而這背後一般有商用版本存在。這就是核心的本質,出發點是開源的,共享的,發展是靠利益驅動的,繁榮則是完全靠商業的。同樣的,商業又會阻礙核心的發展,所以感激尚存的為了理想而生活的程式設計師。他們該開個賬戶,我們給他捐款。0….
   移植工作考驗的大部分不是核心本身的技能,而是對gcc的瞭解程度,尤其是核心使用的Makefile系統。所以,想要做好嵌入式核心的移植工作,編譯系統和連線的paper看一遍你基本就是大牛了。中國業界的大部分從業者,都不會去看的。我也不知道為啥,他們就是不去看。。。。

開發者

   開發者就是傳說中的程式設計師。剛開始入門的程式設計師一般會注重語法,helloworld就是這種心態的典型寫照。不同級別的程式設計師使用者的素質要求是不一樣的。例如寫業務程式碼,需要架構能力和編碼標準。寫高效能程式則需要數學,演算法和高效能程式設計的硬體相關的知識。寫實時程式碼又是需要另外一套理論體系。程式設計的語法是基礎,但是程式設計的核心從來都不是語法。
   選擇了一門好語言,基本就能確定你要用他來做的事情。不存在萬金油的語言,注重效率的和注重快速開發的,注重工程管理,注重描述問題的都不是同樣的語言(當然你要用C做web開發我也沒辦法),甚至還存在專門處理字串最牛逼的語言(perl)。對於linux來說,linux是個平臺,開發高效能程式碼一般就得是asm,C和C++,需要效能和開發效率折中的可以有golang,指令碼化的語言也是都可以用在linux上的,那取決於業務。
   單有語言寫個hello world還可以,工程程式設計最重要的是庫。就是程式碼的複用。一個成熟的程式設計師和一個入門級的程式設計師的最大區別不在於語法的熟練程度,在於架構能力和庫的複用能力。
   所以,linux之於開發者,不存在程式語言和庫上的障礙。基本上是核心所提供的功能上的,以及你如何使用這種功能(利用epoll、inotify等)

桌面應用開發者

   linux下常見的桌面主要是kde和gnome,但是基本沒人敢用他們開發工業產品,因為指不定哪天他們就沒了。照目前看來,gnome伴隨著ubuntu的unity使用者UI統一天下的概率很大,說不定日後越來越多的廠商願意為ubuntu的gnome開發圖形介面的應用。目前linux上的產品級的應用的圖形介面一般使用Qt,java(swing)等成熟的,可移植的圖形庫。
   所以目前來看,如果你是桌面程式設計師(andriod除外),你可能要用java和Qt的C++了。由於andriod也是java,所以最划算的選擇是用java(外國人對java有強大的熱情,因為他是最早普及的工業化的編碼語言,但不代表他是目前最好的)。所以學習桌面應用開發基本上就是學習這兩款產品的文件。

使用成熟庫的後端開發者

   後端開發者佔據了很大一部分it開發就業比例(介面,網站,等前端開發人數最多,變化最快,技術沉澱最難),幾乎所有面向社會的程式都有後臺伺服器(很多單機程式是沒有的),也是幾乎所有的後臺伺服器都要儲存資料。所以後臺開發者要面對的核心開發點就是:網路使用、傳輸編碼、資料儲存和多執行緒程式設計。至於後臺設計的業務,在這4大模組來看幾乎可以忽略。所以後端開發技術要求比較高。而目前的伺服器幾乎被linux一統江湖了,這個趨勢還會愈演愈烈,windows在這個領域基本沒救了。
   今年golang在後端開發的流行度迅速崛起,但是大部分還是使用C/C++,python做後臺開發也有相當大比例的份額(別說人家的效率不行,人家快,效率可以用錢買機器解決)。由於golang大部分使用自帶的網路庫,所以這節不關golang啥事了。
   網路常用的C/C++後端庫是:原生的epoll、libevent、libev、boost::asio,ace,ace一般產業界沒人用,較好不叫座,libev理論上比libevent高效,但是實際使用不見得。一般的工業級的開發都是使用libevent或者epoll,也有使用asio(比較少,因為C++難度高,大部分網路服務是C的)。
   傳輸編碼問題,以前是直接使用自定義的格式或者自定義的json後面加壓縮,後來發展出了序列化。再後來序列化進一步發展形成了protocolBuffer, thrift, avro等大公司主導的傳輸格式。目前一般要用網路傳輸資料protocol buffer用的最多,thrift強勢崛起,avro剛剛起步,但是特性不俗。
   資料儲存問題。mysql幾乎是大小系統的第一選擇。非常小的可能會使用sqlite,涉及到非IT大型企業可能用商用資料庫比較多(自己不能開發,賣他的人又得賺錢),nosql裡mongodb用的比較多,但是近年各種nosql資料庫千奇百怪。有專門存放圖的資料庫,也有儲存下載內容的分級的(rocksdb),也有儲存地理資訊的等等。如果你是專業方向的開發者,可能這些專門的資料庫更適合你。
   多執行緒程式設計,在C/C++的世界裡沒有太多的選擇,一般是pthread,C++可以用boost:thread或者C++11的thread,其後臺也是pthread,pthread基本可以一統江湖。
   所以使用庫的linux開發者只需要瞭解庫的用法,當然對庫後臺是怎麼呼叫作業系統具體實現的,能夠了解也是非常好的。

系統級後端開發者

   如果你打算看看你的發行版上裝的那些莫名其妙的庫是用來幹嘛的,例如libncurses,libnss,libfuse等,而這些一般你平時開發應用程式都用不到,那麼你基本做的就是系統級的後端開發了。系統開發與作業系統的關聯很大,學習系統開發就是在學習作業系統。
   系統開發對核心資訊的獲取要通過proc和sys,這是一定要熟練掌握的。這兩個proc還比較容易,但是內容也很多。sys則比較龐雜,內容更多。例如你得清楚的知道/proc/sys/kernel/core_pattern裡面存的是core dump的路徑,ulimit -c可以用來設定core的大小,預設是0.這些基礎的背景知識以及整個檔案系統衍生出來的知識點是系統級後端開發的基礎。
   這些常用的開發內容包括:fifo檔案,uevent,inotify,netlink,nice(實時程序),cpu親和度,cgroup虛擬化,ptrace程序跟蹤,子程序建立和控制,訊號處理,檔案鎖,向量化的讀寫檔案,檔案描述符操作,socket呼叫,epoll,檔案與目錄連結控制,鎖,磁碟配額校驗,程序記賬,許可權控制,執行優先順序(io和cpu),低階埠操作和sg直接發scsi命令,交換分割槽控制,pdflush,kswapd等核心程序的調優,模組的裝載與解除安裝,記憶體對映與加鎖,cache操作,直接的網路操作,使用者管理,訊息佇列、訊號量與共享記憶體等。
   系統級的後端開發直接是面向核心的使用,也就是系統級的開發者基本就是核心的合格使用者。

運維開發者

   運維開發者比較接近於系統開發者,但是運維開發者比較多的使用cron命令,指令碼,著重於系統資源的監控和劃分。現在流行的devops例如ansible工具讓運維與開發一氣呵成。運維開發者首先是一個運維使用者,運維繫統例如全網監控系統,包釋出系統,主機探測系統,域名系統等都是運維開發者的方向。一個運維開發者不做具體業務,也不是直接為具體業務服務,而是讓具體業務可以專注於具體業務。
   一般的技能要求:常用運維命令,指令碼,python

安全開發者

   安全開發者有兩種,一種是如何讓自己開發的軟體更安全,另一種是就是開發安全防護軟體。例如病毒掃描,防火牆,入侵檢測,漏洞管理,許可權控制等。除了對安全使用者的技能的掌握外,還需要更深入的瞭解白帽子們的安全防護細節和原理。通常能防的人也能攻,不知道別人怎麼攻就在防基本是瞎防。攻防是互動進步的。
   核心裡有很多針對安全開發的特性提供:核心加密介面和祕鑰環、ASLR(程序啟動棧隨機化)、LSM機制。做安全開發對系統本身的特性利用不大,對攻防手法的理解要求比較大。另外,防禦系統一般是在業務的前面,所以要求低延時和高吞吐。所以基本上只能使用C/C++(如果你見到哪個防火牆用python寫的,麻煩給我膜拜一下)。
   所以安全開發的核心是業務和高效程式設計的能力。而高效程式設計例如對dpdk、sse指令集的使用就是一個專門的學科了。業務就是安全相關的知識點。

應用後臺開發者

   大部分應用的後臺就有兩個要求:開發快,問題少。所以現在的市面上你會見到大把的時候golang、python甚至java做後臺開發的案例。這種形式的後臺開發基本與作業系統無關,懂得基本的linux系統使用即可。人們可以專注的面向業務。

核心開發者

   核心開發者的難度應該是最難的,如果誰提交了一個patch被核心接受了,那是很了不起的事情。因為核心本身進展就非常大,並且核心開發沒有市場上的職業對應,基本全靠偶然接觸或者興趣。職業最多的是驅動開發和核心裁剪小修改,另外檔案系統開發和網路開發對核心也涉及到一些核心開發。由於核心的龐雜和耦合性比較重,學習本身就很難了,更別說開發。但是如果你已經可以開發了,那很多牛逼的開發就可以如探囊取物了,就像寫一個C++程式那麼順手。

驅動開發者

   驅動開發對uevent、kobject系統的瞭解需求比較多,明白udev程式和dev目錄的工作原理,裝置號的管理,基本的記憶體申請和使用。進階的可以瞭解核心socket程式設計,程序的控制等。核心驅動的程式設計最主要的還是業務,要知道你控制的裝置的暫存器和對應的匯流排在核心中的邏輯。例如所有磁碟都是使用scsi命令,都要經過scsi層,usb,pci等匯流排的運作和核心介面的使用。

檔案系統開發者

   由於一切皆檔案的思想,所以檔案系統在linux中特別重要。你得可以建立虛擬的裝置,得學會利用dev下的裝置,重要的,你得學會使用fd。這個fd就是簡單的C裡面open一個檔案之後生成的那個,但是也是socket()之後生成的那個,由於是系統資源,所以fd是跨程序的,你只要知道fd的號碼,就可以在其他程序中直接使用,比如0,1,2(實際不是這個號碼)號的fd就是輸入輸出和錯誤。所以通過shell其實可以做好多事情(O(∩_∩)O)
   核心層次的檔案系統開發,必須得了解檔案使用的整個流程,一切皆檔案只是最上面的vfs層,往下還有通用塊層(在這裡要進行重要的電梯演算法),還要scsi層,要把對邏輯檔案的訪問變為對物理儲存訪問的命令,還要pci層,還要usb層。邏輯成真總要經過物理。所以物理協議實現的瞭解也是必須的。
   核心中提供了很多預設的檔案系統操作,很多實現的檔案系統都直接使用的預設的實現。有一類重要的檔案系統是fuse,在使用者端實現的,像個程式一樣。這是核心為版權保護做的折中。核心現在越來越多的傾向於把功能讓給使用者空間,大核心的思想在收縮。因為開源的力量在一個點上確實不如商業高效。
   檔案系統一般可以以模組的方式提供,可以很簡單也可以很複雜。所以檔案系統開發對核心的瞭解與其他差別不大,但是對檔案系統本身有比較高的知識儲備要求。例如完整性校驗,extends大塊,磁碟配額,磁碟訪問控制acl,熱插播,B+樹等。

網路開發者

   Linux核心本身的網路協議棧比較低效,但是可以應付絕大多數的使用情況。使用核心原生的協議棧時,一般是使用netfilter的hook,用核心的模組做一些事情,對核心程式碼本身的修改是不建議的。具體做安全還是包變換,有很多netfilter的iptable本身就可以做,bpf更是提供了可程式設計的規則。所以核心層面的網路開發核心是netfilter。
   對於有高效能要求的,一般有新浪的fastsocket和intel的dpdk這兩種協議棧可以供選擇。fastsocket目前還不支援長連線,但是nginx這種短連線應用會收益良多。dpdk沒有socket的概念,純粹的包處理,而且是在使用者空間,完美的支援多CPU和numa系統。所以你可以看到阿里,騰訊,谷歌,百度等都是用dpdk來做的網路。