手機上的性能指標是綜合的變化,由上圖可以看的出來手機更關(guān)注人跟機器的交互這,云系統(tǒng)則是比較關(guān)注機器跟機器的交互。手機系統(tǒng)比較特別的地方在于資源都是比較受限,例如 : 電量,性能…因此針對用戶體驗是需要特別庖丁解牛來建立指標。
我們在很多書籍上、博客上都學過或者聽說過系統(tǒng)調(diào)用與API這兩個概念,那么這兩個概念究竟是什么意思,它們之間是什么關(guān)系呢?如果我們閱讀過《操作系統(tǒng)導論》,就會明白操作系統(tǒng)的目的與作用,就會知道內(nèi)核是要向進程提供服務(wù)的,那么內(nèi)核是如何向進程提供服務(wù)的呢?下面我們就來一探究竟。
史勝輝,在MTK工作了11年,一直在基帶芯片的USB驅(qū)動領(lǐng)域做開發(fā)和驗證。從最開始做USB2.0/3.0 IP驗證和驅(qū)動開發(fā)到后面帶領(lǐng)團隊做上層協(xié)議驅(qū)動開發(fā),以及跟硬件設(shè)計部門合作開發(fā)全新的USB硬件加速器。
我們在工作中會經(jīng)常遇到線程同步,那么到底什么是線程同步呢,線程同步的本質(zhì)是什么,線程同步的方法又有哪些,為什么會有這些方法呢?在回答這些問題之前,我們先做幾個名詞解釋,以便建立共同的概念基礎(chǔ)。
進程是程序的執(zhí)行過程。程序是靜態(tài)的,是存在于外存之中的,電腦關(guān)機后依然存在。進程是動態(tài)的,是存在于內(nèi)存之中的,是程序的執(zhí)行過程,電腦關(guān)機后就不存在進程了。進程的內(nèi)容來源于程序,進程的啟動過程就是把程序從外存加載到內(nèi)存的過程。程序文件是有格式的,UNIX-Like操作系統(tǒng)的通用程序文件格式是ELF。程序文件是從源碼文件編譯過來的,源碼文件很多是用C或者C++書寫的。
圖形系統(tǒng)是計算機中最重要的子系統(tǒng)之一。我們平時使用的電腦、手機都是圖形界面的。對于普通人來說,沒有圖形界面的計算機幾乎是沒法用的,今天我們就來講一講圖形系統(tǒng)背后的原理。
我是從ARM7TDMI開始接觸ARM架構(gòu)的,當時很幸運有DSP的學習基礎(chǔ),同時遇到了把ARM架構(gòu)和操作系統(tǒng)結(jié)合講解的書籍。這樣,結(jié)合自己不斷的實踐,一直可以跟上ARM架構(gòu)的演進。長期的跟蹤也讓我容易能看到ARM的趨勢,我從Linaro在做ARM NEON指令集優(yōu)化關(guān)注到Linaro,后面持續(xù)的關(guān)注以Linaro為首ARM生態(tài)組織的發(fā)展,幾年后的2017年,我作為演講人分享了ARM架構(gòu)下的一個TLB性能優(yōu)化方案,實現(xiàn)了從關(guān)注到深度參與到過程。
計算機運行在物理世界中,物理世界中的一切活動都需要消耗能量。能量的形式有很多種,如熱能、核能、化學能等。計算機消耗的是電能,其來源是電池或者外電源。計算機內(nèi)部有一個部件叫做電源管理芯片(PMIC),它接收外部的電能,然后轉(zhuǎn)化為不同電壓的電流,向系統(tǒng)的各個硬件供電。什么硬件需要多少伏的電壓,都是由相應(yīng)的電氣標準規(guī)定好了的,各個硬件廠商按照標準生成硬件就可以了。上電的過程是由硬件自動完成的,不需要軟件的參與。因為硬件不上電的話,軟件也沒法運行啊。但是當硬件運行起來之后,軟件就可以對硬件的電源狀態(tài)進行管理了。電源管理的內(nèi)容包括電源狀態(tài)管理和省電管理。電源狀態(tài)管理是對整個系統(tǒng)的供電狀態(tài)進行管理,內(nèi)容包括睡眠、休眠、關(guān)機、重啟等操作。省電管理是因為電能不是免費的,我們應(yīng)該盡量地節(jié)省能源,尤其是對于一些手持設(shè)備來說,電能雖然并不昂貴但是卻非常珍貴,因為電池的容量非常有限。不過省電管理也不能一味地省電,還要考慮性能問題,在性能與功耗之間達到平衡。
在我仔細研究Linux內(nèi)核中的ftrace之后,發(fā)現(xiàn)ftrace中的各個tracers的作用一直被人們嚴重低估了, 比如我們會花了大量的時間去理解Linux內(nèi)核中的一塊代碼,然后猜測可能的執(zhí)行流, 但是ftrace會首先直接告訴你整個執(zhí)行流,然后你再去查看代碼,這樣無論從效率和準確度來講都是極大的提升。
雖然經(jīng)常更新內(nèi)核版本通常被認為是一種安全最佳實踐,但由于各種原因,尤其是生產(chǎn)環(huán)境中的服務(wù)器無法這樣操作。這就意味著在機器運行時,會存在利用已知的漏洞(當然,還會有一些未知的漏洞)來進行攻擊的情況,所以需要某種方法來檢測和阻止對這些漏洞的利用,這正是Linux Kernel Runtime Guard(Linux內(nèi)核運行時保護LKRG)誕生目的所在。
從文章Linux Kernel運行時安全檢測之LKRG-原理篇可以看到,LKRG可以對正在運行的Linux內(nèi)核進行檢測,并希望能夠及時響應(yīng)對正在運行的進程用戶id等憑證未經(jīng)授權(quán)的修改(完整性檢查)。對于進程憑據(jù),LKRG嘗試檢測漏洞,并在內(nèi)核根據(jù)未經(jīng)授權(quán)的憑據(jù)授予訪問權(quán)限(例如打開文件)之前采取行動。并且是以可加載的內(nèi)核模塊的形式,檢測正在運行的內(nèi)核是否存在更改情況,以表明正在對其使用某種類型的漏洞利用。除此之外,它還可以檢查系統(tǒng)上運行的進程,以查找對各種憑證的未經(jīng)授權(quán)修改,以防止這些更改授予額外的訪問權(quán)限。
邢孟棒,曾供職于阿里、網(wǎng)易,目前在騰訊云專職做性能優(yōu)化方向。Linux 業(yè)余愛好者,偏好鉆研各類工具源碼與底層技術(shù)原理。在日常的性能工程實踐中,比較注重方法論的探索、優(yōu)化案例的沉淀。熱衷于 eBPF 技術(shù),擅長傳統(tǒng)工具與 BPF 工具的結(jié)合應(yīng)用。
大家都聽說過紅黑樹,也都知道紅黑樹很厲害,是計算機里面評價非常高的數(shù)據(jù)結(jié)構(gòu)。但是每當想學習紅黑樹的時候,卻總是找不到通俗易懂很好理解的學習資料。很多書上上來就是紅黑樹的定義,然后就是紅黑樹的實現(xiàn),直接就把人給整暈了。光看紅黑樹的定義就有5條,為什么要有5條定義,為什么要這么定義,這么定義是什么意思,光定義都讓人懵了,更別說實現(xiàn)了。我看最近抖音上有很多人在講底層邏輯,只要你掌握了底層邏輯,其它的問題都不在話下,今天我們也來講一講紅黑樹的底層邏輯。在講之前我們先介紹一下紅黑樹的誕生,紅黑樹是Rudolf Bayer在1972年首先提出來的,不過當時并不叫紅黑樹,而是叫對稱二叉 B 樹(symmetric binary B-trees)。后來在1978年Leo J. Guibas 和 Robert Sedgewick 對此數(shù)據(jù)結(jié)構(gòu)進行了修改和完善,并重新命名為紅黑樹。為什么叫紅黑樹呢?有兩種說法,因為紅黑樹中要對節(jié)點連接做兩種顏色的區(qū)分,一說是因為當時的書寫筆只有紅色和黑色兩種顏色,另一說是當時的打印機只有紅和黑兩種顏色。
我們先來說一說什么是排序、為什么要排序。什么是排序,這個很簡單,就是把無序的東西按照一定的規(guī)則順序排列成升序或者降序。為什么要排序,有兩個原因,一是為了方便后面的查找,如果沒有排序的話只能進行線性查找,時間復(fù)雜度是O(n),如果排序了就可以進行二分查找,時間復(fù)雜度是O(logn),復(fù)雜度一下子就大大降低了。我們來說明一下這兩種復(fù)雜度的差別有多么懸殊(雖然用詞錯誤,但是這么用確實很符合氣氛),假設(shè)n是10億的話,O(n)還是10億,而O(logn)是30多(以2為底,假設(shè)系數(shù)是1),30多和10億比都可以忽略不計了。二是為了顯示的時候按照順序顯示,人類的習慣就是喜歡看有序的東西。
在我仔細研究Linux內(nèi)核中的ftrace之后,發(fā)現(xiàn)ftrace中的各個tracers的作用一直被人們嚴重低估了, 比如我們會花了大量的時間去理解Linux內(nèi)核中的一塊代碼,然后猜測可能的執(zhí)行流, 但是ftrace會首先直接告訴你整個執(zhí)行流,然后你再去查看代碼,這樣無論從效率和準確度來講都是極大的提升。