極客時間| 計組學習筆記

先整體: VonNeumannArchitecture 馮·諾依曼體系結構, 也叫 普林斯頓架構, 存儲程序計算機=運算器+控制器+存儲器+輸入+輸出

萬丈高樓平地起:

  • binary 二進制
  • 電工&電路

開始打怪升級:

  • CPU
  • 存儲與IO(見下篇)

寫在最後:

  • 計組知識地圖
  • 關於學習的碎碎念

寫在前面

準備好接收知識的壓縮餅乾🍪了嗎? blog從自己積累的知識庫中進行提煉, 如果遇到不理解的地方, 大概率是不理解相關概念, 多使用維基百科/百度百科進行搜索, 尤其是 引用 的格式, 基本上都已經在維基百科/百度百科搜索確認過

bin 二進制 二進制可執行文件

計算機只有二進制! 計算機只有二進制! 計算機只有二進制!

編碼

  • 二進制: 8進制.oct 16進制.hex

  • 二進制 > 十進制, 涉及到的概念: 原碼.反碼.補碼; signed/unsigned int/uint

    • uint8=byte=ASCII: chr/ord 'a'^' '='A' 特殊字符(\n \r)
  • 二進制 > float.浮點數: 浮點數轉換

  • 十進制 > string.字符串: charset.字符集.encoding.字符編碼.亂碼

    • unicode: utf8=, 1-4byte 變長, 第一個字節爲 1110xxxx 10xxxxxx 10xxxxxx 0xxxxxxx, 常見utf8顯示 \xhh\xhh
    • big5.臺灣 GB2312.中國
  • 字符串 + 格式 > json xml yaml toml ...

  • 浮點數中的特殊值定義

e f s float
0 0 0/1 0
0 !=0 0/1 0.f
255 0 0 INI_MAX
255 0 1 INI_MIN
255 !=0 0/1 NAN

運算

  • 位運算: 與&|~ 異或^ << >>移位
  • 位運算基礎上實現加減乘除等數學運算: LeetCode上有相關的題目

附贈相關的 LeetCode 原題:

電工 電路

電工/電路需要了解的基礎知識: 從簡單門電路(與 或 非 異或)開始, 不斷組合成更復雜的電路:

  • 門電路>半加器>全加器>加法器>ALU 超前進位加法器
  • 乘法器 並行加速.單敗淘汰 電路並行.門延遲.gateDelay
  • 寄存器=能夠進行狀態讀寫的電路元件=latch.鎖存器+D觸發器
  • 自動電路.固定週期 > PC 程序計數器
  • 譯碼電路.內存地址獲取數據/指令
  • 摩斯碼電報機: relay.繼電器 反向器

電路2大分類:

  • 組合邏輯電路.加法器=固定輸入固定輸出
  • 時序邏輯電路.時鐘信號

最後:

  • VLSI.超大規模集成電路

CPU

兩大核心功能: 處理單元+控制單元

  • processUnit.處理器單元=ALU.算術邏輯單元+processorRegister.處理器寄存器=算術和邏輯運算=datapath.數據通路/運算器
  • CU.控制器單元=instructionRegister.指令寄存器+PC.程序計數器=控制程序流程=分支+跳轉

2個核心指標: 性能+功耗

  • 性能=提速+擴大帶寬
    • 性能優化: 加大大概率事件 通過預測提高性能
    • responseTime.響應時間/executionTime.執行時間 NewRelic.性能測試工具 SPEC wallClockTime.ElapseTime.time seq 1000000 | wc -l real/user/sys 指令數xCPIxCycle
      • cycle: 摩爾定律 clockCycle.時鐘週期2GHz=晶振
      • CPI: pipeline.流水線
      • 指令數: 編譯器優化
    • throughput.吞吐率/bandwidth.帶寬
      • 並行優化 並行存儲的性能分析 Amdahl's law S=\dfrac{1}{1-a+a/n}
  • 功耗~=0.5x負載電容x電壓的平方x開關頻率x晶體管數量

指令: 處理單元和控制單元之上的抽象

  • instruction.指令=機器語言/機器碼
  • IS.指令集=指令格式+尋址方式
// gcc -g -c test.c // -O 編譯器自動優化
// objdump -d -M intel -S test.o
#include <time.h>
#include <stdlib.h>
int main()
{
  srand(time(NULL));
  int r = rand() % 2;
  int a = 10;
  if (r == 0)
  {
    a = 1;
  } else {
    a = 2;
  }
}
  • MIPS: R.算法/邏輯 I.數據傳輸/條件分支 J.跳轉(if/else for/while=goto)
  • call.函數調用
    • 實現: push+pop=stack.棧
    • StackOverflow
    • InfiniteMirrorEffect=a調用b+b調用a
    • stackFrame.棧幀 stackPoint.棧指針
    • inline.函數內聯: 將函數調用優化爲非函數調用方式, 大大減少需要執行的指令數
// gcc -g -c test.c // -O 編譯器自動優化
// objdump -d -M intel -S test.o
#include <time.h>
#include <stdlib.h>
int main()
{
  int u = add(1,2); 
}
// add_lib.c
int add(int a, int b){ return a+b;}
  • linux.ELF.execuatableAndLinkableFileFormat symbolsTable.符號表(.text=code .data .rel.text=relocation .symtab) win.PE.portableExe
  • dynamicLink.動態鏈接 linux.so.sharedObject win.dll.dynamicLinkLib PLT.procedureLinkTable.程序鏈接表 GOT.globalOffsetTable.全局偏移表

計組知識地圖

關於學習

  • Done is better than perfect. 完美比完成更重要. -- Facebook
  • 怕什麼真理無窮, 進一寸有進一寸的歡喜 -- 胡適
  • 我們未來生活的可能性就是靠這點點滴滴串聯起來的 -- 喬布斯
  • 對愛的渴望, 對知識的追求, 對人類苦難不可遏制的同情, 是支配我一生的單純而強烈的三種情感 -- 羅素
  • 新的知識第一遍沒有100%懂, 而隨着時間的推移, 慢慢領悟成長了, 這纔是人生常態.
  • 長期積累, 慢慢參悟, 螺旋上升
  • 持續學習, 最有效的辦法: 不是短時間衝刺, 而是有節奏的堅持
  • 知也無涯, 享受發現的樂趣
  • 學與不學, 知識就在那裏, 不如就先學好了. -- 年輕的時候不知道賺錢要幹什麼用, 還是要多多少少賺點, 等到知道要幹什麼用的時候, 至少不缺
  • 6個最實用, 督促自己學習的方法: 好奇心 知識面+興趣點+反覆迭代 帶着問題學習 教別人 每月投資200-300在專業學習上 堅持到底就是勝利✌🏻
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章