高階語言實現的幾個點

小宇渣渣渣發表於2019-04-13

這兩天收集了一些基礎知識, 記錄下

記憶體管理

通常使用 記憶體對齊方式 (8 位元組、16 位元組、32 位元組),

有的值可能只佔用兩個位元組,但是為什麼還要一次性分配8位元組呢.

原因是為了記憶體的可複用性, 產生更少的記憶體碎片.

new(9) 大於8, 將會使用16位元組記憶體。

但是仔細想想, 8位元組 16位元組等等過於零散,可以再對記憶體進行歸類組織, 就使用到了 頁 的概念。

垃圾回收

引用計數

每個物件擁有一個ref屬性,標記引用的次數。

缺點

有可能造成迴圈引用,記憶體無法釋放

增一減一 各種環境下要求準確記錄, 如果出現不正確計數, 將會引發嚴重問題

優點

速度快

補償措施

單獨gc演算法定期掃描引用連結串列,進行釋放

標記清理

最典型為三色標記法(golang)

代齡

根據物件的生命週期, 標記為 0 1 2 三級代領, 具體參考 java、C#

程式、執行緒、協程

程式

作業系統分配儲存資源的最小單元

執行緒

程式執行時的最小單位,它是程式的一個執行流,是CPU排程和分派的基本單位(所以一個程式最少一個執行緒)

協程

在使用者空間實現多工的排程而多工排程是發生在一個執行緒上的,我們把這種機制稱之為協程, 因為在一個執行緒上,協程的本質是序列的。

上下文切換

cpu程式的切換最消耗效能了, 因為整個程式都得儲存現場或者恢復現場

執行緒的切換因為同程式內共享地址空間, 切換相比程式開銷要小得多

gdb

軟體崩潰後會產生core檔案, 預設linux沒有開啟

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 32768
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1418
virtual memory          (kbytes, -v) unlimited
 
複製程式碼

開啟命令:

ulimit -c unlimited  #unlimited表示不限制大小
複製程式碼

如果想要永久生效,可以“ulimit -c unlimited”這一行加到 /etc/profile 檔案中去,放到這個檔案最後一行即可。

相關文章