天天日夜夜添_精品国产99久久久久久人裸体 _成人app在线观看_日韩色网站

新聞資訊

    . 問題

    當我們運行Office Word的時候,雙擊就可以了。 由于軟件是安裝在硬盤上的,雙擊的時候,操作系統(tǒng)會根據(jù)文件路徑找到exe程序在硬盤的位置,控制其代碼從硬盤加載到內(nèi)存,然后控制cpu從內(nèi)存中讀取剛剛讀入內(nèi)存的應用程序的代碼執(zhí)行,應用程序完成啟動。即:一個程序開始的第一條指令存放的位置是由操作系統(tǒng)掌控的。那它是怎么完成程序的執(zhí)行的呢?

    要想清楚的了解程序的執(zhí)行過程就要先知道計算機的基本結(jié)構(gòu)

    2. 圖靈和圖靈機

    阿蘭·圖靈于1912年出生于英國,擅長數(shù)理邏輯學和計算理論。

    阿蘭.圖靈

    圖靈機是阿蘭·圖靈在24歲時提出的,發(fā)表在論文《論可計算數(shù)及其在判定問題中的應用》。圖靈的基本思想是用機器來模擬人們用紙筆進行數(shù)學運算的過程,而且還定義了計算機由哪些部分組成,程序又是如何執(zhí)行的。

    圖靈機長什么樣子呢?示意圖如下:

    基本組成部分:

    • 「紙帶」:紙帶由一個個連續(xù)的格子組成,每個格子可以寫入字符,紙帶就好比內(nèi)存,而紙帶上的格子的字符就好比內(nèi)存中的數(shù)據(jù)或程序;
    • 「讀寫頭」:讀寫頭可以順序讀取紙帶上格子的字符,也可以把字符寫入到紙帶的格子;
    • 讀寫頭部件:如存儲單元、控制單元以及運算單元:1、存儲單元用于存放數(shù)據(jù);2、控制單元用于識別字符是數(shù)據(jù)還是指令,以及控制程序的流程等;3、運算單元用于執(zhí)行運算指令;

    圖靈機只是一個抽象的模型,這個理想的模型是好,但是理想終歸是理想,想要成為現(xiàn)實,我們得想其它辦法。于是在此基礎上,馮洛伊曼提出了電子計算機使用二進制數(shù)制系統(tǒng)和儲存程序,并按照程序順序執(zhí)行,即馮諾依曼體系結(jié)構(gòu)。

    3. 馮諾依曼模型

    在 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)存、中央處理器、總線、輸入輸出設備。

    3.1. 內(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ù)量少,集成度高,應用廣泛。

    3.2. 中央處理器

    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 里,還緊挨著控制單元和邏輯運算單元,自然計算時速度會很快。

    常見的寄存器種類:

    • 通用寄存器,用來存放需要進行運算的數(shù)據(jù),比如需要進行加和運算的兩個數(shù)據(jù)。
    • 程序計數(shù)器,用來存儲 CPU 要執(zhí)行下一條指令「所在的內(nèi)存地址」,注意不是存儲了下一條要執(zhí)行的指令,此時指令還在內(nèi)存中,程序計數(shù)器只是存儲了下一條指令「的地址」。
    • 指令寄存器,用來存放當前正在執(zhí)行的指令,也就是指令本身,指令被執(zhí)行完成之前,指令都存儲在這里。

    3.3. 總線

    總線(Bus),是指計算機設備和設備之間傳輸信息的公共數(shù)據(jù)通道。在城市中,車輛通行需要道路,需要交通。在計算機中,同樣需要在各部件之間傳輸信息的通路,信息通過電線束從一個計算機部件到另一個部件,就稱作總線,它是一種信號傳遞的布線方式。總線是用于 CPU 和內(nèi)存以及其他設備之間的通信,總線按照不同的分類標準可以有不同的分類。按照傳遞的數(shù)據(jù)分可分為 3 種:

    • 地址總線,用于指定 CPU 將要操作的內(nèi)存地址;
    • 數(shù)據(jù)總線,用于讀寫內(nèi)存的數(shù)據(jù);
    • 控制總線,用于發(fā)送和接收信號,比如中斷、設備復位等信號,CPU 收到信號后自然進行響應,這時也需要控制總線;

    當 CPU 要讀寫內(nèi)存數(shù)據(jù)的時候,一般需要通過下面這三個總線:

    • 首先要通過「地址總線」來指定內(nèi)存的地址;
    • 然后通過「控制總線」控制是讀或?qū)懨睿?/span>
    • 最后通過「數(shù)據(jù)總線」來傳輸數(shù)據(jù);

    按照在計算機所在區(qū)域分:內(nèi)部總線,系統(tǒng)總線,外部總線。按實現(xiàn)方式分:并行總線,串行總線。

    3.4. 輸入、輸出設備

    輸入輸出設備(IO設備),是數(shù)據(jù)處理系統(tǒng)的關(guān)鍵外部設備之一,可以和計算機本體進行交互使用。輸入設備向計算機輸入數(shù)據(jù),計算機經(jīng)過計算后,把數(shù)據(jù)輸出給輸出設備。期間,如果輸入設備是鍵盤,按下按鍵時是需要和 CPU 進行交互的,這時就需要用到控制總線了。

    4. 線路位寬與 CPU 位寬

    我們經(jīng)常聽到32位或64位計算機,32 位和 64 位 CPU 最主要區(qū)別在于一次能計算多少字節(jié)數(shù)據(jù):

    • 32 位 CPU 一次可以計算 4 個字節(jié);
    • 64 位 CPU 一次可以計算 8 個字節(jié);

    這里的 32 位和 64 位,通常稱為 CPU 的位寬。

    線路位寬:數(shù)據(jù)是如何通過線路傳輸?shù)哪兀科鋵嵤峭ㄟ^操作電壓,低電壓表示 0,高壓電壓則表示 1。為了避免低效率的串行傳輸?shù)姆绞剑?/span>線路的位寬最好一次就能訪問到所有的內(nèi)存地址

    CPU 要操作的內(nèi)存地址空間就需要相應的地址總線:

    • 如果地址總線只有 1 條,那每次只能表示 「0 或 1」這兩種地址,所以 CPU 能操作的內(nèi)存地址最大數(shù)量為 2(2^1)個(注意,不要理解成同時能操作 2 個內(nèi)存地址);
    • 如果地址總線有 2 條,那么能表示 00、01、10、11 這四種地址,所以 CPU 能操作的內(nèi)存地址最大數(shù)量為 4(2^2)個。

    那么,想要 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。

    5. 一個程序的生與死

    程序?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。

    具體含義:

    • R 指令:用在算術(shù)和邏輯操作,里面有讀取和寫入數(shù)據(jù)的寄存器地址。如果是邏輯位移操作,后面還有位移操作的「位移量」,而最后的「功能碼」則是再前面的操作碼不夠的時候,擴展操作碼來表示對應的具體指令的;
    • I 指令:用在數(shù)據(jù)傳輸、條件分支等。這個類型的指令,就沒有了位移量和功能碼,也沒有了第三個寄存器,而是把這三部分直接合并成了一個地址值或一個常數(shù);
    • J 指令:用在跳轉(zhuǎn),高 6 位之外的 26 位都是一個跳轉(zhuǎn)后的地址;

    編譯器在編譯程序的時候,會構(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上的高速緩存

    • 最高速的緩存是CPU的寄存器,它們和CPU的材料相同,最靠近CPU或最接近CPU,訪問它們沒有時延(<1ns)。但容量很小,小于1kb。32bit:32*32比特=128字節(jié),64bit:64*64比特=512字節(jié)
    • 寄存器之下,是CPU的高速緩存。分為L1緩存、L2緩存、L3緩存,每層速度按數(shù)量級遞減、容量也越來越大

    指令的類型

    指令從功能角度分為 5 大類:

    • 數(shù)據(jù)傳輸:比如 store/load 是寄存器與內(nèi)存間數(shù)據(jù)傳輸?shù)闹噶睿琺ov 是將一個內(nèi)存地址的數(shù)據(jù)移動到另一個內(nèi)存地址的指令;
    • 運算類型:比如加減乘除、位運算、比較大小等等,它們是二元運算;
    • 跳轉(zhuǎn)類型:通過修改程序計數(shù)器的值來達到跳轉(zhuǎn)執(zhí)行指令的過程,比如編程中常見的 if-else、switch-case、goto函數(shù)調(diào)用等。
    • 信號類型:比如發(fā)生中斷的指令 trap;
    • 閑置類型:比如指令 nop,執(zhí)行后 CPU 會空轉(zhuǎn)一個周期;

    指令的執(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)化這三者即可:

    • 指令數(shù),表示執(zhí)行程序所需要多少條指令,以及哪些指令。這個依賴編譯器的優(yōu)化。
    • 每條指令的平均時鐘周期數(shù) CPI,表示一條指令需要多少個時鐘周期數(shù),現(xiàn)代大多數(shù) CPU 通過流水線技術(shù)(Pipeline),讓一條指令需要的 CPU 時鐘周期數(shù)盡可能的少;
    • 時鐘周期時間,表示計算機主頻,取決于計算機硬件。

    當我們輸入以下程序,編譯運行,計算機從屏幕輸出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í)行文件。各個部分完成的具體工作如下:

    • 預處理器:根據(jù)以#開頭的命令,將包含的頭文件加載進入源程序源程序。預處理器是一個文本處理程序,它在程序編譯的第一個階段處理源代碼的文本。當然預處理器不只是編譯之前才被調(diào)用處理源代碼,它也可以被其他程序單獨的調(diào)用以實現(xiàn)文本的處理。
    • 編譯器:將預處理后的.i文件轉(zhuǎn)換成匯編程序。編譯器將不同的高級語言(如c語言,C++語言)轉(zhuǎn)換成嚴格一致的匯編語言格式進行輸出。匯編語言以標準的文本格式確切的描述每機器語言指令。編譯器得到的文件通常以.s為后綴保存。
    • 匯編器:將匯編語言(.s文件)翻譯成機器語言指令,并將這些指令打包成一種可定位目標程序格式。匯編后得到的文件即為二進制文件,通常以.o為后綴。
    • 鏈接器:Hello, World程序中調(diào)用過printf函數(shù),它是一個c標準庫里的函數(shù)。Printf函數(shù)存放在一個名為printf.o的單獨預編譯的文件中。而這個文件必須以適當?shù)姆绞讲⑷氲轿覀兊某绦蛑校@個工作由鏈接器完成。將外部的.o文件并入后,得到一個完整的hello, world可執(zhí)行文件。可執(zhí)行文件加載到存儲器后,由系統(tǒng)復制執(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中的主要寄存器:

    • 累加寄存器(AC) :主要進行加法運算。
    • 標志寄存器(PSW) :記錄狀態(tài),做邏輯運算。
    • 程序計數(shù)器(PC) :是用于存放下一條指令所在單元的地址的地方。
    • 基質(zhì)寄存器(BX) :儲存當前數(shù)據(jù)內(nèi)存開始的位置。
    • 變址寄存器 :儲存基質(zhì)寄存器的相對位置。
    • 通用寄存器(GPRs) :支持有所的用法。
    • 指令寄存器(IR) :CPU專用,儲存指令。
    • 堆棧寄存器(SP) :記錄堆棧的起始位置。

    處理器讀取并解釋存儲在存儲器中的指令處理器的操作主要是圍繞程序計數(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 程序為例。

    1. 在IDE或者文本編輯器中寫 java 程序,如:
    /**
     * @author shengjk1
     * @date 10/21/23
     */
    public class HelloWorld {
       public static void main(String[] args) {
          System.out.println("HelloWorld!");
       }
    }
    1. 編譯,編譯成 Java 二進制的字節(jié)碼

    javac HelloWorld.java


    編譯后的文件

    1. 加載 JVM 中并執(zhí)行

    java HelloWorld

    借助 JVM 的類加載器,將 HelloWorld.Class 加載到 JVM 中

    1. JVM 的內(nèi)存區(qū)域會分為兩種:數(shù)據(jù)區(qū)和指令區(qū)

    數(shù)據(jù)區(qū)包括:

    • 堆(Heap):堆是 Java 程序運行時動態(tài)分配對象的區(qū)域。所有通過 new 關(guān)鍵字創(chuàng)建的對象都存儲在堆中。堆是 JVM 中最大的一塊內(nèi)存區(qū)域,被所有線程共享。
    • 方法區(qū)(Method Area):方法區(qū)用于存儲類的元數(shù)據(jù)信息,包括類的結(jié)構(gòu)、常量池、靜態(tài)變量、編譯器優(yōu)化后的代碼等。方法區(qū)也被稱為永久代(Permanent Generation)或元空間(Metaspace)。
    • 棧(Stack):棧用于存儲方法執(zhí)行時的局部變量、方法參數(shù)、方法調(diào)用和返回的信息。每個線程在運行時都有自己的棧,稱為線程棧。棧的大小是固定的,并且棧中的數(shù)據(jù)是按照后進先出(LIFO)的順序進行操作。
    • 本地方法棧(Native Method Stack):本地方法棧類似于棧,但用于執(zhí)行本地方法(Native Method)的數(shù)據(jù)和調(diào)用信息。
    • PC 寄存器(Program Counter Register):PC 寄存器存儲著當前線程執(zhí)行的字節(jié)碼指令地址。當線程切換時,PC 寄存器的值會保存和恢復。

    指令區(qū)包括:

    指令區(qū)用于存儲 Java 程序的字節(jié)碼指令。字節(jié)碼是 Java 程序的中間表示形式,由編譯器生成。JVM 在指令區(qū)中解釋和執(zhí)行字節(jié)碼指令。

    如下:

    程序在計算機中如何執(zhí)行

    1. 程序計數(shù)器(Program Counter,PC)的初始化:JVM通過將程序計數(shù)器(PC)的值設置為程序的入口點( 通常就是main方法 )來初始化。程序計數(shù)器是一個特殊的寄存器,它存儲下一條要執(zhí)行的指令的地址。
    2. 取指:CPU根據(jù)程序計數(shù)器中存儲的地址,從存儲器中獲取下一條要執(zhí)行的指令。
    3. 譯碼:CPU對獲取的指令進行解碼,確定其操作類型和所需的操作數(shù)。
    4. 操作數(shù)獲取:如果指令需要操作數(shù),CPU從存儲器或寄存器中獲取操作數(shù)的值。指令中的地址或寄存器標識符確定操作數(shù)的位置。
    5. 執(zhí)行:CPU根據(jù)指令的操作類型和操作數(shù)執(zhí)行相應的操作。這可能涉及算術(shù)運算、邏輯運算、內(nèi)存訪問等。
    6. 結(jié)果存儲:執(zhí)行操作后,CPU將結(jié)果存儲在存儲器或寄存器中,以供后續(xù)指令使用或輸出到外部設備。
    7. 更新程序計數(shù)器:CPU根據(jù)指令的執(zhí)行情況更新程序計數(shù)器的值,以指示下一條要執(zhí)行的指令的地址。
    8. 重復執(zhí)行:重復執(zhí)行第2步到第7步,直到程序的所有指令都被執(zhí)行完畢。這樣,程序中的指令按照順序逐條執(zhí)行,實現(xiàn)了整個程序的功能。





    #計算機#

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有