當我們運行Office Word的時候,雙擊就可以了。 由于軟件是安裝在硬盤上的,雙擊的時候,操作系統(tǒng)會根據(jù)文件路徑找到exe程序在硬盤的位置,控制其代碼從硬盤加載到內(nèi)存,然后控制cpu從內(nèi)存中讀取剛剛讀入內(nèi)存的應用程序的代碼執(zhí)行,應用程序完成啟動。即:一個程序開始的第一條指令存放的位置是由操作系統(tǒng)掌控的。那它是怎么完成程序的執(zhí)行的呢?
要想清楚的了解程序的執(zhí)行過程就要先知道計算機的基本結(jié)構(gòu)
阿蘭·圖靈于1912年出生于英國,擅長數(shù)理邏輯學和計算理論。
阿蘭.圖靈
圖靈機是阿蘭·圖靈在24歲時提出的,發(fā)表在論文《論可計算數(shù)及其在判定問題中的應用》。圖靈的基本思想是用機器來模擬人們用紙筆進行數(shù)學運算的過程,而且還定義了計算機由哪些部分組成,程序又是如何執(zhí)行的。
圖靈機長什么樣子呢?示意圖如下:
基本組成部分:
圖靈機只是一個抽象的模型,這個理想的模型是好,但是理想終歸是理想,想要成為現(xiàn)實,我們得想其它辦法。于是在此基礎上,馮洛伊曼提出了電子計算機使用二進制數(shù)制系統(tǒng)和儲存程序,并按照程序順序執(zhí)行,即馮諾依曼體系結(jié)構(gòu)。
在 1945 年馮諾依曼和其他計算機科學家們提出了計算機具體實現(xiàn)的報告,其遵循了圖靈機的設計,而且還提出用電子元件構(gòu)造計算機,并約定了用二進制進行計算和存儲。
根據(jù)馮諾依曼體系結(jié)構(gòu)構(gòu)成的計算機,必須具有如下功能:
· 把程序和數(shù)據(jù)裝入到計算機中;
· 必須具有長期記住程序、數(shù)據(jù)的中間結(jié)果及最終運算結(jié)果;
· 完成各種算術(shù)、邏輯運算和數(shù)據(jù)傳送等數(shù)據(jù)加工處理;
· 根據(jù)需要控制程序走向,并能根據(jù)指令控制機器的各部件協(xié)調(diào)操作;
· 能夠按照要求將處理的數(shù)據(jù)結(jié)果顯示給用戶。
為了完成上述的功能,計算機必須具備五大基本組成部件:
· 裝載數(shù)據(jù)和程序的輸入設備;
· 記住程序和數(shù)據(jù)的存儲器;
· 完成數(shù)據(jù)加工處理的運算器;
· 控制程序執(zhí)行的控制器;
· 顯示處理結(jié)果的輸出設備。
因此,定義計算機基本結(jié)構(gòu)就需要 5 個部分:運算器、控制器、存儲器、輸入設備、輸出設備,這 5 個部分也被稱為馮諾依曼模型。
馮諾依曼體系結(jié)構(gòu)是現(xiàn)代計算機的基礎。在該體系結(jié)構(gòu)下,程序和數(shù)據(jù)統(tǒng)一存儲,指令和數(shù)據(jù)需要從同一存儲空間存取,經(jīng)由同一總線傳輸,無法重疊執(zhí)行。根據(jù)馮諾依曼體系,CPU的工作分為以下 5 個階段:取指令階段、指令譯碼階段、執(zhí)行指令階段、訪存取數(shù)和結(jié)果寫回。
· 取指令(IF,instruction fetch),即將一條指令從主存儲器中取到指令寄存器的過程。程序計數(shù)器中的數(shù)值,用來指示當前指令在主存中的位置。當 一條指令被取出后,程序計數(shù)器(PC)中的數(shù)值將根據(jù)指令字長度自動遞增。
· 指令譯碼階段(ID,instruction decode),取出指令后,指令譯碼器按照預定的指令格式,對取回的指令進行拆分和解釋,識別區(qū)分出不同的指令類 別以及各種獲取操作數(shù)的方法。現(xiàn)代CISC處理器會將拆分已提高并行率和效率。
· 執(zhí)行指令階段(EX,execute),具體實現(xiàn)指令的功能。CPU的不同部分被連接起來,以執(zhí)行所需的操作。
· 訪存取數(shù)階段(MEM,memory),根據(jù)指令需要訪問主存、讀取操作數(shù),CPU得到操作數(shù)在主存中的地址,并從主存中讀取該操作數(shù)用于運算。部分指令不需要訪問主存,則可以跳過該階段。
· 結(jié)果寫回階段(WB,write back),作為最后一個階段,結(jié)果寫回階段把執(zhí)行指令階段的運行結(jié)果數(shù)據(jù)“寫回”到某種存儲形式。結(jié)果數(shù)據(jù)一般會被寫到CPU的內(nèi)部寄存器中,以便被后續(xù)的指令快速地存取;許多指令還會改變程序狀態(tài)字寄存器中標志位的狀態(tài),這些標志位標識著不同的操作結(jié)果,可被用來影響程序的動作。
在指令執(zhí)行完畢、結(jié)果數(shù)據(jù)寫回之后,若無意外事件(如結(jié)果溢出等)發(fā)生,計算機就從程序計數(shù)器中取得下一條指令地址,開始新一輪的循環(huán),下一個指令周期將順序取出下一條指令。 許多復雜的CPU可以一次提取多個指令、解碼,并且同時執(zhí)行。
運算器、控制器是在中央處理器里的,存儲器就我們常見的內(nèi)存,輸入輸出設備則是計算機外接的設備,比如鍵盤就是輸入設備,顯示器就是輸出設備。
存儲單元和輸入輸出設備要與中央處理器打交道的話,離不開總線。所以,它們之間的關(guān)系如下圖:
接下來,分別介紹內(nèi)存、中央處理器、總線、輸入輸出設備。
簡稱(RAM)專業(yè)的說內(nèi)存是計算機中重要的部件之一,它是與CPU進行溝通的橋梁。計算機所有的程序都是在內(nèi)存中運行的,如果沒有內(nèi)存你的電腦將開不了機。
在計算機數(shù)據(jù)存儲中,存儲數(shù)據(jù)的基本單位是字節(jié)(byte),1 字節(jié)等于 8 位(8 bit)。每一個字節(jié)都對應一個內(nèi)存地址。
內(nèi)存的地址是從 0 開始編號的,然后自增排列,最后一個地址為內(nèi)存總字節(jié)數(shù) - 1,這種結(jié)構(gòu)好似我們程序里的數(shù)組,所以內(nèi)存的讀寫任何一個數(shù)據(jù)的速度都是一樣的。
RAM的優(yōu)點:是存取速度快、讀寫方便。缺點:是數(shù)據(jù)不能長久保持,斷電后自行消失,因此主要用于計算機主存儲器等要求快速存儲的系統(tǒng)。按工作方式不同,可分為靜態(tài)和動態(tài)兩類。
靜態(tài)隨機存儲器(SRAM)的單元電路是觸發(fā)器,存入的信息在規(guī)定的電源電壓下便不會改變。SRAM速度快,使用方便。
動態(tài)隨機存儲器(DRAM)的單元由一個金屬-氧化物-半導體(MOS)電容和一個MOS晶體管構(gòu)成,數(shù)據(jù)以電荷形式存放在電容之中,需每隔2~4毫秒對單元電路存儲信息重寫一次(刷新)。DRAM存儲單元器件數(shù)量少,集成度高,應用廣泛。
CPU:中央處理器,由運算器和控制器組成。計算機解決某個問題時要為它編寫程序,它告訴計算機要執(zhí)行什么操作,在什么地方來找到用來操作的數(shù)據(jù)一旦把程序加載到內(nèi)存儲器,CPU的基本工作是執(zhí)行存儲的指令序列,即程序。程序的執(zhí)行過程實際上是不斷地取出指令、分析指令、執(zhí)行指令的過程。
CPU從存放程序的主存儲器里取出一條指令,譯碼并執(zhí)行這條指令,保存執(zhí)行結(jié)果,緊接著又去取指令,譯碼,執(zhí)行指令……,如此周而復始,反復循環(huán),使得計算機能夠自動地工作。除非遇到停機指令,否則這個循環(huán)將一直進行下去。其過程如圖所示
CPU 中的寄存器主要作用是存儲計算時的數(shù)據(jù),你可能好奇為什么有了內(nèi)存還需要寄存器?原因很簡單,因為內(nèi)存離 CPU 太遠了,而寄存器就在 CPU 里,還緊挨著控制單元和邏輯運算單元,自然計算時速度會很快。
常見的寄存器種類:
總線(Bus),是指計算機設備和設備之間傳輸信息的公共數(shù)據(jù)通道。在城市中,車輛通行需要道路,需要交通。在計算機中,同樣需要在各部件之間傳輸信息的通路,信息通過電線束從一個計算機部件到另一個部件,就稱作總線,它是一種信號傳遞的布線方式。總線是用于 CPU 和內(nèi)存以及其他設備之間的通信,總線按照不同的分類標準可以有不同的分類。按照傳遞的數(shù)據(jù)分可分為 3 種:
當 CPU 要讀寫內(nèi)存數(shù)據(jù)的時候,一般需要通過下面這三個總線:
按照在計算機所在區(qū)域分:內(nèi)部總線,系統(tǒng)總線,外部總線。按實現(xiàn)方式分:并行總線,串行總線。
輸入輸出設備(IO設備),是數(shù)據(jù)處理系統(tǒng)的關(guān)鍵外部設備之一,可以和計算機本體進行交互使用。輸入設備向計算機輸入數(shù)據(jù),計算機經(jīng)過計算后,把數(shù)據(jù)輸出給輸出設備。期間,如果輸入設備是鍵盤,按下按鍵時是需要和 CPU 進行交互的,這時就需要用到控制總線了。
我們經(jīng)常聽到32位或64位計算機,32 位和 64 位 CPU 最主要區(qū)別在于一次能計算多少字節(jié)數(shù)據(jù):
這里的 32 位和 64 位,通常稱為 CPU 的位寬。
線路位寬:數(shù)據(jù)是如何通過線路傳輸?shù)哪兀科鋵嵤峭ㄟ^操作電壓,低電壓表示 0,高壓電壓則表示 1。為了避免低效率的串行傳輸?shù)姆绞剑?/span>線路的位寬最好一次就能訪問到所有的內(nèi)存地址。
CPU 要操作的內(nèi)存地址空間就需要相應的地址總線:
那么,想要 CPU 操作 4G 大的內(nèi)存,那么就需要 32 條地址總線,因為 2 ^ 32=4G。
CPU 位寬:CPU 的位寬最好等于線路位寬,比如 32 位 CPU 控制 40 位寬的地址總線和數(shù)據(jù)總線的話,處理比較麻煩。所以 32 位的 CPU 最好和 32 位寬的線路搭配,64 位的 CPU 最好和 64 位寬的線路搭配。但是并不代表 64 位 CPU 性能比 32 位 CPU 高很多,很少應用需要算超過 32 位的數(shù)字,所以如果計算的數(shù)額不超過 32 位數(shù)字的情況下,32 位和 64 位 CPU 之間沒什么區(qū)別的,只有當計算超過 32 位數(shù)字的情況下,64 位的優(yōu)勢才能體現(xiàn)出來。另外,32 位 CPU 最大只能操作 4GB 內(nèi)存,就算你裝了 8 GB 內(nèi)存條,也沒用實質(zhì)的作用。而 64 位 CPU 尋址范圍則很大,理論最大的尋址空間為 2^64。
程序?qū)嶋H上就是把我們現(xiàn)實中的一個生活場景,通過計算機的編程語言搬到電腦中的一種實現(xiàn)方式罷了。
程序?qū)嶋H上是一條一條指令,負責執(zhí)行指令的就是 CPU 了。一個程序執(zhí)行的時候,CPU 會根據(jù)程序計數(shù)器里的內(nèi)存地址,從內(nèi)存里面把需要執(zhí)行的指令讀取到指令寄存器里面執(zhí)行,然后根據(jù)指令長度自增,開始順序讀取下一條指令。
現(xiàn)代大多數(shù) CPU 都使用來流水線的方式來執(zhí)行指令,所謂的流水線就是把一個任務拆分成多個小任務,于是一條指令通常分為 4 個階段,稱為 4 級流水線,如下圖:
四個階段的具體含義:取得指令,指令譯碼,執(zhí)行指令,數(shù)據(jù)回寫。上面這 4 個階段,我們稱為指令周期(Instrution Cycle),CPU 的工作就是一個周期接著一個周期,周而復始。
每個CPU都有一套自己可以執(zhí)行的專門的指令集。接下來我們選用最簡單的 MIPS 指集,來看看機器碼是如何生成的。MIPS 的指令是一個 32 位的整數(shù),高 6 位代表著操作碼,表示指令類型,剩下的 26 位根據(jù)不同指令類型所表示的內(nèi)容也就不相同,總結(jié)下來主要有三種類型R、I 和 J。
具體含義:
編譯器在編譯程序的時候,會構(gòu)造指令,這個過程叫做指令的編碼。CPU 執(zhí)行程序的時候,就會解析指令,這個過程叫作指令的解碼。
CPU需要使用一個叫做存儲器(也就是各種寄存器)的東西保存輸入和輸出數(shù)據(jù)。以下是幾種常見的寄存器
· MAR: memory address register,保存將要被訪問數(shù)據(jù)在內(nèi)存中哪個地址處,保存的是地址值
· MDR: memory data register,保存從內(nèi)存讀取進來的數(shù)據(jù)或?qū)⒁獙懭雰?nèi)存的數(shù)據(jù),保存的是數(shù)據(jù)值
· AC: Accumulator,保存算術(shù)運算和邏輯運算的中間結(jié)果,保存的是數(shù)據(jù)值
· PC: Program Counter,保存下一個將要被執(zhí)行指令的地址,保存的是地址值
· CIR: current instruction register,保存當前正在執(zhí)行的指令
關(guān)于CPU上的高速緩存
指令的類型
指令從功能角度分為 5 大類:
指令的執(zhí)行速度
CPU 的硬件參數(shù)都會有 GHz 這個參數(shù),比 1 GHz 的 CPU指的是時鐘頻率是 1 G,代表著 1 秒會產(chǎn)生 1G 次數(shù)的脈沖信號,每一次脈沖信號高低電平的轉(zhuǎn)換就是一個周期,稱為時鐘周期。
對于 CPU 來說,在一個時鐘周期內(nèi),CPU完成一個指令時鐘頻率越高,時鐘周期就越短,工作速度也就越快。
一個時鐘周期一定能執(zhí)行完一條指令嗎?答案是不一定的,大多數(shù)指令不能在一個時鐘周期完成,通常需要若干個時鐘周期。不同的指令需要的時鐘周期是不同的,加法和乘法都對應著一條 CPU 指令,但是乘法需要的時鐘周期就要比加法多。
程序執(zhí)行耗費的 CPU 時間少就說明程序執(zhí)行的快。對于程序的 CPU 執(zhí)行時間,我們可以拆解成 CPU 時鐘周期數(shù)(CPU Cycles)和時鐘周期時間(Clock Cycle Time)的乘積。
時鐘周期時間就是 CPU 主頻,主頻越高說明 CPU 的工作速度就越快,比如電腦的 CPU 是 2.4 GHz 四核 Intel Core i5,這里的 2.4 GHz 就是電腦的主頻,時鐘周期時間就是 1/2.4G。
要想 CPU 跑的更快,自然縮短時鐘周期時間,對于 CPU 時鐘周期數(shù)我們可以進一步拆解成:「指令數(shù) x 每條指令的平均時鐘周期數(shù)(Cycles Per Instruction,簡稱 CPI)」,于是程序的 CPU 執(zhí)行時間的公式可變成如下:
因此,要想程序跑的更快,優(yōu)化這三者即可:
當我們輸入以下程序,編譯運行,計算機從屏幕輸出Hello,World!整個過程計算機都怎么運作的呢?
計算機內(nèi)部存儲的是0和1,計算機通過位信息以及上下文來解讀這些0、1信息的。Hellow,World是由0和1組成的序列,將這些程序代碼轉(zhuǎn)換成相應的文本字符,每8位表示一個字節(jié),用來存儲一個字符。
Hello,World的ASCII碼表示
因為我們輸入的Hello,World是人可以閱讀和編寫的,但是機器并不能直接識別,它需要把這些文字翻譯成機器可執(zhí)行的二進制文件,這一部分的工作是由編譯系統(tǒng)完成的。編譯系統(tǒng)由預處理器、編譯器、匯編器、連接器四部分組成。以hello, world程序為例,各部分共同完成將源文件編譯成二進制可執(zhí)行文件。各個部分完成的具體工作如下:
程序加載進入CPU的過程
Shell:命令行解釋器。當用戶輸入一行命令后,shell先判斷它是不是一個shell內(nèi)置命令;如果不是,shell會假定為一個可執(zhí)行文件的名字,直接去加載并執(zhí)行該文件。因此,當我們通過編譯系統(tǒng)將源文件編譯成可執(zhí)行二進制文件后,在shell中輸入我們得到的可執(zhí)行二進制文件名,shell將其從磁盤中加載到主存當中,通過CPU進行解釋運行,最終通過終端設備(屏幕)將他顯示出來,程序運行結(jié)束。
主內(nèi)存對指令的處理分為多級緩存,其中比較重要的就是各類寄存器。寄存器是中央處理器內(nèi)主要組成結(jié)構(gòu)成分,它是CPU當中有限存貯容量的高速存貯部件,它在工作時能將計算機指令數(shù)據(jù)進行暫時的存儲。
內(nèi)存地址=基質(zhì)+變址
CPU中的主要寄存器:
處理器讀取并解釋存儲在存儲器中的指令處理器的操作主要是圍繞程序計數(shù)器、算術(shù)/邏輯運算單元、主存來進行運作的。處理器首先從PC所指向的主存存儲單元讀取指令,解釋指令中的位,執(zhí)行該指令指示的簡單操作,然后更新PC寄存器,使其指向下一條要執(zhí)行的指令。CPU會執(zhí)行的操作有:
加載:把一個字節(jié)或一個字從主存復制到寄存器,覆蓋掉寄存器中原來的值。
存儲:把一個字節(jié)或一個從寄存器復制到主存,并覆蓋主存中原來的值。
操作:把兩個寄存器的內(nèi)容復制到ALU,ALU對兩個字做算術(shù)運算后存回其中的一個寄存器,該寄存器中原來的值會被覆蓋。
跳轉(zhuǎn):從cpu執(zhí)行的指令抽取一個字的內(nèi)容存入PC,覆蓋掉原來的值,從而改變下一條要執(zhí)行的指令,達到跳轉(zhuǎn)的目的。
Hello,World程序首先被加載,從磁盤中復制到寄存器中,寄存器將Hello,World程序復制到主存中進行存儲。程序運行過程中,CPU執(zhí)行Hellow,World機器指令,指令的結(jié)果是將”Hellow,World”字符由內(nèi)存復制到寄存器,寄存器再將結(jié)果復制到顯示設備上顯示出來。
下面我們詳細的給出一個代碼段在內(nèi)存中的存儲示意圖。
果您的工作主要是用電腦完成的,總有一天您會想能不能自動執(zhí)行一些任務。比如,對大量文本文件執(zhí)行查找、替換操作;利用復雜的規(guī)則重命名、重排序一堆照片文件;也可能您想編寫一個小型數(shù)據(jù)庫、或開發(fā)專用的圖形界面應用,甚至是開發(fā)一個簡單的游戲。
作為一名專業(yè)軟件開發(fā)人員,您可能要處理 C/C++/Java庫,但編碼、編譯、測試、再編譯這些開發(fā)流程太慢了;也許您正在給這些庫開發(fā)測試套件,但總覺得這項工作真是枯燥乏味。又或許,您開發(fā)了個使用擴展語言的軟件,卻不想為這個軟件專門設計一種新語言。
那么,Python 正好能滿足您的需要。.
Python 雖然簡單易用,但它可是真正的編程語言,提供了大量的數(shù)據(jù)結(jié)構(gòu),也支持開發(fā)大型程序,遠超shell腳本或批處理文件;Python 提供的錯誤檢查比C 還多;作為一種“非常高級的語言”,它內(nèi)置了靈活的數(shù)組與字典等高級數(shù)據(jù)類型。正因為配備了更通用的數(shù)據(jù)類型,Python比Awk,甚至Per1 能解決更多問題,而且,很多時候,Python 比這些語言更簡單。
Python 支持把程序分割為模塊,以便在其他 Python 程序中復用。它還內(nèi)置了大量標準模塊,作為開發(fā)程序的基礎— 您還可以把這些模塊當作學習 Python編程的實例。這些模塊包括I/0、系統(tǒng)調(diào)用、套接字,甚至還包括Tk 圖形用戶界面工作套件。
Python是一種解釋型語言,不需要編譯和鏈接,可以節(jié)省大量開發(fā)時間。它的解釋器實現(xiàn)了交互式操作,輕而易舉地就能試用各種語言功能,編寫臨時程序,或在自底向上的程序開發(fā)中測試功能。同時,它還是一個超好用的計算器。
Python 程序簡潔、易讀,通常比實現(xiàn)同種功能的 C、C++、Java 代碼短很多,原因如下:
.高級數(shù)據(jù)類型允許在單一語句中表述復雜操作;
·使用縮進,而不是括號實現(xiàn)代碼塊分組;
?無需預聲明變量或參數(shù)。
python“可以擴展”:會開發(fā) C 語言程序,就能快速上手為解釋器增加新的內(nèi)置函數(shù)或模塊,不論是讓核心程序以最高速度運行,還是把 Python 程序鏈接到只提供預編譯程序的庫(比如,硬件圖形庫)。只要下點功夫,就能把Python 解釋器和用 C 開發(fā)的應用鏈接在一起,用它來擴展和控制該應用。
順便提一句,本語言的命名源自BBC的“Monty Python 飛行馬戲團”,與爬行動物無關(guān)(Python 原義為“蟒蛇”)。歡迎大家在文檔中引用Monty Python 小品短篇集,多多益善!
現(xiàn)在,您已經(jīng)對 Python 躍躍欲試,想深入了解一些細節(jié)了吧。要知道,學習語言的最佳方式是上手實踐,建議您可以后續(xù)持續(xù)學習觀看,邊在Python 解釋器中練習。
為此小編整理了一套學習資料供給大家學習!
獲取途徑: 點贊+關(guān)注,后臺私信寫 ‘學習’ 即可領(lǐng)取!
一起關(guān)注努力進步呀!
現(xiàn)在所說的計算機基本上都是馮諾依曼體系的計算機。其核心原理:
馮·諾依曼計算的核心思想是將程序指令和數(shù)據(jù)以二進制形式存儲存儲在同一存儲器中,并使用相同的數(shù)據(jù)格式和處理方式來處理它們。這種存儲程序的設計理念使得計算機能夠以可編程的方式執(zhí)行不同的任務,而不需要對硬件進行物理修改。
在馮·諾依曼計算中,計算機由以下幾個主要組件組成:控制器、運算器、存儲器、輸入設備、輸出設備。
存儲器(Memory):用于存儲程序指令和數(shù)據(jù)。存儲器被劃分為地址單元,每個單元存儲一個字節(jié)的數(shù)據(jù)。程序和數(shù)據(jù)按照地址的順序存儲在存儲器中,并通過地址來訪問。
算術(shù)邏輯單元(Arithmetic Logic Unit,ALU)用于執(zhí)行算術(shù)和邏輯操作
控制器(Controller):協(xié)調(diào)各個組件的操作,控制指令的執(zhí)行和數(shù)據(jù)的傳輸。
輸入/輸出設備(Input/Output Devices):用于與外部世界進行交互,例如鍵盤、鼠標、顯示器、磁盤驅(qū)動器等。
由 馮諾依曼體系,我們知道程序想要執(zhí)行,必需先加載到計算機的內(nèi)存中。首先來看一下程序加載過程。這里以 Java 程序為例。
/**
* @author shengjk1
* @date 10/21/23
*/
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld!");
}
}
javac HelloWorld.java
編譯后的文件
java HelloWorld
借助 JVM 的類加載器,將 HelloWorld.Class 加載到 JVM 中
數(shù)據(jù)區(qū)包括:
指令區(qū)包括:
指令區(qū)用于存儲 Java 程序的字節(jié)碼指令。字節(jié)碼是 Java 程序的中間表示形式,由編譯器生成。JVM 在指令區(qū)中解釋和執(zhí)行字節(jié)碼指令。
如下:
#計算機#