[toc]
- Posted by 微博@Yangsc_o
- 原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
摘要
昨天晚上莫名其妙的頭腦風暴,凌晨4點多才睡著,腦子一直充斥這些語言:c、c++、java、python、js、php,線程、進程、網絡IO、性能等等;
重新探究事物的原理能幫助各種實踐遇到的各種疑問,這大概就理論指導實踐;
今天就來簡單聊一聊,后續再寫博客展開詳細敘述。
語言分類
- 匯編:MASM
- 編譯:c、c++、oc
- 混合語言(半編譯&半解釋):java、C#
- 解釋語言:python、ruby、perl
- 腳本語言:js、php、asp
- 靜態語言:c、c++
- 半動態語言:java
- 動態語言:python、js、php、c#
- CPU運行模式:
- ring0:內核態(內核函數)
- ring1:
- ring2:
- ring3:用戶態(非內核函數)
ring0是指CPU的運行級別,ring0是最高級別,ring1次之,ring2更次之……
也就是,如果一個語言想要提供性能
- 向上優化:通過編譯器,編譯為靜態;
- 向上選擇:有利于編譯器向上優化;有利于靜態化、盡量多的運行在內核態;eg:java的JIT編譯器會將運行頻率很高的字節碼直接編譯為機器指令執行以提高性能;
多進程和多線程
為了提高程序的性能,我們一般都會采用多進程或者多線程的技術,有必要對比一下進程和線程;
- 系統資源:進程>線程
- 穩定性:進程>線程
- 數據同步:線程(線程切換)>進程(進程通信)
- 調用難度:進程>線程
通信機制
- 信號(Signal):信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生;
- 管道(pipe):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系(父子進程)的進程間使用
- 命名管道(FIFO):有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
- 消息隊列(Message Queue):消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。
- 共享內存(Shared Memory):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。如信號量,配合使用,來實現進程間的同步和通信。
- 信號量(Semaphore):信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
- 套接字(socket,基于IP):套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同主機間的進程通信。
- unix域套接字(socket,不基于IP):只需要在一臺機器上的兩個不同進程間通信,還要用到IP地址就有點大材小用了。
鎖和原子性
- 互斥鎖(Mutex):見名知意;
- 讀寫鎖(wrlock):讀不加鎖,寫加鎖;
- 自選鎖(spinlock):while(ture),原地打轉;
- 原子操作:最小運行單元;操作容器(atomic)
說到這個地方免不了提一下 volatile:c++、java都有這個關鍵字;
- 知識點1: 內存屏障,c++中volatile修飾變量可以防止編譯優化;java中叫做指令重排,都是一個意思;
- 知識點2: 線程可見:就是聲明為隨時可能發生變化,易變聲明;使用 volatile 聲明的變量的值的時候,系統總是重新從它所在的內存讀取數據,即使它前面的指令剛剛從該處讀取過數據;
- 可重入鎖(ReentrantLock):應用級別的鎖
資源
寄存器、堆、棧、全局區、常量區
性能:寄存器>棧>堆
- 寄存器:CPU操作;
- 棧:內存
- 堆:內存(用戶分配)
空間換時間
- 內存緩存:內部、外部緩存;
LRU(least recently used): 如果一個數據在最近一段時間沒有被訪問到,那么在將來它被訪問的可能性也很小。也就是說,當限定的空間已存滿數據時,應當把最久沒有被訪問到的數據淘汰。
LFU(Least Frequently Used):最近最少使用算法。它是基于“如果一個數據在最近一段時間內使用次數很少,那么在將來一段時間內被使用的可能性也很小”的思路。LFU有更精確的統計;
FIFO: 在FIFO Cache設計中,核心原則就是:如果一個數據最先進入緩存中,則應該最早淘汰掉。也就是說,當緩存滿的時候,應當把最先進入緩存的數據給淘汰掉。在FIFO Cache中應該支持以下操作;
- 運算(操作)靜態化:查表、映射;
- 中間結果緩存或者預處理
池化技術
- 內存池
靜態、動態(非固定長度)
- 線程池
靜態、動態(多用于無狀態的web服務)
- 連接池
數據庫、redis等連接池
數據結構
- 數組和連續內存
高效:索引、size、遍歷、復制
低效:插入、擴容、查找
- 鏈表和雙線鏈表
高效:端插入、遍歷、擴容
低效:size、查找
- 紅黑樹(java treeMap)
高效:排序、找上線最近元素、查找、遍歷、擴容
低效:插入、刪除
- size效率和實現有關系
- 哈希
高效:海量數據插入、刪除、查找
低效:排序、size
- 堆:大頂堆、小頂堆
高效:取最大N個元素
性能分級
- 輕CPU(邏輯運算) > 重CPU(查找運算) > 內存交換(copy) > IO(文件、DB、網絡IO:TCP/UDP)
- 由于IO操作實在性能低效率:于是有了IO多路復用技術;