日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机基础知识——基础入门(一)

發(fā)布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机基础知识——基础入门(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

CPU

一、CPU是什么

二、CPU 實際做什么

三、CPU 的內(nèi)部結(jié)構(gòu)

CPU 是寄存器的集合體

四、CPU 指令執(zhí)行過程

內(nèi)存

一、什么是內(nèi)存

二、內(nèi)存的物理結(jié)構(gòu)

內(nèi)存的讀寫過程

內(nèi)存的現(xiàn)實模型

三、內(nèi)存的使用

指針

數(shù)組是內(nèi)存的實現(xiàn)

棧和隊列

鏈表

二叉樹

磁盤

認識磁盤

程序不讀入內(nèi)存就無法運行

磁盤構(gòu)件

磁盤緩存

虛擬內(nèi)存

節(jié)約內(nèi)存

通過 DLL 文件實現(xiàn)函數(shù)共有

通過調(diào)用 _stdcall 來減少程序文件的大小

磁盤的物理結(jié)構(gòu)


CPU

一、CPU是什么

CPU 的全稱是?Central Processing Unit,CPU 是計算機的核心組件,它是一種小型的計算機芯片,它嵌入在臺式機、筆記本電腦或者平板電腦的主板上。通過在單個計算機芯片上放置數(shù)十億個微型晶體管來構(gòu)建 CPU。 這些晶體管使它能夠執(zhí)行運行存儲在系統(tǒng)內(nèi)存中的程序所需的計算,也就是說 CPU 決定了你電腦的計算能力。

二、CPU 實際做什么

CPU 的核心是從程序或應(yīng)用程序獲取指令并執(zhí)行計算。此過程可以分為三個關(guān)鍵階段:提取,解碼和執(zhí)行。CPU從系統(tǒng)的 RAM 中提取指令,然后解碼該指令的實際內(nèi)容,然后再由 CPU 的相關(guān)部分執(zhí)行該指令。

RAM : 隨機存取存儲器(英語:Random Access Memory,縮寫:RAM),也叫主存,是與 CPU 直接交換數(shù)據(jù)的內(nèi)部存儲器。它可以隨時讀寫(刷新時除外),而且速度很快,通常作為操作系統(tǒng)或其他正在運行中的程序的臨時數(shù)據(jù)存儲介質(zhì)

三、CPU 的內(nèi)部結(jié)構(gòu)

說了這么多 CPU 的重要性,那么 CPU 的內(nèi)部結(jié)構(gòu)是什么呢?又是由什么組成的呢?下圖展示了一般程序的運行流程(以 C 語言為例),可以說了解程序的運行流程是掌握程序運行機制的基礎(chǔ)和前提。

在這個流程中,CPU 負責的就是解釋和運行最終轉(zhuǎn)換成機器語言的內(nèi)容。

CPU 主要由兩部分構(gòu)成:控制單元?和?算術(shù)邏輯單元(ALU)

  • 控制單元:從內(nèi)存中提取指令并解碼執(zhí)行
  • 算數(shù)邏輯單元(ALU):處理算數(shù)和邏輯運算

CPU 是計算機的心臟和大腦,它和內(nèi)存都是由許多晶體管組成的電子部件。它接收數(shù)據(jù)輸入,執(zhí)行指令并處理信息。它與輸入/輸出(I / O)設(shè)備進行通信,這些設(shè)備向 CPU 發(fā)送數(shù)據(jù)和從 CPU 接收數(shù)據(jù)。

從功能來看,CPU 的內(nèi)部由寄存器、控制器、運算器和時鐘四部分組成,各部分之間通過電信號連通。

  • 寄存器?是中央處理器內(nèi)的組成部分。它們可以用來暫存指令、數(shù)據(jù)和地址??梢詫⑵淇醋魇莾?nèi)存的一種。根據(jù)種類的不同,一個 CPU 內(nèi)部會有 20 - 100個寄存器。
  • 控制器?負責把內(nèi)存上的指令、數(shù)據(jù)讀入寄存器,并根據(jù)指令的結(jié)果控制計算機
  • 運算器?負責運算從內(nèi)存中讀入寄存器的數(shù)據(jù)
  • 時鐘?負責發(fā)出 CPU 開始計時的時鐘信號

內(nèi)存是與 CPU 進行溝通的橋梁。計算機所有程序的運行都是在內(nèi)存中運行的,內(nèi)存又被稱為主存,其作用是存放 CPU 中的運算數(shù)據(jù),以及與硬盤等外部存儲設(shè)備交換的數(shù)據(jù)。只要計算機在運行中,CPU 就會把需要運算的數(shù)據(jù)調(diào)到主存中進行運算,當運算完成后CPU再將結(jié)果傳送出來,主存的運行也決定了計算機的穩(wěn)定運行。

主存通過控制芯片與 CPU 進行相連,由可讀寫的元素構(gòu)成,每個字節(jié)(1 byte = 8 bits)都帶有一個地址編號,注意是一個字節(jié),而不是一個位。CPU 通過地址從主存中讀取數(shù)據(jù)和指令,也可以根據(jù)地址寫入數(shù)據(jù)。注意一點:當計算機關(guān)機時,內(nèi)存中的指令和數(shù)據(jù)也會被清除。

CPU 是寄存器的集合體

計算機語言

計算機聽不懂你說的話,你要想和他交流必須按照計算機指令來交換,計算機是由二進制構(gòu)成的,它只能聽的懂二進制也就是?機器語言,但是普通人是無法看懂機器語言的,這個時候就需要一種電腦既能識別,人又能理解的語言,最先出現(xiàn)的就是匯編語言。但是匯編語言晦澀難懂,所以又出現(xiàn)了像是 C,C++,Java 的這種高級語言。

所以計算機語言一般分為兩種:低級語言(機器語言,匯編語言)和高級語言。使用高級語言編寫的程序,經(jīng)過編譯轉(zhuǎn)換成機器語言后才能運行,而匯編語言經(jīng)過匯編器才能轉(zhuǎn)換為機器語言。

匯編語言

首先來看一段用匯編語言表示的代碼清單

mov eax, dword ptr [ebp-8] /* 把數(shù)值從內(nèi)存復(fù)制到 eax */ add eax, dword ptr [ebp-0Ch] /* 把 eax 的數(shù)值和內(nèi)存的數(shù)值相加 */ mov dword ptr [ebp-4], eax /* 把 eax 的數(shù)值(上一步的結(jié)果)存儲在內(nèi)存中*/

這是采用匯編語言(assembly)編寫程序的一部分。匯編語言采用?助記符(memonic)?來編寫程序,每一個原本是電信號的機器語言指令會有一個與其對應(yīng)的助記符,例如?mov,add?分別是數(shù)據(jù)的存儲(move)和相加(addition)的簡寫。匯編語言和機器語言是一一對應(yīng)的。這一點和高級語言有很大的不同,通常我們將匯編語言編寫的程序轉(zhuǎn)換為機器語言的過程稱為?匯編;反之,機器語言轉(zhuǎn)化為匯編語言的過程稱為?反匯編

匯編語言能夠幫助你理解計算機做了什么工作,機器語言級別的程序是通過寄存器來處理的,上面代碼中的?eax,ebp?都是表示的寄存器,是 CPU 內(nèi)部寄存器的名稱,所以可以說?CPU 是一系列寄存器的集合體。在內(nèi)存中的存儲通過地址編號來表示,而寄存器的種類則通過名字來區(qū)分。

不同類型的 CPU ,其內(nèi)部寄存器的種類,數(shù)量以及寄存器存儲的數(shù)值范圍都是不同的。不過,根據(jù)功能的不同,可以將寄存器劃分為下面這幾類

種類功能
累加寄存器存儲運行的數(shù)據(jù)和運算后的數(shù)據(jù)。
標志寄存器用于反應(yīng)處理器的狀態(tài)和運算結(jié)果的某些特征以及控制指令的執(zhí)行。
程序計數(shù)器程序計數(shù)器是用于存放下一條指令所在單元的地址的地方。
基址寄存器存儲數(shù)據(jù)內(nèi)存的起始位置
變址寄存器存儲基址寄存器的相對地址
通用寄存器存儲任意數(shù)據(jù)
指令寄存器儲存正在被運行的指令,CPU內(nèi)部使用,程序員無法對該寄存器進行讀寫
棧寄存器存儲棧區(qū)域的起始位置

其中程序計數(shù)器、累加寄存器、標志寄存器、指令寄存器和棧寄存器都只有一個,其他寄存器一般有多個?

四、CPU 指令執(zhí)行過程

幾乎所有的馮·諾伊曼型計算機的CPU,其工作都可以分為5個階段:取指令、指令譯碼、執(zhí)行指令、訪存取數(shù)、結(jié)果寫回

  • 取指令?階段是將內(nèi)存中的指令讀取到 CPU 中寄存器的過程,程序寄存器用于存儲下一條指令所在的地址
  • 指令譯碼?階段,在取指令完成后,立馬進入指令譯碼階段,在指令譯碼階段,指令譯碼器按照預(yù)定的指令格式,對取回的指令進行拆分和解釋,識別區(qū)分出不同的指令類別以及各種獲取操作數(shù)的方法。
  • 執(zhí)行指令?階段,譯碼完成后,就需要執(zhí)行這一條指令了,此階段的任務(wù)是完成指令所規(guī)定的各種操作,具體實現(xiàn)指令的功能。
  • 訪問取數(shù)?階段,根據(jù)指令的需要,有可能需要從內(nèi)存中提取數(shù)據(jù),此階段的任務(wù)是:根據(jù)指令地址碼,得到操作數(shù)在主存中的地址,并從主存中讀取該操作數(shù)用于運算。
  • 結(jié)果寫回?階段,作為最后一個階段,結(jié)果寫回(Write Back,WB)階段把執(zhí)行指令階段的運行結(jié)果數(shù)據(jù)“寫回”到某種存儲形式:結(jié)果數(shù)據(jù)經(jīng)常被寫到CPU的內(nèi)部寄存器中,以便被后續(xù)的指令快速地存取;

內(nèi)存

一、什么是內(nèi)存

內(nèi)存(Memory)是計算機中最重要的部件之一,它是程序與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內(nèi)存中進行的,因此內(nèi)存對計算機的影響非常大,內(nèi)存又被稱為主存,其作用是存放 CPU 中的運算數(shù)據(jù),以及與硬盤等外部存儲設(shè)備交換的數(shù)據(jù)。只要計算機在運行中,CPU 就會把需要運算的數(shù)據(jù)調(diào)到主存中進行運算,當運算完成后CPU再將結(jié)果傳送出來,主存的運行也決定了計算機的穩(wěn)定運行。

二、內(nèi)存的物理結(jié)構(gòu)

內(nèi)存的內(nèi)部是由各種IC電路組成的,它的種類很龐大,但是其主要分為三種存儲器

  • 隨機存儲器(RAM): 內(nèi)存中最重要的一種,表示既可以從中讀取數(shù)據(jù),也可以寫入數(shù)據(jù)。當機器關(guān)閉時,內(nèi)存中的信息會?丟失。
  • 只讀存儲器(ROM):ROM 一般只能用于數(shù)據(jù)的讀取,不能寫入數(shù)據(jù),但是當機器停電時,這些數(shù)據(jù)不會丟失。
  • 高速緩存(Cache):Cache 也是我們經(jīng)常見到的,它分為一級緩存(L1 Cache)、二級緩存(L2 Cache)、三級緩存(L3 Cache)這些數(shù)據(jù),它位于內(nèi)存和 CPU 之間,是一個讀寫速度比內(nèi)存更快的存儲器。當 CPU 向內(nèi)存寫入數(shù)據(jù)時,這些數(shù)據(jù)也會被寫入高速緩存中。當 CPU 需要讀取數(shù)據(jù)時,會直接從高速緩存中直接讀取,當然,如需要的數(shù)據(jù)在Cache中沒有,CPU會再去讀取內(nèi)存中的數(shù)據(jù)。

內(nèi)存 IC 是一個完整的結(jié)構(gòu),它內(nèi)部也有電源、地址信號、數(shù)據(jù)信號、控制信號和用于尋址的 IC 引腳來進行數(shù)據(jù)的讀寫。下面是一個虛擬的 IC 引腳示意圖

圖中 VCC 和 GND 表示電源,A0 - A9 是地址信號的引腳,D0 - D7 表示的是數(shù)據(jù)信號、RD 和 WR 都是控制信號,我用不同的顏色進行了區(qū)分,將電源連接到 VCC 和 GND 后,就可以對其他引腳傳遞 0 和 1 的信號,大多數(shù)情況下,+5V 表示1,0V 表示 0。

我們都知道內(nèi)存是用來存儲數(shù)據(jù),那么這個內(nèi)存 IC 中能存儲多少數(shù)據(jù)呢?D0 - D7 表示的是數(shù)據(jù)信號,也就是說,一次可以輸入輸出 8 bit = 1 byte 的數(shù)據(jù)。A0 - A9 是地址信號共十個,表示可以指定 00000 00000 - 11111 11111 共 2 的 10次方 =?1024個地址。每個地址都會存放 1 byte 的數(shù)據(jù),因此我們可以得出內(nèi)存 IC 的容量就是 1 KB。

如果我們使用的是 512 MB 的內(nèi)存,這就相當于是 512000(512 * 1000) 個內(nèi)存 IC。當然,一臺計算機不太可能有這么多個內(nèi)存 IC ,然而,通常情況下,一個內(nèi)存 IC 會有更多的引腳,也就能存儲更多數(shù)據(jù)。

內(nèi)存的讀寫過程

讓我們把關(guān)注點放在內(nèi)存 IC 對數(shù)據(jù)的讀寫過程上來吧!我們來看一個對內(nèi)存IC 進行數(shù)據(jù)寫入和讀取的模型

假設(shè)要向內(nèi)存 IC 中寫入 1byte 的數(shù)據(jù)的話,它的過程是這樣的:

  • 首先給 VCC 接通 +5V 的電源,給 GND 接通 0V 的電源,使用?A0 - A9?來指定數(shù)據(jù)的存儲場所,然后再把數(shù)據(jù)的值輸入給?D0 - D7?的數(shù)據(jù)信號,并把?WR(write)的值置為 1,執(zhí)行完這些操作后,即可以向內(nèi)存 IC 寫入數(shù)據(jù)
  • 讀出數(shù)據(jù)時,只需要通過 A0 - A9 的地址信號指定數(shù)據(jù)的存儲場所,然后再將 RD 的值置為 1 即可。
  • 圖中的 RD 和 WR 又被稱為控制信號。其中當WR 和 RD 都為 0 時,無法進行寫入和讀取操作。

內(nèi)存的現(xiàn)實模型

為了便于記憶,我們把內(nèi)存模型映射成為我們現(xiàn)實世界的模型,在現(xiàn)實世界中,內(nèi)存的模型很想我們生活的樓房。在這個樓房中,1層可以存儲一個字節(jié)的數(shù)據(jù),樓層號就是地址,下面是內(nèi)存和樓層整合的模型圖

程序中的數(shù)據(jù)不僅只有數(shù)值,還有數(shù)據(jù)類型的概念,從內(nèi)存上來看,就是占用內(nèi)存大小(占用樓層數(shù))的意思。即使物理上強制以 1 個字節(jié)為單位來逐一讀寫數(shù)據(jù)的內(nèi)存,在程序中,通過指定其數(shù)據(jù)類型,也能實現(xiàn)以特定字節(jié)數(shù)為單位來進行讀寫。

下面是一個以特定字節(jié)數(shù)為例來讀寫指令字節(jié)的程序的示例

// 定義變量 char a; short b; long c;// 變量賦值 a = 123; b = 123; c = 123;

分別聲明了三個變量 a,b,c ,并給每個變量賦上了相同的 123,這三個變量表示內(nèi)存的特定區(qū)域。通過變量,即使不指定物理地址,也可以直接完成讀寫操作,操作系統(tǒng)會自動為變量分配內(nèi)存地址。

這三個變量分別表示 1 個字節(jié)長度的 char,2 個字節(jié)長度的 short,表示4 個字節(jié)的 long。因此,雖然數(shù)據(jù)都表示的是 123,但是其存儲時所占的內(nèi)存大小是不一樣的。如下所示

這里的 123 都沒有超過每個類型的最大長度,所以 short 和 long 類型為所占用的其他內(nèi)存空間分配的數(shù)值是0,這里我們采用的是低字節(jié)序列的方式存儲

低字節(jié)序列:將數(shù)據(jù)低位存儲在內(nèi)存低位地址。

高字節(jié)序列:將數(shù)據(jù)的高位存儲在內(nèi)存地位的方式稱為高字節(jié)序列。

三、內(nèi)存的使用

指針

指針是 C 語言非常重要的特征,指針也是一種變量,只不過它所表示的不是數(shù)據(jù)的值,而是內(nèi)存的地址。通過使用指針,可以對任意內(nèi)存地址的數(shù)據(jù)進行讀寫。

在了解指針讀寫的過程前,我們先需要了解如何定義一個指針,和普通的變量不同,在定義指針時,我們通常會在變量名前加一個?*?號。例如我們可以用指針定義如下的變量

char *d; // char類型的指針 d 定義 short *e; // short類型的指針 e 定義 long *f; // long類型的指針 f 定義

我們以32位計算機為例,32位計算機的內(nèi)存地址是 4 字節(jié),在這種情況下,指針的長度也是 32 位。然而,變量 d e f 卻代表了不同的字節(jié)長度,這是為什么呢?

實際上,這些數(shù)據(jù)表示的是從內(nèi)存中一次讀取的字節(jié)數(shù),比如 d e f 的值都為 100,那么使用 char 類型時就能夠從內(nèi)存中讀寫 1 byte 的數(shù)據(jù),使用 short 類型就能夠從內(nèi)存讀寫 2 字節(jié)的數(shù)據(jù), 使用 long 就能夠讀寫 4 字節(jié)的數(shù)據(jù),下面是一個完整的類型字節(jié)表

類型32位64位
char11
short int22
int44
unsigned int44
float44
double88
long48
long long88
unsigned long48

我們可以用圖來描述一下這個讀寫過程

數(shù)組是內(nèi)存的實現(xiàn)

數(shù)組是指多個相同的數(shù)據(jù)類型在內(nèi)存中連續(xù)排列的一種形式。作為數(shù)組元素的各個數(shù)據(jù)會通過下標編號來區(qū)分,這個編號也叫做索引,如此一來,就可以對指定索引的元素進行讀寫操作。

首先先來認識一下數(shù)組,我們還是用 char、short、long 三種元素來定義數(shù)組,數(shù)組的元素用[value]?擴起來,里面的值代表的是數(shù)組的長度,就像下面的定義

char g[100]; short h[100]; long i[100];

數(shù)組定義的數(shù)據(jù)類型,也表示一次能夠讀寫的內(nèi)存大小,char 、short 、long 分別以 1 、2 、4 個字節(jié)為例進行內(nèi)存的讀寫。

數(shù)組是內(nèi)存的實現(xiàn),數(shù)組和內(nèi)存的物理結(jié)構(gòu)完全一致,尤其是在讀寫1個字節(jié)的時候,當字節(jié)數(shù)超過 1 時,只能通過逐個字節(jié)來讀取,下面是內(nèi)存的讀寫過程

棧和隊列

我們上面提到數(shù)組是內(nèi)存的一種實現(xiàn),使用數(shù)組能夠使編程更加高效,下面我們就來認識一下其他數(shù)據(jù)結(jié)構(gòu),通過這些數(shù)據(jù)結(jié)構(gòu)也可以操作內(nèi)存的讀寫。

棧(stack)是一種很重要的數(shù)據(jù)結(jié)構(gòu),棧采用 LIFO(Last In First Out)即后入先出的方式對內(nèi)存進行操作。

棧的數(shù)據(jù)結(jié)構(gòu)就是這樣,你把書籍壓入收納箱的操作叫做壓入(push),你把書籍從收納箱取出的操作叫做彈出(pop),它的模型圖大概是這樣

入棧相當于是增加操作,出棧相當于是刪除操作,只不過叫法不一樣。棧和內(nèi)存不同,它不需要指定元素的地址。它的大概使用如下

// 壓入數(shù)據(jù) Push(123); Push(456); Push(789);// 彈出數(shù)據(jù) j = Pop(); k = Pop(); l = Pop();

在棧中,LIFO 方式表示棧的數(shù)組中所保存的最后面的數(shù)據(jù)(Last In)會被最先讀取出來(First On)。

隊列

隊列和棧很相似但又不同,相同之處在于隊列也不需要指定元素的地址,不同之處在于隊列是一種?先入先出(First In First Out)?的數(shù)據(jù)結(jié)構(gòu)。隊列在我們生活中的使用很像是我們?nèi)ゾ皡^(qū)排隊買票一樣,第一個排隊的人最先買到票,以此類推,俗話說: 先到先得。它的使用如下

// 往隊列中寫入數(shù)據(jù) EnQueue(123); EnQueue(456); EnQueue(789);// 從隊列中讀出數(shù)據(jù) m = DeQueue(); n = DeQueue(); o = DeQueue();

向隊列中寫入數(shù)據(jù)稱為?EnQueue()入列,從隊列中讀出數(shù)據(jù)稱為DeQueue()

與棧相對,FIFO 的方式表示隊列中最先所保存的數(shù)據(jù)會優(yōu)先被讀取出來。

隊列的實現(xiàn)一般有兩種:順序隊列?和?循環(huán)隊列,我們上面的事例使用的是順序隊列,那么下面看一下循環(huán)隊列的實現(xiàn)方式

環(huán)形緩沖區(qū)

循環(huán)隊列一般是以環(huán)狀緩沖區(qū)(ring buffer)的方式實現(xiàn)的,它是一種用于表示一個固定尺寸、頭尾相連的緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu),適合緩存數(shù)據(jù)流。假如我們要用 6 個元素的數(shù)組來實現(xiàn)一個環(huán)形緩沖區(qū),這時可以從起始位置開始有序的存儲數(shù)據(jù),然后再按照存儲時的順序把數(shù)據(jù)讀出。在數(shù)組的末尾寫入數(shù)據(jù)后,后一個數(shù)據(jù)就會從緩沖區(qū)的頭開始寫。這樣,數(shù)組的末尾和開頭就連接了起來。

鏈表

下面我們來介紹一下鏈表和?二叉樹,它們都是可以不用考慮索引的順序就可以對元素進行讀寫的方式。通過使用鏈表,可以高效的對數(shù)據(jù)元素進行添加?和?刪除操作。而通過使用二叉樹,則可以更高效的對數(shù)據(jù)進行檢索。

在實現(xiàn)數(shù)組的基礎(chǔ)上,除了數(shù)據(jù)的值之外,通過為其附帶上下一個元素的索引,即可實現(xiàn)鏈表。數(shù)據(jù)的值和下一個元素的地址(索引)就構(gòu)成了一個鏈表元素,如下所示

對鏈表的添加和刪除都是非常高效的,我們來敘述一下這個添加和刪除的過程,假如我們要刪除地址為?p[2]?的元素,鏈表該如何變化呢?

我們可以看到,刪除地址為 p[2] 的元素后,直接將鏈表剔除,并把 p[2] 前一個位置的元素 p[1] 的指針域指向 p[2] 下一個鏈表元素的數(shù)據(jù)區(qū)即可。

那么對于新添加進來的鏈表,需要確定插入位置,比如要在 p[2] 和 p[3] 之間插入地址為?p[6]?的元素,需要將 p[6] 的前一個位置 p[2] 的指針域改為 p[6] 的地址,然后將 p[6] 的指針域改為 p[3] 的地址即可。

鏈表的添加不涉及到數(shù)據(jù)的移動,所以鏈表的添加和刪除很快,而數(shù)組的添加設(shè)計到數(shù)據(jù)的移動,所以比較慢,通常情況下,使用數(shù)組來檢索數(shù)據(jù),使用鏈表來進行添加和刪除操作。

二叉樹

二叉樹也是一種檢索效率非常高的數(shù)據(jù)結(jié)構(gòu),二叉樹是指在鏈表的基礎(chǔ)上往數(shù)組追加元素時,考慮到數(shù)組的大小關(guān)系,將其分成左右兩個方向的表現(xiàn)形式。假如我們把 50 這個值保存到了數(shù)組中,那么,如果接下來要進行值寫入的話,就需要和50比較,確定誰大誰小,比50數(shù)值大的放右邊,小的放左邊,下圖是二叉樹的比較示例

二叉樹是由鏈表發(fā)展而來,因此二叉樹在追加和刪除元素方面也是同樣有效的。

磁盤

認識磁盤

計算機的五大基礎(chǔ)部件是?存儲器、控制器、運算器、輸入和輸出設(shè)備,其中從存儲功能的角度來看,可以把存儲器分為內(nèi)存?磁盤。

磁盤和內(nèi)存都具有存儲功能,它們都是存儲設(shè)備。區(qū)別在于,內(nèi)存是通過電流?來實現(xiàn)存儲;磁盤則是通過磁記錄技術(shù)來實現(xiàn)存儲。內(nèi)存是一種高速,造假昂貴的存儲設(shè)備;而磁盤則是速度較慢、造假低廉的存儲設(shè)備;電腦斷電后,內(nèi)存中的數(shù)據(jù)會丟失,而磁盤中的數(shù)據(jù)可以長久保留。內(nèi)存是屬于內(nèi)部存儲設(shè)備,硬盤是屬于?外部存儲設(shè)備。一般在我們的計算機中,磁盤和內(nèi)存是相互配合共同作業(yè)的。

一般內(nèi)存指的就是主存(負責存儲CPU中運行的程序和數(shù)據(jù));早起的磁盤指的是軟磁盤(soft disk,簡稱軟盤

如今常用的磁盤是硬磁盤(hard disk,簡稱硬盤),就是下面這個

程序不讀入內(nèi)存就無法運行

?程序被保存在存儲設(shè)備中,通過使用 CPU 讀入來實現(xiàn)程序指令的執(zhí)行。這種機制稱為存儲程序方式,現(xiàn)在看來這種方式是理所當然的,但在以前程序的運行都是通過改變計算機的布線來讀寫指令的。

計算機最主要的存儲部件是內(nèi)存和磁盤。磁盤中存儲的程序必須加載到內(nèi)存中才能運行,在磁盤中保存的程序是無法直接運行的,這是因為負責解析和運行程序內(nèi)容的 CPU 是需要通過程序計數(shù)器來指定內(nèi)存地址從而讀出程序指令的。

磁盤構(gòu)件

磁盤緩存

磁盤往往和內(nèi)存是互利共生的關(guān)系,每次內(nèi)存都需要從磁盤中讀取數(shù)據(jù),必然會讀到相同的內(nèi)容,所以一定會有一個角色負責存儲我們經(jīng)常需要讀到的內(nèi)容。 做軟件的時候經(jīng)常會用到緩存技術(shù),那么硬件層面也不例外,磁盤也有緩存,磁盤的緩存叫做磁盤緩存。

磁盤緩存指的是把從磁盤中讀出的數(shù)據(jù)存儲到內(nèi)存的方式,這樣一來,當接下來需要讀取相同的內(nèi)容時,就不會再通過實際的磁盤,而是通過磁盤緩存來讀取。某一種技術(shù)或者框架的出現(xiàn)勢必要解決某種問題的,那么磁盤緩存就大大改善了磁盤訪問的速度。

Windows 操作系統(tǒng)提供了磁盤緩存技術(shù),不過,對于大部分用戶來說是感受不到磁盤緩存的,并且隨著計算機的演進,對硬盤的訪問速度也在不斷演進,實際上磁盤緩存到 Windows 95/98 就已經(jīng)不怎么使用了。

把低速設(shè)備的數(shù)據(jù)保存在高速設(shè)備中,需要時可以直接將其從高速設(shè)備中讀出,這種緩存方式在web中應(yīng)用比較廣泛,web 瀏覽器是通過網(wǎng)絡(luò)來獲取遠程 web 服務(wù)器的數(shù)據(jù)并將其顯示出來。因此,在讀取較大的圖片的時候,會耗費不少時間,這時 web 瀏覽器可以把獲取的數(shù)據(jù)保存在磁盤中,然后根據(jù)需要顯示數(shù)據(jù),再次讀取的時候就不用重新加載了。

虛擬內(nèi)存

虛擬內(nèi)存是內(nèi)存和磁盤交互的第二個媒介。虛擬內(nèi)存是指把磁盤的一部分作為假想內(nèi)存來使用。這與磁盤緩存是假想的磁盤(實際上是內(nèi)存)相對,虛擬內(nèi)存是假想的內(nèi)存(實際上是磁盤)。

虛擬內(nèi)存是計算機系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認為它擁有連續(xù)可用的內(nèi)存(一個完整的地址空間),但是實際上,它通常被分割成多個物理碎片,還有部分存儲在外部磁盤管理器上,必要時進行數(shù)據(jù)交換。

計算機中的程序都要通過內(nèi)存來運行,如果程序占用內(nèi)存很大,就會將內(nèi)存空間消耗殆盡。為了解決這個問題,WINDOWS 操作系統(tǒng)運用了虛擬內(nèi)存技術(shù),通過拿出一部分硬盤來當作內(nèi)存使用,來保證程序耗盡內(nèi)存仍然有可以存儲的空間。虛擬內(nèi)存在硬盤上的存在形式就是?PAGEFILE.SYS?這個頁面文件。

通過借助虛擬內(nèi)存,在內(nèi)存不足時仍然可以運行程序。例如,在只剩 5MB 內(nèi)存空間的情況下仍然可以運行 10MB 的程序。由于 CPU 只能執(zhí)行加載到內(nèi)存中的程序,因此,虛擬內(nèi)存的空間就需要和內(nèi)存中的空間進行置換(swap),然后運行程序。

虛擬內(nèi)存與內(nèi)存的交換方式

剛才我們提到虛擬內(nèi)存需要和內(nèi)存中的部分內(nèi)容做置換才可讓 CPU 繼續(xù)執(zhí)行程序,那么做置換的方式是怎樣的呢?又分為哪幾種方式呢?

虛擬內(nèi)存的方法有分頁式?和?分段式?兩種。Windows 采用的是分頁式。該方式是指在不考慮程序構(gòu)造的情況下,把運行的程序按照一定大小的頁進行分割,并以頁為單位進行置換。在分頁式中,我們把磁盤的內(nèi)容讀到內(nèi)存中稱為?Page In,把內(nèi)存的內(nèi)容寫入磁盤稱為?Page Out。Windows 計算機的頁大小為 4KB ,也就是說,需要把應(yīng)用程序按照 4KB 的頁來進行切分,以頁(page)為單位放到磁盤中,然后進行置換。

為了實現(xiàn)內(nèi)存功能,Windows 在磁盤上提供了虛擬內(nèi)存使用的文件(page file,頁文件)。該文件由 Windows 生成和管理,文件的大小和虛擬內(nèi)存大小相同,通常大小是內(nèi)存的 1 - 2 倍。

節(jié)約內(nèi)存

Windows 是以圖形界面為基礎(chǔ)的操作系統(tǒng)。它的前身是?MS-DOC,最初的版本可以在 128kb 的內(nèi)存上運行程序,但是現(xiàn)在想要 Windows 運行流暢的花至少要需要 512MB 的內(nèi)存,但通常往往是不夠的。

也許許多人認為可以使用虛擬內(nèi)存來解決內(nèi)存不足的情況,而虛擬內(nèi)存確實能夠在內(nèi)存不足的時候提供補充,但是使用虛擬內(nèi)存的 Page In 和 Page Out 通常伴隨著低速的磁盤訪問,這是一種得不償失的表現(xiàn)。所以虛擬內(nèi)存無法從根本上解決內(nèi)存不足的情況。

為了從根本上解決內(nèi)存不足的情況,要么是增加內(nèi)存的容量,加內(nèi)存條;要么是優(yōu)化應(yīng)用程序,使其盡可能變小。第一種建議往往需要衡量口袋的銀子,所以我們只關(guān)注第二種情況。

注意:以下的篇幅會涉及到 C 語言的介紹,是每個程序員(不限語言)都需要知道和了解的知識。

通過 DLL 文件實現(xiàn)函數(shù)共有

DLL(Dynamic Link Library)文件,是一種動態(tài)鏈接庫?文件,顧名思義,是在程序運行時可以動態(tài)加載?Library(函數(shù)和數(shù)據(jù)的集合)的文件。此外,多個應(yīng)用可以共有同一個 DLL 文件。而通過共有一個 DLL 文件則可以達到節(jié)約內(nèi)存的效果。

例如,假設(shè)我們編寫了一個具有某些處理功能的函數(shù)?MyFunc()。應(yīng)用 A 和 應(yīng)用 B 都需要用到這個函數(shù),然后在各自的應(yīng)用程序中內(nèi)置 MyFunc()(這個稱為Static Link,靜態(tài)鏈接)后同時運行兩個應(yīng)用,內(nèi)存中就存在了同一個函數(shù)的兩個程序,這會造成資源浪費。

為了改變這一點,使用 DLL 文件而不是應(yīng)用程序的執(zhí)行文件(EXE文件)。因為同一個 DLL 文件內(nèi)容在運行時可以被多個應(yīng)用共有,因此內(nèi)存中存在函數(shù) MyFunc()的程序就只有一個

Windows 操作系統(tǒng)其實就是無數(shù)個 DLL 文件的集合體。有些應(yīng)用在安裝時,DLL文件也會被追加。應(yīng)用程序通過這些 DLL 文件來運行,既可以節(jié)約內(nèi)存,也可以在不升級 EXE 文件的情況下,通過升級 DLL 文件就可以完成更新。

通過調(diào)用 _stdcall 來減少程序文件的大小

通過調(diào)用?_stdcall?來減小程序文件的方法,是用 C 語言編寫應(yīng)用時可以利用的高級技巧。我們來認識一下什么是 _stdcall。

_stdcall 是?standard call(標準調(diào)用)的縮寫。Windows 提供的 DLL 文件內(nèi)的函數(shù),基本上都是通過 _stdcall 調(diào)用方式來完成的,這主要是為了節(jié)約內(nèi)存。另一方面,用 C 語言編寫的程序默認都不是 _stdcall 。C 語言特有的調(diào)用方式稱為?C 調(diào)用。C 語言默認不使用 _stdcall 的原因是因為 C 語言所對應(yīng)的函數(shù)傳入?yún)?shù)是可變的,只有函數(shù)調(diào)用方才能知道到底有多少個參數(shù),在這種情況下,棧的清理作業(yè)便無法進行。不過,在 C 語言中,如果函數(shù)的參數(shù)和數(shù)量固定的話,指定 _stdcall 是沒有任何問題的。

C 語言和 Java 最主要的區(qū)別之一在于 C 語言需要人為控制釋放內(nèi)存空間

C 語言中,在調(diào)用函數(shù)后,需要人為執(zhí)行棧清理指令。把不需要的數(shù)據(jù)從接收和傳遞函數(shù)的參數(shù)時使用的內(nèi)存上的棧區(qū)域中清理出去的操作叫做?棧清理處理

例如如下代碼

// 函數(shù)調(diào)用方 void main(){int a;a = MyFunc(123,456); }// 被調(diào)用方 int MyFunc(int a,int b){... }

代碼中,從 main 主函數(shù)調(diào)用到 MyFunc() 方法,按照默認的設(shè)定,棧的清理處理會附加在 main 主函數(shù)這一方。在同一個程序中,有可能會多次調(diào)用,導(dǎo)致 MyFunc() 會進行多次清理,這就會造成內(nèi)存的浪費。

匯編之后的代碼如下

push 1C8h // 將參數(shù) 456( = 1C8h) 存入棧中 push 7Bh // 將參數(shù) 123( = 7Bh) 存入棧中 call @LTD+15 (MyFunc)(00401014) // 調(diào)用 MyFunc 函數(shù) add esp,8 // 運行棧清理

C 語言通過棧來傳遞函數(shù)的參數(shù),使用?push?是往棧中存入數(shù)據(jù)的指令,pop?是從棧中取出數(shù)據(jù)的指令。32 位 CPU 中,1次 push 指令可以存儲 4 個字節(jié)(32 位)的數(shù)據(jù)。上述代碼由于進行了兩次 push 操作,所以存儲了 8 字節(jié)的數(shù)據(jù)。通過?call?指令來調(diào)用函數(shù),調(diào)用完成后,棧中存儲的數(shù)據(jù)就不再需要了。于是就通過 add esp,8 這個指令,使存儲著棧數(shù)據(jù)的 esp 寄存器前進 8 位(設(shè)定為指向高 8 位字節(jié)的地址),來進行數(shù)據(jù)清理。由于棧是在各種情況下都可以利用的內(nèi)存領(lǐng)域,因此使用完畢后有必要將其恢復(fù)到原始狀態(tài)。上述操作就是執(zhí)行棧的清理工作。另外,在 C 語言中,函數(shù)的返回值,是通過寄存器而非棧來返回的。

棧執(zhí)行清理工作,在調(diào)用方法處執(zhí)行清理工作和在反復(fù)調(diào)用方法處執(zhí)行清理工作不同,使用?_stdcall?標準調(diào)用的方式稱為反復(fù)調(diào)用方法,在這種情況下執(zhí)行棧清理開銷比較小。

磁盤的物理結(jié)構(gòu)

之前我們介紹了CPU、內(nèi)存的物理結(jié)構(gòu),現(xiàn)在我們來介紹一下磁盤的物理結(jié)構(gòu)。磁盤的物理結(jié)構(gòu)指的是磁盤存儲數(shù)據(jù)的形式。

磁盤是通過其物理表面劃分成多個空間來使用的。劃分的方式有兩種:可變長方式?和?扇區(qū)方式。前者是將物理結(jié)構(gòu)劃分成長度可變的空間,后者是將磁盤結(jié)構(gòu)劃分為固定長度的空間。一般 Windows 所使用的硬盤和軟盤都是使用扇區(qū)這種方式。扇區(qū)中,把磁盤表面分成若干個同心圓的空間就是?磁道,把磁道按照固定大小的存儲空間劃分而成的就是?扇區(qū)

扇區(qū)是對磁盤進行物理讀寫的最小單位。Windows 中使用的磁盤,一般是一個扇區(qū) 512 個字節(jié)。不過,Windows 在邏輯方面對磁盤進行讀寫的單位是扇區(qū)整數(shù)倍簇。根據(jù)磁盤容量不同功能,1簇可以是 512 字節(jié)(1 簇 = 1扇區(qū))、1KB(1簇 = 2扇區(qū))、2KB、4KB、8KB、16KB、32KB( 1 簇 = 64 扇區(qū))。簇和扇區(qū)的大小是相等的。

不管是硬盤還是軟盤,不同的文件是不能存儲在同一簇中的,否則就會導(dǎo)致只有一方的文件不能刪除。所以,不管多小的文件,都會占用 1 簇的空間。這樣一來,所有的文件都會占用 1 簇的整數(shù)倍的空間。

我們使用軟盤做實驗會比較簡單一些,我們先對軟盤進行格式化。

接下來,我們保存一個?txt?文件,并在文件輸入一個字符,這時候文件其實只占用了一個字節(jié),但是我們看一下磁盤的屬性卻占用了 512 字節(jié)

然后我們繼續(xù)寫入一些東西,當文件大小到達 512 個字節(jié)時,已用空間也是 512 字節(jié),但是當我們繼續(xù)寫入一個字符時,我們點開屬性會發(fā)現(xiàn)磁盤空間會變?yōu)?1024 個字節(jié)(= 2 簇),通過這個實驗我們可以證明磁盤是以簇為單位來保存的。

總結(jié)

以上是生活随笔為你收集整理的计算机基础知识——基础入门(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美日韩天堂 | 一区二区三区视频免费视 | 色多多视频污 | 国产视频在线免费观看 | 色呦呦免费观看 | 国产伦精品一区二区三区四区 | 男同激情视频 | 亚洲精品成av人片天堂无码 | 可以免费观看av的网站 | 成人精品网址 | 九九av在线 | 国产精品骚 | 国产精选在线 | 久久精品国产熟女亚洲AV麻豆 | 久久免费av | 欧美理伦少妇2做爰 | 91av影视| 一区二区三区啪啪啪 | 欧美午夜一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 亚洲无人区码一码二码三码的含义 | 日本午夜三级 | 在线高清观看免费观看 | 农村末发育av片一区二区 | 亚洲一二三四在线 | 校园伸入裙底揉捏1v1h | av免费国产| 麻豆视频在线免费看 | 又大又硬又爽免费视频 | 婷婷成人综合网 | 欧美成人免费观看视频 | 美女av毛片 | 性色av蜜臀av色欲av | 精品在线一区二区 | av福利网 | www.日本高清| 日韩在线精品视频一区二区涩爱 | 欧美日韩aaa | 操bbbbb | 91在线无精精品白丝 | 在线看欧美 | 白浆影院| 久草蜜桃 | 国产精品一色哟哟哟 | www视频免费观看 | 岛国精品在线观看 | 国精产品一区二区三区 | 欧美理伦片在线播放 | 欧美性生交xxxxx久久久 | 免费国产a| 亚洲制服一区 | 二级黄色录像 | 免费观看在线视频 | 午夜精品久久久久久久四虎美女版 | 在线免费观看一区二区 | 懂色aⅴ一区二区三区免费 国产精品99在线观看 | 美腿丝袜一区二区三区 | 亚洲高清视频一区 | 国产在线最新 | 国产视频网 | 欧美偷拍精品 | 精品一区二区视频 | 欧美大片xxx| 日韩av在线看 | 国产老妇伦国产熟女老妇视频 | 青青偷拍视频 | 精品动漫一区 | 成人黄色一级视频 | 91在线一区二区三区 | 国产视频69| 浪荡奴双性跪着伺候 | 污片在线观看 | 国产精品久久久久久久久夜色 | 免费看成人aa片无码视频羞羞网 | 色呦呦一区二区 | 成人片网址 | 精品国产乱码久久久久久88av | 永久免费的av网站 | 午夜视频在线免费观看 | 丁香花在线影院观看在线播放 | 久久久ww| 欧美高清性xxxxhd | 欧美精品一区二区免费 | 日韩欧美中文字幕一区 | 91九色国产在线 | 国产一区二区三区 | 无码精品视频一区二区三区 | 国产精品成人免费看片 | 伊人网影院 | 久草免费在线观看视频 | 欧美成人dvd在线视频 | 亚洲AV成人无码久久精品同性 | 神马午夜av | 怡红院精品视频 | 国产亚洲精品电影 | 日本少妇激情视频 | 欧美 日韩 成人 | 天天综合网永久 | 综合色在线 |