1.早期的計(jì)算
1).本系列會(huì)了解到位(bit)、字節(jié)(byte)迟隅、晶體管(transistors)與邏輯門(logic gates)啼止,一直到操作系統(tǒng)(Operation Systems)锦聊、虛擬現(xiàn)實(shí)(Vitual Reality)與機(jī)器人(Robots)。
2).計(jì)算器歷程:
- 算盤: 早期手動(dòng)計(jì)算器享甸,可加減可存儲(chǔ)結(jié)果數(shù)據(jù)
- 機(jī)械計(jì)算器: 手動(dòng)轉(zhuǎn)動(dòng)截碴,齒輪咬合
- 電動(dòng)機(jī)械打卡機(jī): 此機(jī)器的速度是人工的10倍,使得美國(guó)人口普查統(tǒng)計(jì)得以更快完成蛉威,節(jié)省數(shù)百萬(wàn)美元(人們開始意識(shí)到計(jì)算機(jī)器巨大市場(chǎng)潛力)
2.電子運(yùn)算
1).繼電器(relays): 用電控制的機(jī)械開關(guān)日丹,缺點(diǎn)是開關(guān)速度慢,易磨損蚯嫌。小蟲子引發(fā)繼電器故障(bug一詞來(lái)源于此)哲虾。
2).真空管(vacuum tubes)或者電子管: 密閉燈泡里放2個(gè)電極丙躏,其中一電極可被加熱 發(fā)射電子(thermionic emission),另一電極吸引電子從而形成電流束凑,這是全球第一個(gè)真空管晒旅。通過(guò)加入控制電極控制真空管的開與閉。
真空管內(nèi)沒(méi)有活動(dòng)部件汪诉,速度更快废恋,磨損更小。
任何只允許電流單向流動(dòng)的電子部件都叫做二極管(diode)
扒寄。
3).晶體管(transistors): 1947年貝爾實(shí)驗(yàn)室John Bardeen等人發(fā)明了晶體管鱼鼓。它由兩電極由導(dǎo)電材料隔開,這些材料有時(shí)候?qū)щ娪袝r(shí)候不導(dǎo)電该编,即半導(dǎo)體(semiconductor)迄本,通過(guò)控制這些材料的電荷讓其導(dǎo)電或不導(dǎo)電。
晶體管是固態(tài)組件课竣,體積可以大幅縮小嘉赎,速度更快,磨損更小于樟。
上面提到的“導(dǎo)電材料”常見是用的硅來(lái)制造公条,所以有了硅谷
。
3.布爾邏輯與邏輯電路
早期有人使用三進(jìn)制隔披、五進(jìn)制等赃份,后來(lái)發(fā)現(xiàn)電源電壓不穩(wěn)導(dǎo)致不能正確表達(dá)寂拆,所以統(tǒng)一成了二進(jìn)制奢米。
開關(guān) 等于 二進(jìn)制(Binary)。
使用二進(jìn)制還有個(gè)原因是: 英國(guó)數(shù)學(xué)家George Boole的布爾代數(shù)(Boolean Algebra)解決了所有的運(yùn)算和法則纠永,基于布爾代數(shù)實(shí)現(xiàn)了邏輯電路NOT門
鬓长、AND門
、OR門
尝江、XOR門
涉波。
4.二進(jìn)制
這里討論的是計(jì)算機(jī)是怎么存儲(chǔ)和表示數(shù)字的。用二進(jìn)制實(shí)現(xiàn)常規(guī)代數(shù)的運(yùn)算炭序。
二進(jìn)制中的每個(gè)“0”或者“1”叫一個(gè)比特(bit)
或者位
啤覆。由于8-bit比較常見,所以稱為一個(gè)字節(jié)(byte)惭聂。千字節(jié)(kilobyte) = 2的10次方個(gè)字節(jié) = 1024個(gè)字節(jié)窗声,兆字節(jié)(megabyte),千兆字節(jié)(gigabyte)辜纲,TB(terabyte)笨觅。
32位(32-bit)二進(jìn)制最大可表示常規(guī)代數(shù)的”0 ~ 43億多“ 或者 ”+20億 ~ -20億“(第一個(gè)bit表示正負(fù))拦耐。為了表示更多數(shù)據(jù)所以有了64位系統(tǒng)。接著用科學(xué)計(jì)數(shù)法表示浮點(diǎn)數(shù)见剩,即正負(fù) + 存指數(shù) + 存有效數(shù)
杀糯。
接著通過(guò)對(duì)字母進(jìn)行編號(hào)來(lái)表示字母,1963年產(chǎn)生了基于7-bit的ASCII(American Standard Code for Information Interchange 美國(guó)信息交換標(biāo)準(zhǔn)代碼)
使得不同公司的計(jì)算機(jī)可以交換數(shù)據(jù)苍苞。由于ASCII針對(duì)英文字母設(shè)計(jì)的固翰,其他自然語(yǔ)言如中文、土耳其文擁有的數(shù)千個(gè)字符甚至無(wú)法用1 字節(jié)(8-bit)表示柒啤,1992年有了16-bit的Unicode倦挂,統(tǒng)一編碼方案。
計(jì)算機(jī)必須在內(nèi)存中定位到某個(gè)位置担巩,叫做地址(address)
方援,用以存取數(shù)據(jù)。
5.算術(shù)邏輯單元ALU(Arithmetic Logic Unit)
ALU
= 算術(shù)計(jì)算(如半加器涛癌、全加器) + 邏輯控制(如OR門和AND門組成的全0檢測(cè)犯戏,通過(guò)檢測(cè)讓Flags位被標(biāo)記)
半加器(Half Adder)
全加器(Full Adder)
8-bit全加器;現(xiàn)代電腦用了更厲害的電路叫“超前進(jìn)位加法器(carry-look-ahead adder)”拳话。
全0檢測(cè)
操作碼會(huì)告訴ALU執(zhí)行什么操作
6.寄存器&內(nèi)存
ALU算出來(lái)的結(jié)果得找個(gè)地方存起來(lái)先匪,所以就有了計(jì)算機(jī)內(nèi)存(Memory)。
RAM(Random Access Memory弃衍,隨機(jī)存取存儲(chǔ)器)只有通電時(shí)才能存呀非;另一種是持久存儲(chǔ),斷電也能保留數(shù)據(jù)镜盯。
-
記錄0和1的電路
-
鎖存器(And-Or Latch)岸裙,存住1-bit數(shù)據(jù)的理論電路
-
門鎖(Gated Latch)電路 ,一個(gè)能存單個(gè)bit的盒子速缆,完整電路
-
寄存器(register)降允,并排放8個(gè)門鎖,就構(gòu)成了8位寄存器艺糜,存多少個(gè)bit叫“位寬(width)”剧董。當(dāng)今計(jì)算機(jī)都有64位寬的寄存器了。寄存器是指“能存一個(gè)值的小內(nèi)存塊”破停。
-
多路復(fù)用器(multiplexer)翅楼,因?yàn)椴⑴艜?huì)很耗材、占地方真慢、消耗更多錢財(cái)?shù)纫汶谑怯辛司仃嚪胖?、內(nèi)存地址(Memory Address)的概念 晤碘,如:12行8列(8位尋址 = 4bit行 + 4bit列)存了1bit的數(shù)據(jù)褂微。 抽象一下功蜓,然后做一個(gè)256個(gè)字節(jié)的內(nèi)存,然后進(jìn)一步抽象成可尋址內(nèi)存宠蚂。
- 內(nèi)存的一個(gè)重要特性就是可以隨時(shí)訪問(wèn)任何位置式撼,所以叫
RAM
。 - 上面說(shuō)的制成的是
SRAM(Static Random-Access Memory求厕,靜態(tài)隨機(jī)存取存儲(chǔ)器)
著隆,還有其他類型的RAM,如DRAM呀癣、閃存(Flash Memory)美浦、NVRAM,不同之處在于用不同的電路存單個(gè)bit项栏。
7.CPU & 時(shí)鐘頻率
計(jì)算機(jī)之所以能做事兒是因?yàn)橛?code>指令(instruction)去指示計(jì)算機(jī)干活兒浦辨。如果是計(jì)算指令,CPU會(huì)跟ALU通信進(jìn)行計(jì)算加減沼沈,如果是內(nèi)存指令流酬,CPU會(huì)跟內(nèi)存通信進(jìn)行讀寫。
CPU運(yùn)行示例之”加載數(shù)據(jù)A“:
1).取指令(fetch phase)
2).解碼指令(decode phase)
3).執(zhí)行指令(execute phase)
此例中8-bit RAM里前4-bit指定操作碼列另,后4-bit指定地址或寄存器芽腾。
不同指令由不同邏輯電路解碼,例如“7.1-CPU執(zhí)行「LOAD_A指令」.png”圖中所示的加載數(shù)據(jù)A的解碼電路页衙。把上面這些”控制單元“抽象出來(lái)摊滔。
當(dāng)執(zhí)行到”ADD“指令時(shí),就要用到ALU了店乐。
驅(qū)動(dòng)CPU執(zhí)行下一條指令的組件叫
clock(時(shí)鐘)
,以精確和固定的間隔觸發(fā)電信號(hào)响巢,該信號(hào)被控制單元用于推進(jìn)CPU內(nèi)部操作描滔,就像劃龍舟上的鼓手棒妨。CPU循環(huán)(取指令 → 解碼 → 執(zhí)行)的速度踪古,叫
時(shí)鐘速度(clock speed,單位是Hertz赫茲券腔,1赫茲表示每秒1個(gè)周期)
或者 時(shí)鐘頻率
伏穆。超頻就是修改時(shí)鐘以加快CPU的速度,但過(guò)度超頻會(huì)讓CPU過(guò)熱或者出現(xiàn)信號(hào)跟不上時(shí)鐘頻率纷纫。而降頻就是跟超頻反著來(lái)枕扫。]
8.指令和程序
實(shí)現(xiàn)”11-5=1“更多的指令。
為了讓CPU干更多的事辱魁,處理更多指令:
方法一烟瞧、升級(jí)硬件(即修改指令長(zhǎng)度)诗鸭。如換上64位CPU。
方法二参滴、可變指令長(zhǎng)度(即將指令和數(shù)據(jù)拆開强岸,指令相鄰下一個(gè)存放數(shù)據(jù)值的內(nèi)存地址,這個(gè)地址叫”立即值“)砾赔。如 Intel 4004芯片 的指令集支持46個(gè)指令蝌箍,它就是用8-bit的”立即值“處理的。
9.高級(jí)CPU設(shè)計(jì)
電子計(jì)算 早期的提速是通過(guò)減小“晶體管轉(zhuǎn)換開關(guān)”的時(shí)間暴心,現(xiàn)在則是越來(lái)越多地為特定計(jì)算設(shè)計(jì)特定的指令電路妓盲。例如早期的除法指令是由循環(huán)多次減法指令實(shí)現(xiàn)的,乘法是由循環(huán)多次加法實(shí)現(xiàn)的专普,現(xiàn)在為除法單獨(dú)設(shè)計(jì)了電路和ALU結(jié)構(gòu)∶醭模現(xiàn)代電腦處理器有專門的電路處理圖形操作、解碼視頻檀夹、文檔加密等甚亭。所以有了各種對(duì)特定領(lǐng)域的處理器,如GPU击胜。
至今亏狰,高速而厲害的指令引起了另一個(gè)問(wèn)題:數(shù)據(jù)的高速讀寫(RAM)。數(shù)據(jù)是通過(guò)總線
傳輸?shù)摹?br>
RAM需要時(shí)間查找地址偶摔、取得數(shù)據(jù)暇唾,另外一個(gè)指令可能需要多個(gè)時(shí)鐘周期 而在此期間CPU是閑著的。所以后面在CPU中加入小的RAM辰斋,叫高速緩存(Cache)策州,讀取數(shù)據(jù)時(shí)不再是單個(gè)傳值,而是一批數(shù)據(jù)宫仗,更快提供數(shù)據(jù)(cacha hit够挂、cache miss),而且可以存儲(chǔ)復(fù)雜運(yùn)算的中間值等等藕夫,用以提高CPU的處理速度孽糖。通過(guò)臟位(dirty bit,頁(yè)面重寫標(biāo)志位)
標(biāo)識(shí)毅贮,在RAM和Cache同步時(shí)办悟,RAM中的舊數(shù)據(jù)得以被更新。
另一個(gè)提升CPU性能的方法:指令流水線(instruction pipelining)滩褥。
多核CPU病蛉,不同于多個(gè)CPU,前者會(huì)共享同樣的資源,如緩存铺然。
當(dāng)多核還不夠時(shí)俗孝,可以構(gòu)建擁有多個(gè)CPU的計(jì)算機(jī)。甚至是超級(jí)計(jì)算機(jī)魄健,用以計(jì)算航空航天驹针、模擬宇宙等等超級(jí)變態(tài)的計(jì)算。
10.編程史話
將機(jī)器程序化的需求在計(jì)算機(jī)發(fā)展前就已經(jīng)存在诀艰,畢竟不是美國(guó)人口普查匯總數(shù)據(jù)這么簡(jiǎn)單柬甥。
為了程序化控制,人們?cè)O(shè)計(jì)了控制插板其垄,通過(guò)電線傳遞信號(hào)苛蒲,執(zhí)行不同計(jì)算。
為了節(jié)省人力提高效率绿满,有了穿孔卡片臂外。穿孔卡片形成對(duì)織布機(jī)(何時(shí)更改織線顏色)或者計(jì)算機(jī)(一個(gè)孔對(duì)應(yīng)匯總值加1)的連續(xù)指令,40年代末隨著電子內(nèi)存的普及喇颁,將整個(gè)程序存儲(chǔ)在計(jì)算機(jī)內(nèi)存中成為可能漏健,使得程序易于修改、易于被CPU快速讀取橘霎。穿孔卡片不僅可以向計(jì)算機(jī)傳遞數(shù)據(jù)蔫浆,也可以通過(guò)給卡片打孔存儲(chǔ)數(shù)據(jù)。
程序和數(shù)據(jù)在一個(gè)共享的內(nèi)存中的結(jié)構(gòu)被成為馮洛伊曼結(jié)構(gòu)(Von Neumann Architecture)
姐叁,馮諾依曼計(jì)算機(jī)的特征瓦盛,有包含算術(shù)邏輯單元的處理器、數(shù)據(jù)寄存器外潜、指令寄存器原环、指令地址寄存器、存儲(chǔ)數(shù)據(jù)和指令的內(nèi)存处窥。
11.程序語(yǔ)言
計(jì)算機(jī)只能處理二進(jìn)制指令嘱吗,這些二進(jìn)制叫機(jī)器語(yǔ)言(machine language)
或機(jī)器碼(machine code)
。在計(jì)算機(jī)早期階段滔驾,人們必須用機(jī)器碼寫程序谒麦,具體操作是先用英語(yǔ)描述(偽代碼,pseudo-code
)寫在紙上嵌灰,然后通過(guò)操作碼表轉(zhuǎn)換為二進(jìn)制機(jī)器碼弄匕,最后導(dǎo)入計(jì)算機(jī)開始運(yùn)行颅悉。
1940~1950年代人們開發(fā)了更可讀更高層的語(yǔ)言沽瞭,他們給每個(gè)操作碼分配一個(gè)名字,稱為助記符(mnemonics)
剩瓶,如LOAD_A 14
驹溃,通過(guò)可重用的二進(jìn)制幫助程序(匯編器(assembler)
)城丧,自動(dòng)轉(zhuǎn)換成二進(jìn)制機(jī)器碼。LOAD_A 14
就是一條匯編指令豌鹤。匯編與機(jī)器指令往往是一一對(duì)應(yīng)的亡哄。
程序員可以創(chuàng)建內(nèi)存地址的抽象表示,叫變量(variables)
布疙。
A = 3
B = 5
C = A + B
# 這個(gè)例子在底層操作中蚊惯,編譯器可能把變量A存在寄存器A里,亦或是寄存器B里灵临,但這些底層邏輯我們不用關(guān)心了
為了遠(yuǎn)離每種CPU特有的匯編代碼和機(jī)器碼截型,從底層細(xì)節(jié)中脫離出來(lái),編程語(yǔ)言應(yīng)運(yùn)而生儒溉,一次編寫多種執(zhí)行宦焦。在1960年代,我們有了ALGOL顿涣、LISP波闹、BASIC等語(yǔ)言,70年代有了Pascal涛碑、C等精堕。80年代有了C++、Objective-C 和 Perl蒲障。90年代有了Python锄码、Ruby、Java晌涕。在新世紀(jì)里有了C#滋捶、Swift、Go余黎。
12.編程原理:語(yǔ)句和函數(shù)
語(yǔ)句表達(dá)獨(dú)立而完整的思想重窟。賦值語(yǔ)句、IF語(yǔ)句惧财、WHILE循環(huán)巡扇、FOR循環(huán)等。
代碼越來(lái)越復(fù)雜冗長(zhǎng)垮衷,為了隔開并隱藏繁瑣的東西厅翔,編程語(yǔ)言可以把一段代碼打包,放入函數(shù)(某些編程語(yǔ)言中也可以叫方法搀突、子程序)刀闷,變成使用函數(shù)模塊化地編程,也方便團(tuán)隊(duì)作戰(zhàn)。
現(xiàn)代編程語(yǔ)言有許多提前寫好的函數(shù)甸昏,叫庫(kù)(Libraries)顽分。它們由專業(yè)人員編寫,效率高施蜜,檢驗(yàn)充分卒蘸,可提供給每個(gè)人使用。
13.算法初步
解決一個(gè)計(jì)算問(wèn)題往往有多種不同的解決方案翻默,這些不同方案間的區(qū)別就是“算法”缸沃,算法就是完成計(jì)算的具體步驟。
各種算法中修械,被用到最多的就是“排序”(sorting)和泌。
算法的輸入大小 和 運(yùn)行步驟之間的關(guān)系,代表了算法的復(fù)雜度祠肥,表示算法運(yùn)行速度大致是個(gè)什么量級(jí)时捌。選擇排序(Selection Sort)復(fù)雜度為O(n^2)怀愧;歸并排序(Merge Sort)的是O(n log n) 暑诸;圖搜索(Graph search)里的Dijkstra算法了解一下惨缆。
14.數(shù)據(jù)結(jié)構(gòu)
樓上的算法處理的數(shù)據(jù)是如何存儲(chǔ)在計(jì)算機(jī)內(nèi)存中的呢?答案是數(shù)據(jù)結(jié)構(gòu)(Data Structures)
數(shù)據(jù)結(jié)構(gòu)包括:數(shù)組(Array)剂桥、字符串(String)忠烛、矩陣(Matrix)、結(jié)構(gòu)體(Struct)权逗、指針(Pointer)美尸、節(jié)點(diǎn)(Node)、鏈表(Linked List)斟薇、隊(duì)列(Queue)师坎、棧(Stack)、樹(Tree)堪滨、二叉樹(Binary Tree)胯陋、圖(Graph)。不同數(shù)據(jù)結(jié)構(gòu)適用于不同計(jì)算場(chǎng)景袱箱。
鏈表比數(shù)組更靈活遏乔,它不像數(shù)組大小固定,而是可動(dòng)態(tài)增減的发笔,且更容易重新排序盟萨、兩端縮減、分割等了讨,所以許多復(fù)雜數(shù)據(jù)結(jié)構(gòu)都基于鏈表捻激。如隊(duì)列和棧制轰。
Node稍微變一下,改成有2個(gè)指針铺罢,就變成了Tree艇挨。很多算法在用樹這種結(jié)構(gòu)残炮。樹的重要特性是從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑是單向的韭赘。如果數(shù)據(jù)隨意連接,那可以用Graph來(lái)表示了势就。
不同數(shù)據(jù)結(jié)構(gòu)適用于不同的計(jì)算場(chǎng)景泉瞻,選擇正確的數(shù)據(jù)結(jié)構(gòu)會(huì)讓工作更加簡(jiǎn)單。所以大多數(shù)編程語(yǔ)言都自帶了很多做好的數(shù)據(jù)結(jié)構(gòu)苞冯,如C++的“標(biāo)準(zhǔn)模板庫(kù)”袖牙,讓程序員專注更多其他的事情。
15.阿蘭.圖靈
圖靈機(jī)(Turing machine)是一臺(tái)理論計(jì)算模型舅锄,輸入+規(guī)則可以得到輸出鞭达。
16.軟件工程(Software Engineering)
把函數(shù)打包成層級(jí)分明的體系(hierarchies),將相關(guān)代碼合并為對(duì)象(objects)
皇忿。
由于不同的人或不同的團(tuán)隊(duì)寫的函數(shù)畴蹭,需要文檔(documentation)
幫助了解代碼和應(yīng)用程序接口(application programming interface,即API)
鳍烁。
模塊A對(duì)模塊B一無(wú)所知叨襟,讓B的一切暴露給A調(diào)用會(huì)出亂子,API可以控制哪些函數(shù)和數(shù)據(jù)可以讓外部訪問(wèn)幔荒,哪些僅供內(nèi)部使用糊闽。有選擇性的暴露一部分功能是 面向?qū)ο缶幊?Object Oriented Programming)
的本質(zhì)。用這種方式處理大型復(fù)雜項(xiàng)目非常有效爹梁。
現(xiàn)代軟件開發(fā)者會(huì)用特定的應(yīng)用來(lái)編程右犹,它集成了很多工具來(lái)編寫、編譯和測(cè)試代碼姚垃,這些應(yīng)用又叫集成開發(fā)環(huán)境(Integrated Development Environments傀履,即IDE)
。除了IDE莉炉,還有個(gè)牛逼的軟件可以幫助團(tuán)隊(duì)協(xié)作大項(xiàng)目钓账,那就是源代碼管理(Source Control),也叫版本控制(Revision Control)
絮宁。這些代碼被放置在服務(wù)器上叫代碼倉(cāng)庫(kù)梆暮。然后有了質(zhì)量保證測(cè)試(Quality Assurance testing),即QA
绍昂。
17.集成電路啦粹、摩爾定律
軟件日益精巧偿荷,從卡片打孔的機(jī)器語(yǔ)言到如今的集成環(huán)境中的面向?qū)ο缶幊陶Z(yǔ)言,這些進(jìn)步依賴于硬件的不斷改進(jìn)唠椭。
早期組成計(jì)算機(jī)的部件由很多不同的分立的元件組成跳纳,再將它們用線纜連接到一起。隨著計(jì)算機(jī)性能需求的提升贪嫂,需要用更多分立的元件(元件倒是從繼電器 → 電子管 → 晶體管寺庄,體積縮小,造價(jià)降低)制作出更強(qiáng)計(jì)算能力的計(jì)算機(jī)力崇。但是隨著線纜數(shù)量增多斗塘,復(fù)雜程度和成本也上去了。突破發(fā)生在1958年亮靴,改為將許多組件集成于一個(gè)單獨(dú)的電子部件內(nèi)馍盟,這就是集成電路(Integrated Circuits,IC)
茧吊,用以制作計(jì)算機(jī)部件贞岭。然后又有了印刷電路板(Printed circuit boards, PCB)
。然后又有了光刻法(Photolithography)
這種全新的制造工藝搓侄,即使用光將復(fù)雜的圖案轉(zhuǎn)移到材料(如半導(dǎo)體)上瞄桨。如今的光刻分辨率已達(dá)幾納米。
1965年休讳,Gordon Moore總結(jié)了:大約每過(guò)兩年讲婚,得益于材料和制造技術(shù)的發(fā)展,同樣大小的空間里可以布置的晶體管數(shù)量將翻倍俊柔。這就是摩爾定律(Moore's Law)
筹麸。人們用這個(gè)定律表達(dá)一種趨勢(shì)。
CPU不是唯一受益的元件雏婶,還有內(nèi)存顯卡固態(tài)硬盤等物赶。從19世紀(jì)70年代開始,用超大規(guī)模集成電路技術(shù)
來(lái)實(shí)現(xiàn)自動(dòng)生成芯片設(shè)計(jì)留晚。
為了突破摩爾定律酵紫,需要解決:①光波長(zhǎng)的問(wèn)題,波長(zhǎng)更短错维,投射的圖形越小奖地。②量子隧道貫穿問(wèn)題,晶體管越小赋焕,電極所在的地方可能只間隔數(shù)個(gè)原子参歹,電子可以越過(guò)這些間隔。
18.操作系統(tǒng)
卡片打孔時(shí)期隆判,人們手動(dòng)把程序放入讀卡器花的時(shí)間大于程序運(yùn)行時(shí)間犬庇,人們需要一種讓計(jì)算機(jī)自動(dòng)運(yùn)作的的方式僧界,于是操作系統(tǒng)(Operation System)
誕生了,管理并啟動(dòng)其他程序臭挽。
計(jì)算機(jī)變便宜捂襟,開始變多,有不同硬件配置欢峰,操作系統(tǒng)充當(dāng)軟件和硬件之間的媒介葬荷。操作系統(tǒng)提供API來(lái)抽象硬件,叫設(shè)備驅(qū)動(dòng)程序(device drivers)
赤赊,使程序可以用標(biāo)準(zhǔn)化輸入輸出硬件(I/O)
闯狱。
通過(guò)調(diào)度使得多個(gè)程序同時(shí)運(yùn)行煞赢,在單個(gè)CPU上共享時(shí)間抛计,操作系統(tǒng)的這種能力叫多任務(wù)處理(multitasking)
。
程序可能會(huì)分配到非連續(xù)的內(nèi)存塊照筑,為了隱藏這種復(fù)雜性吹截,操作系統(tǒng)會(huì)虛擬化內(nèi)存位置,程序就可以假定內(nèi)存總是從地址0開始并且是連續(xù)的凝危。操作系統(tǒng)和CPU會(huì)自動(dòng)處理虛擬內(nèi)存和物理內(nèi)存之間的映射波俄。
多任務(wù)時(shí),當(dāng)切換到另一個(gè)程序時(shí)蛾默,程序不能丟失數(shù)據(jù)懦铺,所以為每個(gè)程序分配專屬內(nèi)存塊。這樣一來(lái)如果程序出錯(cuò)支鸡,寫入錯(cuò)誤數(shù)據(jù)冬念,則只能影響到自己,這個(gè)功能叫內(nèi)存保護(hù)(Memory Protection)
牧挣。
1970年代急前,大學(xué)可以買電腦給學(xué)生用,計(jì)算機(jī)不僅能同時(shí)快速運(yùn)行多個(gè)程序瀑构,也能讓多個(gè)用戶同時(shí)訪問(wèn)裆针。就設(shè)計(jì)了多用戶的分時(shí)操作系統(tǒng)(time-sharing Operation System)
,通過(guò)終端(Terminal)
寺晌,終端只是一個(gè)鍵盤+屏幕 連接到主計(jì)算機(jī)世吨,讓多用戶可以同時(shí)訪問(wèn)計(jì)算機(jī)。早起最有影響力的分時(shí)操作系統(tǒng)是1969年發(fā)布的Multics(多任務(wù)信息與計(jì)算系統(tǒng))
呻征,該系統(tǒng)非常復(fù)雜耘婚,操作系統(tǒng)占用一半的內(nèi)存。
由于Multics過(guò)于復(fù)雜怕犁,貝爾實(shí)驗(yàn)室的Dennis和Ken Thompson聯(lián)手打造了新的操作系統(tǒng)边篮,叫Unix己莺,把系統(tǒng)分為內(nèi)核(即系統(tǒng)核心功能,如內(nèi)存管理戈轿、I/O) 和 工具集(程序和運(yùn)行庫(kù))凌受。簡(jiǎn)單化的Unix可以在更便宜和更多樣化的硬件上運(yùn)行。
1980年代早期思杯,電腦的成本降到個(gè)人可以負(fù)擔(dān)胜蛉,叫個(gè)人或家庭電腦(Personal or Home Computer,PC)
色乾。PC機(jī)比大學(xué)誊册、企業(yè)、政府的大型主機(jī)簡(jiǎn)單多了暖璧。1981年微軟為PC發(fā)布的MS-DOS(微軟磁盤操作系統(tǒng)案怯,Microsoft's Disk Operation System)
就是更簡(jiǎn)單的操作系統(tǒng),很受PC市場(chǎng)歡迎澎办,即便是缺少多任務(wù)和內(nèi)存保護(hù)這樣的功能嘲碱。
19.內(nèi)存&存儲(chǔ)介質(zhì)
紙卡、紙帶
延遲線存儲(chǔ)器
磁芯存儲(chǔ)器
磁帶
磁鼓存儲(chǔ)器
硬盤
內(nèi)存層次結(jié)構(gòu)
軟盤
CD/DVD局蚀,即光盤
固態(tài)硬盤SSD麦锯,沒(méi)有活動(dòng)部件,訪問(wèn)時(shí)間一般低于1/1000秒
存儲(chǔ)器(Storage)和內(nèi)存(Memory)不同琅绅,前者數(shù)據(jù)會(huì)一直存著扶欣,斷點(diǎn)不會(huì)丟失。
20.文件系統(tǒng)
文件就是按照一定的格式排列的一長(zhǎng)串二進(jìn)制千扶。元數(shù)據(jù)存儲(chǔ)在文件的開頭和實(shí)際數(shù)據(jù)之間料祠,也叫文件頭(Header)
。
.wave文件舉例:①麥克風(fēng)每秒上千次地采集聲音术陶;②每次采集到的振幅用一個(gè)數(shù)字表示,這些數(shù)字存儲(chǔ)在wave文件中煤痕;③播放這個(gè)文件時(shí)梧宫,音頻程序啟動(dòng)計(jì)算機(jī)揚(yáng)聲器發(fā)射波形。
位圖(bitmap)摆碉,.bmp文件:計(jì)算機(jī)上圖片由稱為像素(pixel)
的小方塊組成塘匣,每個(gè)像素是紅、綠巷帝、藍(lán)的組合忌卤。
存儲(chǔ)器(可能是磁帶、磁盤楞泼、硬盤等)沒(méi)有文件的概念驰徊,只能存儲(chǔ)大量的bit笤闯,為了存儲(chǔ)多個(gè)文件,有種特殊的文件用來(lái)記錄其他文件的位置大小等棍厂,稱為目錄文件(Directory file)
颗味。通常目錄文件存在存儲(chǔ)器的開頭位置。
現(xiàn)代文件系統(tǒng)將文件存在塊(Blocks浦马,統(tǒng)一塊級(jí)大小方便管理)
中,并將文件拆分為多個(gè)部分存儲(chǔ)在不同塊中张漂。
隨著存儲(chǔ)容量和文件數(shù)量的增長(zhǎng),所有文件都存在同一個(gè)層次(只有一個(gè)文件目錄)變得效率低下航攒,將相關(guān)文件夾放到同一個(gè)文件夾里磺陡,變成分層文件系統(tǒng)(Hierarchical File System)
。如root目錄下有music目錄屎债、photoes目錄:
21.文件壓縮技術(shù)
我們希望文件能盡量小一些仅政,可以存大量文件垢油,傳輸也更快一些盆驹。解決方法就是壓縮(Compression)
,用更少的bit編碼數(shù)據(jù)滩愁。
游程編碼(Run-length Encoding)
躯喇,「消除冗余」,利用文件中存在相同的值進(jìn)行壓縮硝枉,插入一個(gè)額外字節(jié)進(jìn)行長(zhǎng)度說(shuō)明廉丽,并刪除重復(fù)數(shù)據(jù)。妻味。注意:少數(shù)情況下(文件中沒(méi)有重復(fù)數(shù)據(jù)卻插入了一些數(shù)據(jù))正压,經(jīng)過(guò)壓縮后數(shù)據(jù)反而變多了。
字典編碼(dictionary coder)
责球,「使用更緊湊的表示」焦履,先將數(shù)據(jù)進(jìn)行編碼,即code與data的對(duì)應(yīng)關(guān)系雏逾,然后用code來(lái)表示文件數(shù)據(jù)嘉裤。
游程編碼 和 字典編碼 是無(wú)損壓縮技術(shù)(lossless compression techniques)
,很多無(wú)損壓縮文件格式都用到了它們栖博,如gif屑宠、png、pdf仇让、zip等典奉。
大多數(shù)有損壓縮技術(shù)(lossy compression techniques)
的基礎(chǔ)是:刪除掉一下人類看不出什么區(qū)別的數(shù)據(jù)躺翻,這種根據(jù)人類感知來(lái)刪除數(shù)據(jù)的做法叫感知編碼(Perceptual coding)
。比如聲音卫玖,人類聽覺只能識(shí)別特定頻率的聲波获枝,我們給音樂(lè)錄音時(shí),超聲波的數(shù)據(jù)都可以扔掉骇笔。有損音頻壓縮就會(huì)用不同精度編碼不同頻段省店。這就是手機(jī)中和現(xiàn)實(shí)中聽起來(lái)的不一樣的原因之一。如 MP3音頻文件比 未壓縮的音頻格式wav或flac往往小10倍笨触。
22.命令行界面
1868年Christopher Latham Sholes發(fā)明了打字機(jī)懦傍。打字機(jī)設(shè)計(jì)之初的目的是為了文件的易讀性和標(biāo)準(zhǔn)化。1874年打字機(jī)用了QWERTY鍵盤布局芦劣,并開始流行粗俱。1880年Elizabeth Longley開始推廣十指打字(ten-finger typing)
法。
打字機(jī)出現(xiàn)后有了電傳打字機(jī)(teletype machines)
虚吟。電傳打字機(jī)有了電子接口寸认,然后有了電傳電腦界面,用戶輸入一個(gè)命令按回車然后計(jì)算機(jī)會(huì)打印輸出串慰,這就形成了后來(lái)的命令行界面(Command Line Interfaces)
偏塞。
到1970年代,用屏幕加鍵盤代替電傳打字機(jī)變得實(shí)惠邦鲫。這些虛擬的電傳打字機(jī)被叫做終端(Terminal)
灸叼。
早期一個(gè)著名文字游戲叫Zork,后來(lái)從純文字進(jìn)化成多人游戲庆捺,簡(jiǎn)稱MUDs(Multi-User Dungeons)
古今。
23.屏幕 & 2D圖形顯示
出現(xiàn)了顯示技術(shù):
陰極射線管(Cathode Ray Tubes,CRT)
滔以,其原理是把電子發(fā)射到有磷光體圖層的屏幕上捉腥,當(dāng)電子撞擊涂層時(shí)會(huì)發(fā)光幾分之一秒。由于電子是帶電粒子 其路徑可以被磁場(chǎng)控制你画。繪制圖形有2種方式:①矢量掃描(Vector Scanning)
抵碟,即引導(dǎo)電子束描繪出形狀,然后足夠快地重復(fù)這條路徑撬即。 ②光柵掃描(Raster Scanning)
立磁,即從上向下從左到右逐行掃描但只在特定的點(diǎn)打開電子束來(lái)描繪,然后不斷重復(fù)這個(gè)過(guò)程剥槐。
屏幕上顯示的這些清晰的點(diǎn)唱歧,也稱為像素(pixel)
。如今用的液晶顯示器(Liquid Crystal Display,LCD)
也是用的光柵掃描技術(shù)颅崩,每秒多次更新像素里紅綠藍(lán)的顏色几于。
史上第一代顯卡是被稱為字符生成器(Character generator)
的硬件,它從內(nèi)存中讀取字符然后轉(zhuǎn)換成光柵圖形 顯示在屏幕上沿后。它內(nèi)部有一小塊只讀存儲(chǔ)器ROM(Read-only Memory)
沿彭,存儲(chǔ)點(diǎn)陣圖案(matrix pattern)
或像素矩陣
。尖滚。和一塊專門為圖形保留的屏幕緩沖區(qū)(Screen Buffer)
喉刘,當(dāng)程序想顯示文字時(shí),操作這塊區(qū)域的值即可漆弄。
字符生成器由于字符集有限睦裳,沒(méi)辦法繪制出任意形狀。于是想出用CRT的矢量掃描模式來(lái)描繪撼唾,用線來(lái)組成圖形廉邑。。程序更新內(nèi)存中的矢量設(shè)定指令值倒谷,讓圖形隨時(shí)間變化--動(dòng)畫(Animation)
蛛蒙。1962年代發(fā)明的Sketchpad 和 光筆 是人機(jī)交互方式的轉(zhuǎn)折點(diǎn)。 渤愁。
內(nèi)存中的bit可以直接一一對(duì)應(yīng)到屏幕上的像素牵祟,被稱為位圖顯示(bitmapped displays)
『锪妫可以把圖形想象成一個(gè)巨大的像素矩陣课舍,計(jì)算機(jī)把像素?cái)?shù)據(jù)存在幀緩沖區(qū)(frame buffer)
,早期這些數(shù)據(jù)存在內(nèi)存RAM里他挎,之后存儲(chǔ)在特殊的被稱為VRAM(Video RAM)
的高速顯存中,它位于顯卡上捡需。办桨。
24.冷戰(zhàn)和消費(fèi)主義
由于美國(guó)和前蘇聯(lián)的太空競(jìng)爭(zhēng),導(dǎo)致對(duì)計(jì)算機(jī)的需求倍增站辉,促使阿波羅計(jì)劃使用了造價(jià)不菲的像集成電路這樣的高新技術(shù)呢撞,也反過(guò)來(lái)促進(jìn)了計(jì)算機(jī)的發(fā)展。冷戰(zhàn)結(jié)束后饰剥,大部分需求變成了公司和消費(fèi)者殊霞,讓計(jì)算機(jī)普及、走向市場(chǎng)并最終獲得良性發(fā)展汰蓉。
25.個(gè)人計(jì)算機(jī)革命
普通計(jì)算機(jī)是公司或大學(xué)里面的那些大家伙绷蹲,然后有了微型計(jì)算機(jī)(Microcomputer),后面變成了PC。1970年代個(gè)人電腦變得可行祝钢。
比爾蓋茨和保羅艾倫寫了個(gè)BASIC解釋器(Interpreter)
比规,這樣就不用寫晦澀難懂的機(jī)器代碼了,拿去賣錢拦英。解釋器與編譯器(Compiler)
不同蜒什,前者是程序開始運(yùn)行時(shí)進(jìn)行轉(zhuǎn)換,而后者是提前全部轉(zhuǎn)換成機(jī)器碼后再執(zhí)行疤估。
喬布斯提議賣組裝好的電腦灾常,Apple-I、Apple-II誕生铃拇。IBM意識(shí)到了個(gè)人電腦的市場(chǎng)岗憋,其PC就采用開放架構(gòu)IBM Compatible(IBM兼容)
,兼容更多軟硬件锚贱。而蘋果選擇封閉架構(gòu)仔戈,更好的用戶體驗(yàn)。
1979年火爆的電子表格程序VisiCalc拧廊,是微軟Excel和谷歌Google Sheets的鼻祖监徘。
26.圖形用戶界面(Graphical User Interfaces,GUI)
1973年施樂(lè)公司發(fā)布的XEROX ALTO是第一臺(tái)GUI電腦吧碾,它的WIMP(即窗口Window凰盔、圖標(biāo)Icon、菜單Menu倦春、和指針Pointer)的啟發(fā)下户敬,1984年蘋果發(fā)布的Macintosh,這是普通人可以買到的第一臺(tái)帶圖形用戶界面的電腦睁本。相比命令行尿庐,圖形界面是個(gè)革命性進(jìn)展,用戶可以不必記住命令呢堰,圖形界面就告訴用戶可以做什么抄瑟,用戶只需在屏幕上找選項(xiàng)就行了。枉疼。
GUI程序就是由一些小組件(滑塊皮假、按鈕、打鉤框等)組成的骂维。GUI用的是事件驅(qū)動(dòng)編程(Event-driven programming)
惹资。
早先微軟的Windos操作系統(tǒng)都是基于DOS的,而DOS設(shè)計(jì)時(shí)就沒(méi)想過(guò)運(yùn)行圖形界面航闺,但從Windows3.1(對(duì)外是Windows 95)開始微軟開發(fā)了面向消費(fèi)者的GUI操作系統(tǒng)褪测。Windows 95還提供了Mac OS沒(méi)有的高級(jí)功能如多任務(wù)和內(nèi)存保護(hù)等。
27. 3D圖形
線框渲染(Wireframe Rendering)
:可以理解為顯示的線段。
把3D坐標(biāo)拍平顯示到2D屏幕上汰扭,這個(gè)過(guò)程叫“3D投影(3D Projection)”稠肘。
正交投影(Orthographic Projection)
:立方體的各個(gè)邊,在投影中是互相平行的萝毛。项阴。
透視投射(Perspective Projection)
:平行線段會(huì)在遠(yuǎn)處收斂于一點(diǎn)。笆包。
網(wǎng)格(Mesh)
:一堆多邊形的集合环揽。。
三角形在3D圖形學(xué)中被稱為是“多邊形(Polygons)”庵佣,三角形更常用的原因是能定義唯一的平面歉胶。
掃描線渲染(Scaline Rendering)
:多邊形轉(zhuǎn)換成填滿的像素。因?yàn)?D圖像不是線框渲染巴粪,需要被填充通今。。電腦填充的速度叫“填充速率(fillrate)”肛根。這種處理方式簡(jiǎn)單粗暴辫塌,邊緣充滿鋸齒。有種解決技術(shù)叫“抗鋸齒(Anti-aliasing)”派哲。原理是:判斷多邊形切過(guò)像素的程度來(lái)使用淺一點(diǎn)顏色進(jìn)行填充臼氨。。
遮擋(Occlusion)
:在3D場(chǎng)景中芭届,有的多邊形被另外一些多邊形擋住储矩。解決方法就是樓下的“畫家算法” 和 “深度緩沖”,二者也都會(huì)基于掃描線渲染技術(shù)褂乍。
畫家算法(Painter's Algorithm)
:先排序 然后從遠(yuǎn)到近渲染持隧。。
深度緩沖(Z-buffering)
:記錄場(chǎng)景中多邊形每個(gè)像素和攝像機(jī)的距離树叽,保留數(shù)值小的值舆蝴,再進(jìn)行填充渲染。题诵。
Z-fighting錯(cuò)誤
:如果場(chǎng)景中出現(xiàn)多邊形A和B距離都是20,哪個(gè)被渲染在上面變得不確定层皱。性锭。
背面剔除(Back-face Culling)
:如游戲里面人物角色,你只能看到朝攝影機(jī)的那一面叫胖,為了節(jié)省處理時(shí)間和計(jì)算量草冈,渲染中經(jīng)常忽略角色的背面。這就導(dǎo)致一個(gè)BUG,當(dāng)進(jìn)到角色內(nèi)部時(shí)怎棱,角色會(huì)消失哩俭。就像CF里面卡BUG,掉進(jìn)地底以后看不到地面了拳恋。凡资。
光靠掃描線渲染技術(shù)是沒(méi)有立體感的。谬运。 所以就加點(diǎn)燈光效果隙赁,提高真實(shí)度。
光照/明暗處理(Shading)
:就是燈光效果梆暖。
表面法線(Surface Normal)
:多邊形物體的單個(gè)多邊形的垂直線伞访。。
平面著色(Flat Shading)
:根據(jù)表面法線轰驳,距離光源的角度就不同厚掷,反光效果也就不同(越反光越用更亮的顏色填充)。级解。 平面著色會(huì)使得多邊形物體邊界非常明顯冒黑,不光滑,這導(dǎo)致更多其他算法被開發(fā)出來(lái)蠕趁,樓下的”高諾德著色“和”馮氏著色“薛闪。
高諾德著色(Gouraud Shading)
和 馮氏著色(Phong Shading)
:不是只用一種顏色給多邊形物體上色,用過(guò)渡色讓物體看起來(lái)更真實(shí)俺陋。豁延。
紋理(Textures)
:紋理在圖形學(xué)中指外觀,而不是手感腊状。
紋理映射(Texture Mapping)
:把 多邊形坐標(biāo) 和 內(nèi)存中紋理圖像 的坐標(biāo)一一對(duì)應(yīng)诱咏,從紋理的相應(yīng)區(qū)域取平均色去填充多邊形。 這樣才會(huì)得到一個(gè)精美的小茶壺缴挖。袋狞。。
一遍又一遍地處理多邊形:掃描線填充映屋,抗鋸齒苟鸯,光照,紋理化等棚点,在3D場(chǎng)景中早处,這樣的計(jì)算是巨大的。一方面可以為這些特定的運(yùn)算添加特定的硬件來(lái)加快速度瘫析,另一方面把3D場(chǎng)景分解成多個(gè)更小的部分并行渲染砌梆。GPU應(yīng)運(yùn)而生默责。
圖形處理單元(Graphics Processing Unit,GPU)
:GPU就在顯卡上咸包,它周圍有專用的RAM桃序,所有網(wǎng)格和紋理都可以存里面,讓GPU的多個(gè)核心可以高速訪問(wèn)烂瘫。
28.計(jì)算機(jī)網(wǎng)絡(luò)
LAN局域網(wǎng)(Local Area Networks)
: 計(jì)算機(jī)近距離構(gòu)成的小型網(wǎng)絡(luò)媒熊。LAN技術(shù)有很多,其中最成功的是以太網(wǎng)(Ethernet)
忱反,開發(fā)于1970年代施樂(lè)公司泛释。。
MAC地址(Media Access Control address)
: 以太網(wǎng)中電纜是共享的温算,每天聯(lián)網(wǎng)計(jì)算機(jī)都看得到數(shù)據(jù)但是不知道數(shù)據(jù)到底是給誰(shuí)的怜校,所以有了媒體訪問(wèn)控制地址,即MAC地址注竿。這個(gè)唯一的地址放頭部作為數(shù)據(jù)的前綴發(fā)送到網(wǎng)絡(luò)中茄茁,只有看到是自己的MAC地址才處理數(shù)據(jù)。
載波監(jiān)聽多路訪問(wèn)(Carrier Sense Multiple Access巩割,CSMA)
: 多臺(tái)電腦共享一個(gè)傳輸媒介的方法叫“載波監(jiān)聽多路訪問(wèn)”裙顽。如以太網(wǎng)的載體是銅線、WIFI的載體是傳播無(wú)線電波的空氣宣谈。載體傳輸數(shù)據(jù)的速度叫帶寬(Bandwidth)
愈犹。
指數(shù)退避(Exponential Backoff)
: 當(dāng)2臺(tái)主機(jī)向以太網(wǎng)內(nèi)同時(shí)發(fā)送數(shù)據(jù)時(shí)會(huì)發(fā)生沖突,數(shù)據(jù)全亂掉了闻丑。一種解決方案是等待網(wǎng)絡(luò)空閑再重試漩怎,然后再在重傳之前等待一段時(shí)間 = 呈指數(shù)級(jí)增長(zhǎng)的等待時(shí)間 + 隨機(jī)時(shí)間,這就叫指數(shù)退避嗦嗡。以太網(wǎng)和WIFI都用了這種方法勋锤,很多其他傳輸協(xié)議也用。
沖突域(Collision Damain)
: 如果主機(jī)數(shù)量進(jìn)一步增加侥祭,指數(shù)退避也不好使叁执,所以需要減少同一載體中的設(shè)備數(shù)量。載體和其中的設(shè)備統(tǒng)稱為沖突域矮冬。為了減少?zèng)_突谈宛,可以用交換機(jī)(Switch)
把網(wǎng)絡(luò)拆成兩個(gè)沖突域。交換機(jī)里有個(gè)路由表記錄MAC地址在哪邊胎署。 入挣。
最大的網(wǎng)絡(luò)就是因特網(wǎng)(Internet)
。
電路交換(Circuit Switching)
: A和B有5條專用通信線路硝拧,如果都被占用径筏,要等其中一條線路空閑出來(lái)才能使用,這就是電路交換障陶。
消息交換/報(bào)文交換(Message Switching)
: 除了在A和B之間建立專用通信線路滋恬,還可以讓 報(bào)文/消息 在AB間好幾個(gè)站點(diǎn)之間路由傳遞。消息沿著路由跳轉(zhuǎn)的次數(shù)叫跳數(shù)(hop count)
抱究。如果一個(gè)報(bào)文很大恢氯,傳輸時(shí)會(huì)阻塞整個(gè)鏈路很長(zhǎng)時(shí)間,所以要將大報(bào)文分成很多小塊鼓寺,叫數(shù)據(jù)包(packets)
噪馏。每個(gè)數(shù)據(jù)包都有目標(biāo)地址卵佛,所以路由器知道該發(fā)到哪里。數(shù)據(jù)包的具體格式由互聯(lián)網(wǎng)協(xié)議(Internet Protocol,IP)
定義桃移,這個(gè)標(biāo)準(zhǔn)創(chuàng)建于1970年代。路由器會(huì)不斷平衡與其他路由器之間的負(fù)載莹妒,這叫“阻塞控制(congestion control)”铛绰。有時(shí)同一報(bào)文的多個(gè)數(shù)據(jù)包會(huì)經(jīng)過(guò)不同線路導(dǎo)致到達(dá)的順序不一致,所以在IP之上還有其他協(xié)議幔虏,如TCP/IP纺念,可以解決亂序問(wèn)題。
分組交換(Packet Switching)
: 將數(shù)據(jù)報(bào)文拆分成多個(gè)小數(shù)據(jù)包想括,然后通過(guò)靈活的路由傳遞陷谱,這種路由方法叫分組交換。題外話:冷戰(zhàn)期間有核攻擊的威脅瑟蜈,所以創(chuàng)造了分組交換烟逊,實(shí)現(xiàn)去中心化,一個(gè)站點(diǎn)死掉踪栋,還可以走其他站點(diǎn)路由傳遞焙格。世界上第一個(gè)分組交換網(wǎng)絡(luò)和現(xiàn)代互聯(lián)網(wǎng)的祖先是ARPANET。
物聯(lián)網(wǎng)(Internet of things)
: 如今越來(lái)越多的智能設(shè)備聯(lián)網(wǎng)夷都,形成了物聯(lián)網(wǎng)眷唉。
29.互聯(lián)網(wǎng)
計(jì)算機(jī)想要獲取YouTube上的視頻:
- 首先要連接到局域網(wǎng)LAN(Local Area Network)。你家WIFI路由器連接著的所有設(shè)備組成了局域網(wǎng)囤官。
- 局域網(wǎng)再連接到廣域網(wǎng)WAN(Wide Area Network)冬阳。WAN的路由器一般屬于你的互聯(lián)網(wǎng)服務(wù)提供商,ISP(Internet Service Provider)党饮,廣域網(wǎng)里先連接到一個(gè)覆蓋街區(qū)的區(qū)域性路由器肝陪,然后路由器再連接到一個(gè)覆蓋整個(gè)城市的更大的WAN。
- 廣域網(wǎng)連接到互聯(lián)網(wǎng)主干上刑顺÷惹希互聯(lián)網(wǎng)主干由一群超大型超高帶寬的路由器組成饲常。
- 再沿著主干到達(dá)有對(duì)應(yīng)視頻文件的YouTube服務(wù)器,獲得數(shù)據(jù)狼讨”从伲可以用
traceroute
來(lái)看數(shù)據(jù)包中轉(zhuǎn)了幾次
數(shù)據(jù)包想要在互聯(lián)網(wǎng)上傳輸,要符合互聯(lián)網(wǎng)協(xié)議(Internet Protocol政供,IP)
標(biāo)準(zhǔn)播聪。就像物品需要滿足郵寄的限制條件才能被郵寄,如起始地址布隔、大小重量离陶。
IP是非常底層的協(xié)議,數(shù)據(jù)包的頭部只有目標(biāo)地址衅檀,使得數(shù)據(jù)包到達(dá)后招刨,操作系統(tǒng)并不知道該把數(shù)據(jù)交給哪個(gè)程序。因此需要在IP之上開發(fā)更高級(jí)的協(xié)議术吝,如UDP(User Datagram Protocol)
计济。
UDP也有它自己的頭部數(shù)據(jù),在自己的頭部數(shù)據(jù)中放了端口號(hào)排苍、校驗(yàn)和等重要信息沦寂。UDP會(huì)把自己的DATA部分全加在一起,計(jì)算出校驗(yàn)和放入頭部淘衙,以便確認(rèn)傳輸過(guò)程中是否出了差錯(cuò)传藏,不過(guò)可惜UDP沒(méi)有數(shù)據(jù)修復(fù)和數(shù)據(jù)重傳的功能,UDP也無(wú)法知道數(shù)據(jù)包是否到達(dá)目的地彤守。但是UDP簡(jiǎn)單速度快毯侦。
如果是郵件這種數(shù)據(jù),就要求所有數(shù)據(jù)必須到達(dá)具垫,不能出差錯(cuò)侈离,那就用 傳輸控制協(xié)議(Transmission Control Protocol,TCP)
筝蚕。
TCP結(jié)構(gòu)與UDP類似卦碾,不過(guò)有更高級(jí)的功能:1、TCP數(shù)據(jù)包有序號(hào)起宽。2洲胖、TCP要求接收方“校驗(yàn)和”確認(rèn)無(wú)誤后返回給發(fā)送方一個(gè)確認(rèn)碼(ACK)。發(fā)送方超時(shí)未收到ACK會(huì)重發(fā)坯沪。收件方也能通過(guò)序號(hào)去重绿映。通過(guò)ACK成功率和花費(fèi)的時(shí)間可以推算出網(wǎng)絡(luò)擁堵請(qǐng)求,自動(dòng)調(diào)整傳輸率(同時(shí)發(fā)包的數(shù)量)腐晾。
TCP由于ACK叉弦,把要傳輸?shù)臄?shù)據(jù)包數(shù)量翻了一倍丐一,所以傳輸速度不如UDP。
總結(jié):IP負(fù)責(zé)把數(shù)據(jù)包送到正確的計(jì)算器卸奉;UDP钝诚、TCP負(fù)責(zé)把數(shù)據(jù)包送到正確的程序。
由于IP地址(172.217.7.238)不好記榄棵,所以有了域名系統(tǒng)(Domain Name System,DNS)
潘拱,負(fù)責(zé)吧域名和IP地址一一對(duì)應(yīng)疹鳄。域名的數(shù)量太多,所以不是一個(gè)地方統(tǒng)一管理芦岂,而是成樹狀結(jié)構(gòu)瘪弓。
開放式系統(tǒng)互聯(lián)通信(Open System Interconnection,OSI)
網(wǎng)絡(luò)模型:
- 物理層(Physical Layer):線路里的電信號(hào)禽最、WIFI的信號(hào)
- 數(shù)據(jù)鏈路層(Data Link Layer):負(fù)責(zé)操控物理層腺怯。有MAC、碰撞檢測(cè)川无、指數(shù)退避
- 網(wǎng)絡(luò)層(Network Layer):負(fù)責(zé)各種報(bào)文交換和路由
- 傳輸層(Transport Layer):UDP呛占、TCP,負(fù)責(zé)點(diǎn)對(duì)點(diǎn)傳輸
- 會(huì)話層(Session Layer):使用UDP懦趋、TCP來(lái)創(chuàng)建連接晾虑,傳輸,關(guān)掉連接
- 表示層(Presentation Layer):信息語(yǔ)法語(yǔ)義關(guān)聯(lián)仅叫。加密解密帜篇、壓縮解壓縮
- 應(yīng)用層(Application Layer):由應(yīng)用層服務(wù)組成。SMTP郵件傳輸協(xié)議诫咱、HTTP超文本傳輸協(xié)議笙隙、FTP文件傳輸協(xié)議
分層后有利于改進(jìn)和維護(hù)
30.萬(wàn)維網(wǎng)(World Wide Web)
萬(wàn)維網(wǎng)不等于互聯(lián)網(wǎng),它是在互聯(lián)網(wǎng)之上運(yùn)行的坎缭。萬(wàn)維網(wǎng)的基本單位是一個(gè)網(wǎng)頁(yè)竟痰,網(wǎng)頁(yè)上有無(wú)數(shù)的超鏈接(hyperlink)
、超文本hypertext
幻锁,把更多的網(wǎng)頁(yè)連接在一起凯亮,形成了萬(wàn)維網(wǎng)。
這就需要每個(gè)網(wǎng)頁(yè)有唯一的地址哄尔,叫統(tǒng)一資源定位器(Uniform Resource Locator假消,URL)
。網(wǎng)絡(luò)服務(wù)器的標(biāo)準(zhǔn)端口為 80 端口岭接,使用超文本傳輸協(xié)議(Hypertext Transfer Protocol富拗,HTTP)
進(jìn)行數(shù)據(jù)傳遞臼予,1991 年有了 HTTP 第一個(gè)標(biāo)準(zhǔn),即 HTTP 0.9啃沪,它當(dāng)時(shí)只有一個(gè) Get 指令粘拾。
光有超文本也不行,別人不知道哪些文本是超鏈接哪些不是创千。然后人們開發(fā)出了超文本標(biāo)記語(yǔ)言(Hypertext Markup Launguage缰雇,HTML)
,1990 年有了第一個(gè)版本追驴,即 HTML 0.8械哟。最新的 HTML5 有100 多種標(biāo)簽,還有其他相關(guān)技術(shù)殿雪,如層疊樣式表(Cascading Style Sheets, CSS)
和 JavaScript 加進(jìn) HTML 做一些更復(fù)雜的事情暇咆。
Web瀏覽器(Web Browsers) 跟網(wǎng)頁(yè)服務(wù)器溝通,瀏覽器從網(wǎng)頁(yè)服務(wù)器獲取網(wǎng)頁(yè)和媒體丙曙,瀏覽器復(fù)雜渲染顯示爸业。這個(gè)架構(gòu)于 1990 年 Tim Berners-Lee制作,同時(shí)制定了URL亏镰、HTML扯旷、HTTP,整套架構(gòu)于 1991 年發(fā)布拆挥。萬(wàn)維網(wǎng)就此誕生薄霜。由于這些標(biāo)準(zhǔn)都是公開的,所以有了多家瀏覽器纸兔,如 Internet Explorer惰瓜、Mozilla、Chrome汉矿。
慢慢的萬(wàn)維網(wǎng)里有了越來(lái)越多的網(wǎng)站崎坊,其中一些成為了巨頭,如亞馬遜洲拇。然后又有了門戶網(wǎng)站奈揍,做一個(gè)目錄,專門幫人歸類記錄其他網(wǎng)站的赋续,如 Yahoo男翰。然后有了搜索引擎,Google纽乱。
搜索引擎由 3 部分組成:爬蟲(web crawler蛾绎,抓取新超鏈接) + 索引(index,記錄爬過(guò)的網(wǎng)頁(yè)) + 搜索算法(search algorithm,查詢索引)
網(wǎng)絡(luò)中立(network neutrality)
是指 應(yīng)不應(yīng)該平等對(duì)待所有數(shù)據(jù)包租冠,讓它們以相同的速度和優(yōu)先級(jí)傳遞鹏倘。如果不網(wǎng)絡(luò)中立,某些巨頭就可以壟斷排擠其他競(jìng)爭(zhēng)對(duì)手讓對(duì)手的數(shù)據(jù)包傳遞得很差顽爹。
今天為什么我們說(shuō) HTTP 是無(wú)連接纤泵、無(wú)狀態(tài)的:無(wú)連接是因?yàn)槊總€(gè)請(qǐng)求都不用保持連接,避免服務(wù)端占用資源镜粤。無(wú)狀態(tài)是因?yàn)槊總€(gè)請(qǐng)求獨(dú)立執(zhí)行捏题,一個(gè)請(qǐng)求不知道其他請(qǐng)求的信息,服務(wù)端不用跟蹤狀態(tài)占用資源繁仁。
31.網(wǎng)絡(luò)安全(Cybersecurity)
網(wǎng)絡(luò)安全可以分為三個(gè)方向:
- 保密性(secrecy):只有被授權(quán)的人才能讀取計(jì)算機(jī)系統(tǒng)和數(shù)據(jù)
- 完整性(integrity):只有被授權(quán)的人才能讀寫系統(tǒng)和數(shù)據(jù)
- 可用性(availability):只有被授權(quán)的人才能總是訪問(wèn)系統(tǒng)和數(shù)據(jù)
威脅模型分析(threat model)涉馅,在特定情境下做的保護(hù)措施。
要有身份認(rèn)證(authentication):①what you know黄虱,如用戶名密碼 ②what you have,如果是一把鎖那么你需要有鑰匙 ③what you are庸诱,如指紋識(shí)別虹膜識(shí)別捻浦。
暴力攻擊(brute force attack),把所有可能都試一遍桥爽。
多因素認(rèn)證(multi-factor authentication)朱灿,同時(shí)使用 2 中或以上的認(rèn)證方式。如蘋果的密碼和驗(yàn)證碼同步驗(yàn)證钠四。
過(guò)了身份認(rèn)證以后盗扒,還需要有 “訪問(wèn)控制(Access Control)”,即 Permissions缀去、Access Control Lists侣灶。 美國(guó)國(guó)防部多層安全政策的Bell-Lapadula模型,即“不能向上讀缕碎,不能向下寫”褥影。
隔離,是種把損害降到最低的思想咏雌。比如“沙盒(sandbox)”凡怎。
32.黑客&網(wǎng)絡(luò)攻擊
黑客(Hacker)有好有壞,好的是為了查找漏洞及時(shí)修復(fù)赊抖,壞的是惡意破壞牟利统倒。前者是White Hats,后者是Black Hats氛雪。
- 社會(huì)工程學(xué)(Social Engineering)房匆,不是技術(shù)手段,而是欺騙別人讓人泄密。
- 釣魚(Phishing)坛缕,長(zhǎng)得跟真的一樣的假網(wǎng)站墓猎。
- 假托(Pretexting),假裝是內(nèi)部人員赚楚,欺騙泄密毙沾。
- 木馬(Trojan Horses),偷數(shù)據(jù)宠页、加密文件讓你交贖金等左胞。
- NAND鏡像(NAND Mirroring),通過(guò)物理接觸往內(nèi)存里面接幾根線举户,復(fù)制內(nèi)存烤宙,重置內(nèi)存,暴力破解俭嘁。此方法破解過(guò)iPhone 5C躺枕。
- 漏洞利用(Exploit),利用系統(tǒng)漏洞獲取某些能力和訪問(wèn)權(quán)限供填。一種常見的Exploit就是緩沖區(qū)溢出(Buffer Overflow)拐云,緩沖區(qū)是一種概稱,指預(yù)留的一塊內(nèi)存空間近她,超長(zhǎng)溢出部分的數(shù)據(jù)會(huì)覆蓋相鄰的數(shù)據(jù)叉瘩,導(dǎo)致系統(tǒng)出錯(cuò)或非法修改內(nèi)存中的數(shù)據(jù)。應(yīng)對(duì)措施有邊界檢查(Bounds Checking)粘捎、隨機(jī)存放變量在內(nèi)存中的位置薇缅、在緩沖區(qū)后面留點(diǎn)不用的內(nèi)存空間(金絲雀,canaries)去跟蹤檢查攒磨。
- 代碼注入(Code Injection)泳桦,常用來(lái)攻擊用數(shù)據(jù)庫(kù)的網(wǎng)站。對(duì)此咧纠,首先不讓輸入特殊字符蓬痒,然后服務(wù)器再篩查一遍,最后放入數(shù)據(jù)庫(kù)查漆羔。
- 零日漏洞(Zero Day Vulnerability)梧奢,即軟件制造者不知道軟件有新漏洞被發(fā)現(xiàn)。
- 計(jì)算機(jī)蠕蟲(Worms)演痒,有足夠多的電腦有漏洞亲轨,讓黑客把惡意程序自動(dòng)在電腦間相互傳播。這樣黑客拿下了大量電腦鸟顺,這些電腦組成了”僵尸網(wǎng)絡(luò)(Botnet)“惦蚊∑飨海”拒絕服務(wù)攻擊(DDoS)“就是僵尸網(wǎng)絡(luò)里的所有電腦發(fā)一大堆垃圾信息堵塞服務(wù)器。
33.密碼學(xué)
- 多層防御(Defence in depth)蹦锋,沒(méi)有永遠(yuǎn)安全的系統(tǒng)或程序兆沙,那就設(shè)置多層防御。
- 加密(Encryption)莉掂、解密(Decryption)葛圃,把明文通過(guò)加密算法轉(zhuǎn)為密文就叫加密,反之為解密憎妙。沒(méi)有密碼得到的就是一堆亂碼库正。
- 早期還沒(méi)有計(jì)算機(jī)的時(shí)候就已經(jīng)有人加密私人信件,一類是替換加密(Substitution cipher)厘唾,凱撒加密(Caesar chipher)是這類替換加密中的一種褥符,把字母A變成D等。另一類是移位加密(Permutation cipher)抚垃,列位移加密(Columnar transpostion cipher)是這類中的一種喷楣,用一小網(wǎng)格利用讀取方向和網(wǎng)格大小來(lái)解密。
- 德國(guó)納粹Enigma加密機(jī)鹤树,到了1990年代抡蛙,人們用密碼學(xué)做了加密機(jī)器。Enigma不僅是簡(jiǎn)單的替換加密魂迄,轉(zhuǎn)子每輸入一個(gè)字母會(huì)轉(zhuǎn)動(dòng)一格,就意味著AAA可能變?yōu)镃DK惋耙。2臺(tái)初始設(shè)置相同的Enigma配合使用就可以做到加解密捣炬。
- 1997年的”數(shù)據(jù)加密標(biāo)準(zhǔn)“(Data Encryption Standard,DES)绽榛,最初用56-bit二進(jìn)制密鑰湿酸。
- 2001年的”高級(jí)加密標(biāo)準(zhǔn)“(Advanced Encryption Standard,AES)灭美,用更長(zhǎng)128/192/256-bit推溃。AES將數(shù)據(jù)切成小塊,每塊16個(gè)字節(jié)届腐,然后用密鑰進(jìn)行一系列替換加密和移位加密以及其他操作铁坎,每塊數(shù)據(jù)重復(fù)這個(gè)過(guò)程10次或以上。為啥選用這些長(zhǎng)度bit犁苏,為啥只重復(fù)10次硬萍?權(quán)衡安全和性能。
- 密鑰交換(key exchange)围详,早期人們靠口頭約定或密碼本朴乖,而現(xiàn)在要在互聯(lián)網(wǎng)上公開傳遞密鑰祖屏。密鑰交換是一種不發(fā)送密鑰但依然讓2臺(tái)計(jì)算機(jī)在密鑰上達(dá)成共識(shí)的算法。用單向函數(shù)實(shí)現(xiàn)买羞。
- 單向函數(shù)(one-way functions) 和 密鑰加密 原理袁勺,單向函數(shù)是一種數(shù)學(xué)操作,很容易算出結(jié)果畜普,卻很難逆向得到輸入期丰,如顏色混合,很難知道混了什么顏色漠嵌。
- 迪菲-赫爾曼 密鑰交換(Diffie-Hellman Key Exchange)咐汞,在Diffie-Hellman中,單向函數(shù)是模冪運(yùn)算儒鹿,那一個(gè)數(shù)當(dāng)基數(shù)一個(gè)數(shù)當(dāng)指數(shù)做冪運(yùn)算再除以第三個(gè)數(shù)得到余數(shù)化撕,只給余數(shù)和基數(shù)很難的值指數(shù)是多少。
- 非對(duì)稱加密(Asymmetric encryption)约炎,加密和解密不是同一個(gè)密鑰植阴。目前最流行的非對(duì)稱加密算法是RSA。
密碼學(xué)里常常會(huì)用到質(zhì)數(shù)圾浅,質(zhì)數(shù)是指大于1的自然數(shù)中掠手,除了1和自身以外不能被其他自然數(shù)整除的自然數(shù)。
34.機(jī)器學(xué)習(xí)&人工智能
機(jī)器學(xué)習(xí)(machine Learning, ML)是為實(shí)現(xiàn)人工智能(Artificial Intelligence, AI)的技術(shù)之一狸捕。
機(jī)器學(xué)習(xí)算法的目的是為了最大化正確率和最小化錯(cuò)誤率喷鸽。
很多機(jī)器學(xué)習(xí)使用了統(tǒng)計(jì)學(xué)算法,如通過(guò)特征生成決策樹(decision tree)灸拍;但也有其他方法做祝,如人工神經(jīng)網(wǎng)絡(luò)(artificial neural networks)。
35.計(jì)算機(jī)視覺
計(jì)算機(jī)視覺(computer vision)鸡岗,目標(biāo)是讓計(jì)算機(jī)理解圖像和視頻混槐。
36.自然語(yǔ)言處理
人類希望計(jì)算機(jī)也能像人類一樣有處理自然語(yǔ)言的能力,自然語(yǔ)言處理(Natural Language Processing,NLP)轩性。
自然語(yǔ)言不同于機(jī)器語(yǔ)言声登,機(jī)器語(yǔ)言詞匯量少、高度結(jié)構(gòu)化揣苏,而人類自然語(yǔ)言詞匯量大悯嗓、有口音、一詞多義等等舒岸。
英語(yǔ)單詞的九種基本詞性:名詞(nouns)绅作、代詞(pronouns)、冠詞(articles)蛾派、動(dòng)詞(verbs)俄认、形容詞(adjectives)个少、副詞(adverbs)、介詞(prepositions)眯杏、連詞(conjunctions)夜焦、感嘆詞(interjections)
早期聊天機(jī)器人和對(duì)話系統(tǒng)用無(wú)數(shù)個(gè)手動(dòng)寫的“規(guī)則匹配”(可能說(shuō)的話)來(lái)實(shí)現(xiàn)。
計(jì)算機(jī)從聲音中提取詞匯岂贩,即語(yǔ)音識(shí)別(speech recognition)茫经,通過(guò)譜圖(不同頻率振幅)定位重讀元音,利用深度神經(jīng)網(wǎng)絡(luò)識(shí)別出人類語(yǔ)音萎津。
通過(guò)語(yǔ)音合成(speech synthesis)卸伞,讓計(jì)算機(jī)輸出語(yǔ)音。
37.機(jī)器人
1940年代有了CNC機(jī)器(Computer Numerical Control锉屈,計(jì)算機(jī)數(shù)控)荤傲,可以執(zhí)行一連串程序指定的操作,做一些非常精細(xì)的加工颈渊,這在之前生產(chǎn)中是很難做到的遂黍。CNC機(jī)器大大推進(jìn)了制造業(yè)。
利用控制回路和反饋機(jī)制的PID控制器(Proportional integral derivative controller)俊嗽,讓機(jī)器人的屬性變成期望值雾家。
把各種技術(shù)(人工智能、計(jì)算機(jī)視覺绍豁、自然語(yǔ)言處理等)結(jié)合起來(lái)芯咧,讓機(jī)器人越來(lái)越像人。機(jī)器人可以接受命令并高效執(zhí)行竹揍,有智力并且可以殺人的機(jī)器人叫“致命自主武器(lethal autonomous weapons)”
38.計(jì)算機(jī)心理學(xué)
我們需要了解人類心理學(xué)唬党,做出更好的計(jì)算機(jī)。比如人類對(duì)顏色的感知鬼佣,用顏色強(qiáng)度表示連續(xù)的數(shù)據(jù)、用不同顏色表示沒(méi)有順序的分類數(shù)據(jù)等等會(huì)非常有效霜浴。
界面設(shè)計(jì)中有個(gè)重點(diǎn)概念晶衷,直觀功能(affordances),直觀功能為如何操作物體提供線索阴孟。如旋鈕用來(lái)轉(zhuǎn)晌纫,插槽用來(lái)插東西。the user knows what to do just by looking.
與直觀功能相關(guān)的一個(gè)心理學(xué)概念是“認(rèn)出與回想(recognition vs recall)”永丝,這就是為什么選擇題比填空題更容易锹漱。用感覺來(lái)出發(fā)記憶會(huì)容易得多。
人機(jī)交互(human robot interaction, HRI)是一個(gè)研究人類和機(jī)器人交互的領(lǐng)域慕嚷。
原文地址:
(b站)10分鐘速成課:計(jì)算機(jī)科學(xué)
(Youtube)Computer Science