0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計(jì)算機(jī)基礎(chǔ)知識(shí)之內(nèi)存

jf_78858299 ? 來(lái)源:前端柒八九 ? 作者:前端柒八九 ? 2023-03-31 16:14 ? 次閱讀

計(jì)算機(jī)是進(jìn)行 「數(shù)據(jù)處理」 的設(shè)備,而程序表示的就是處理順序和數(shù)據(jù)結(jié)構(gòu)。由于處理對(duì)象(數(shù)據(jù))是存儲(chǔ)在 「內(nèi)存」「磁盤(pán)」 上的,因此我們今天來(lái)聊聊內(nèi)存和磁盤(pán)。

內(nèi)存的物理機(jī)制

?內(nèi)存實(shí)際上是一種名為 「內(nèi)存IC電子元件。

?

「內(nèi)存IC」 中有 電源「地址信號(hào) 、 「數(shù)據(jù)信號(hào)」「控制信號(hào)」 等用于輸入輸出的大量 「引腳」 (IC的引腳),通過(guò)為其 「指定地址」 ,來(lái)進(jìn)行數(shù)據(jù)的讀寫(xiě)。

下圖是 「內(nèi)存IC」 的引腳配置示例。圖片

  • VCCGND是**「電源」**
  • A0~A9「地址信號(hào)」 的引腳
  • D0~D7「數(shù)據(jù)信號(hào)」 的引腳
  • RDWR「控制信號(hào)」 的引腳

將電源連接到VCCGND后,就可以給其他引腳傳遞比如01這樣的信號(hào)。大部分情況下,+5V「直流電壓」 表示1,0V表示0

  • 「數(shù)據(jù)信號(hào)」 引腳有D0~D7共8個(gè),表示 「一次可以輸入輸出8位」 (=1字節(jié))的數(shù)據(jù)。
  • 「地址信號(hào)」 引腳有A0~A9共10個(gè),表示可以指定0000000000~11111111111024個(gè)地址

由于地址用來(lái)表示數(shù)據(jù)的存儲(chǔ)場(chǎng)所,因此我們可以得出這個(gè) 「內(nèi)存IC」 可以存儲(chǔ)1024個(gè)1字節(jié)的數(shù)據(jù)。又因?yàn)?code>1024=1K,所以?xún)?nèi)存IC的容量就是1KB。

向內(nèi)存IC讀寫(xiě)數(shù)據(jù)

寫(xiě)入數(shù)據(jù)

假設(shè)我們往內(nèi)存IC中寫(xiě)入1字節(jié)的數(shù)據(jù)。

  • 可以給VCC接入+5V,給GND接入0V的電源
  • 并使用A0~A9「地址信號(hào)」 來(lái)指定**「數(shù)據(jù)的存儲(chǔ)場(chǎng)所」**
  • 然后把數(shù)據(jù)的值輸入給D0~D7的數(shù)據(jù)信號(hào)
  • 并**「把WR(write的縮寫(xiě))信號(hào)設(shè)定為1」**

執(zhí)行完這些操作,就可以在 「內(nèi)存IC」 內(nèi)部寫(xiě)入數(shù)據(jù)了。

圖片

讀取數(shù)據(jù)

在讀取數(shù)據(jù)時(shí),只需要通過(guò)A0~A9的地址信號(hào)指定數(shù)據(jù)的存儲(chǔ)場(chǎng)所,然后再 「將RD(read的縮寫(xiě))信號(hào)設(shè)成1」 即可。執(zhí)行完這些操作,指定地址中存儲(chǔ)的數(shù)據(jù)就會(huì)被輸出到D0~D7的數(shù)據(jù)信號(hào)引腳中。

圖片

WRRD這樣可以讓IC運(yùn)行的信號(hào)稱(chēng)為 「控制信號(hào)」

? 「內(nèi)存IC」 內(nèi)部有大量可以存儲(chǔ)8位數(shù)據(jù)的地方,通過(guò)地址指定這些場(chǎng)所,之后即可進(jìn)行數(shù)據(jù)的讀寫(xiě)。

?


內(nèi)存的邏輯模型

?內(nèi)存的邏輯模型是樓房

?

圖片

上圖表示的是,內(nèi)存為1KB時(shí),有1024層的樓房,每層都有1字節(jié)的數(shù)據(jù)。并且地址的值是從上往下逐漸變大的。

不過(guò),在實(shí)際的 編程環(huán)境」 下,還包含著物理內(nèi)存中不存在的概念,那就是 「數(shù)據(jù)類(lèi)型」 。在編程語(yǔ)言中的 「數(shù)據(jù)類(lèi)型」 表示存儲(chǔ)的是何種類(lèi)型的數(shù)據(jù)。從內(nèi)存來(lái)看,就是占用的內(nèi)存大?。ㄕ加械臉菍訑?shù))的意思。

?即使是 「物理」 上以1個(gè)字節(jié)位單位來(lái)逐一讀取數(shù)據(jù)的內(nèi)存,在 「程序」 中,通過(guò)指定其類(lèi)型,也能實(shí)現(xiàn)以 「特定字節(jié)數(shù)」 為單位來(lái)進(jìn)行讀寫(xiě)

?

我們通過(guò)一個(gè)具體示例來(lái)進(jìn)行說(shuō)明。

下面是一個(gè)往ab、c這三個(gè)變量中寫(xiě)入數(shù)據(jù)123C語(yǔ)言程序,

// 定義變量
char a;
short b;
long c;

// 給變量賦值
a = 123;
b = 123;
c = 123;

這3個(gè)變量表示的是內(nèi)存的特定區(qū)域。

?通過(guò)使用變量,即便不指定 「物理地址」 ,也可以在程序中對(duì)內(nèi)存進(jìn)行讀寫(xiě)。

?

這是因?yàn)?,在程序運(yùn)行時(shí)候,操作系統(tǒng)會(huì) 「自動(dòng)決定」 變量的物理地址。

在3個(gè)變量的數(shù)據(jù)類(lèi)型分別是

  • char:1字節(jié)長(zhǎng)度
  • short:2字節(jié)長(zhǎng)度
  • long:4字節(jié)長(zhǎng)度

因此,雖然同樣是數(shù)據(jù)123,存儲(chǔ)時(shí)其占據(jù)的內(nèi)存大小是不一樣的。

圖片上面的示例圖中,采用的是 「將數(shù)據(jù)低位存儲(chǔ)在內(nèi)存低位地址」 的低字節(jié)序Little Endian方式。

由此,我們可以得出一個(gè)結(jié)論: 「根據(jù)程序中所指定的變量的數(shù)據(jù)類(lèi)型的不同,讀寫(xiě)的物理內(nèi)存大小也會(huì)隨之發(fā)生變化」 。


數(shù)組是高效使用內(nèi)存的基礎(chǔ)

? 「數(shù)組」 是指多個(gè) 「同樣數(shù)據(jù)類(lèi)型」 的數(shù)據(jù)在內(nèi)存中連續(xù)排列的形式。

?

作為數(shù)組元素的各個(gè)數(shù)據(jù)會(huì)通過(guò) 「連續(xù)的編號(hào)」 被區(qū)分開(kāi)來(lái),這個(gè)編號(hào)稱(chēng)為 索引 。 「指定索引后,就可以對(duì)該索引對(duì)應(yīng)地址的內(nèi)存進(jìn)行讀寫(xiě)操作」 。

如下用C語(yǔ)言定義char類(lèi)型、short類(lèi)型、long類(lèi)型三個(gè)數(shù)組。

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

數(shù)組的定義中所指定的數(shù)據(jù)類(lèi)型,表示一次能夠讀取的內(nèi)存大小。

?數(shù)組是使用內(nèi)存的基本,因?yàn)槠渌膬?nèi)存使用技能,每一種都需要以數(shù)組為基礎(chǔ)

?

圖片


棧、隊(duì)列以及環(huán)形緩沖區(qū)

?棧和隊(duì)列,都可以不通過(guò)指定地址和索引來(lái)對(duì)數(shù)組的元素進(jìn)行讀寫(xiě)。

?

棧和隊(duì)列的區(qū)別在于 「數(shù)據(jù)出入的順序是不同的」 。在對(duì)內(nèi)存數(shù)據(jù)進(jìn)行讀寫(xiě)時(shí), 「?!?/strong> 用的LIFO(Last Input First Out, 「后入先出」 )方式,而 「隊(duì)列」 用的是FIFO(First Input First Out, 「先進(jìn)先出」 )方式。

?在內(nèi)存中 「預(yù)留」 出棧和隊(duì)列所需要的空間,并確定好寫(xiě)入和讀出的順序,就不用再指定地址和索引了

?

我們假定往棧中寫(xiě)入數(shù)據(jù)的函數(shù)名為Push,把棧中讀出數(shù)據(jù)的函數(shù)名為Pop

使用棧

// 往棧中寫(xiě)入數(shù)據(jù)
Push(123);  // 寫(xiě)入123
Push(456);  // 寫(xiě)入456
Push(789);  // 寫(xiě)入789

// 從棧中讀出數(shù)據(jù)
j = Pop();  // 讀出789
k = Pop();  // 讀出456
l = Pop();  // 讀出123

圖片

?當(dāng)我們需要 「暫時(shí)」 舍棄當(dāng)前的數(shù)據(jù),隨后再 「恢復(fù)」 原貌時(shí)候,優(yōu)先選用棧

?

使用隊(duì)列

假定往隊(duì)列中寫(xiě)入數(shù)據(jù)的函數(shù)名為EnQueue,把棧中讀出數(shù)據(jù)的函數(shù)名為DeQueue

// 往棧中寫(xiě)入數(shù)據(jù)
EnQueue(123);  // 寫(xiě)入123
EnQueue(456);  // 寫(xiě)入456
EnQueue(789);  // 寫(xiě)入789

// 從棧中讀出數(shù)據(jù)
m = DeQueue();  // 讀出123
n = DeQueue();  // 讀出456
o = DeQueue();  // 讀出789

圖片

?當(dāng)我們需要處理 「通訊」 中發(fā)送的數(shù)據(jù)時(shí),或由 「同時(shí)運(yùn)行的多個(gè)程序」 所發(fā)送過(guò)來(lái)的數(shù)據(jù)時(shí),會(huì)用到這種隊(duì)列中存儲(chǔ)的不規(guī)則數(shù)據(jù)進(jìn)行處理的方法

?

隊(duì)列一般是以環(huán)形緩沖區(qū)Ring Buffer的方式來(lái)實(shí)現(xiàn)的。

假設(shè)我們要有6個(gè)元素的數(shù)組來(lái)實(shí)現(xiàn)一個(gè)隊(duì)列。這時(shí)可以從數(shù)組的 「起始位置」 開(kāi)始有序地存儲(chǔ)數(shù)據(jù),然后再按照存儲(chǔ)時(shí)的順序數(shù)據(jù)讀出。在數(shù)組的末尾寫(xiě)入數(shù)據(jù)后,后一個(gè)數(shù)據(jù)就會(huì)被寫(xiě)入數(shù)據(jù)的起始位置(此時(shí)數(shù)據(jù)已經(jīng)被讀出所以該位置是空的)

圖片

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


鏈表

?通過(guò)使用鏈表,可以更加高效地對(duì)數(shù)組數(shù)據(jù)(元素)進(jìn)行 「追加」「刪除」 處理

?

在數(shù)組的各個(gè)元素中, 「除了數(shù)據(jù)的值之外,通過(guò)為其附帶上下一個(gè)元素的索引」 ,即可實(shí)現(xiàn)鏈表。 「數(shù)據(jù)的值和下一個(gè)元素的索引組合在一起」 ,就構(gòu)成了數(shù)組的一個(gè)元素。

圖片

由于鏈表末尾的元素沒(méi)有 「后續(xù)」 的數(shù)據(jù),因此就需要用別的值(這里是-1)來(lái)填充。

在需要追加或刪除數(shù)據(jù)的情況下,使用鏈表是很高效的。

這里,我們把之前我們針對(duì)JS鏈表相關(guān)算法的一些技巧直接遷移過(guò)來(lái)了。這里使用 「哨兵節(jié)點(diǎn)」 來(lái)對(duì)鏈表操作進(jìn)行簡(jiǎn)化處理。

? 「哨兵節(jié)點(diǎn)」 是為了簡(jiǎn)化處理鏈表 「邊界條件」 而引入的**「附加鏈表節(jié)點(diǎn)」**

?

哨兵節(jié)點(diǎn)通常位于 「鏈表的頭部」 ,它的值沒(méi)有任何意義。在一個(gè)有哨兵節(jié)點(diǎn)的鏈表中, 「從第二個(gè)節(jié)點(diǎn)開(kāi)始才真正的保存有意義的信息

追加數(shù)據(jù)

function append(head,value) {
  // 哨兵節(jié)點(diǎn) 
  let dumy = new ListNode(0);
  dumy.next = head;
  
  // 遍歷鏈表,直到鏈表尾部
  let node = dumy;
  while(node.next!=null){
    node = node.next;
  }

  node.next = new ListNode(value);
  return dumy.next;
}

首先,創(chuàng)建一個(gè) 「哨兵節(jié)點(diǎn)」 (該節(jié)點(diǎn)的 「值」 沒(méi)有意義 -即ListNode(0)參數(shù)為啥不重要),并把該節(jié)點(diǎn)當(dāng)做鏈表的頭節(jié)點(diǎn), 「把原始的鏈表添加到哨兵節(jié)點(diǎn)的后面」dumy.next = head)。

然后,返回真正的頭節(jié)點(diǎn)(哨兵節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn))node.next

這里有一個(gè)小的注意點(diǎn),就是在 「遍歷」 鏈表的時(shí)候,并不是直接對(duì)dumy進(jìn)行處理,而是用了一個(gè) 「零時(shí)游標(biāo)節(jié)點(diǎn)」 (node)。這樣做的好處就是,在append操作完成以后,還可以通過(guò)dumy節(jié)點(diǎn)來(lái),直接返回鏈表的頭節(jié)點(diǎn)dumy.next。因?yàn)?dumy一直沒(méi)參與遍歷過(guò)程。

刪除數(shù)據(jù)

?為了刪除一個(gè)節(jié)點(diǎn),需要找到被刪除節(jié)點(diǎn)的 「前一個(gè)節(jié)點(diǎn)」 ,然后把該節(jié)點(diǎn)的next指針指向它 「下一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)」 。

?

「哨兵節(jié)點(diǎn)」 ,在刪除指定節(jié)點(diǎn)

function delete(head ,value){
  let dumy = new ListNode(0);
  dumy.next = head;
  
  let node = dumy;
  while(node.next!=null){
    if(node.next.value==value){
      node.next = node.next.next;
      barek;
    }
    node = node.next;
  }
  return dumy.next;
}

通過(guò)哨兵節(jié)點(diǎn)(dumy)直接將 「鏈表為空」「被刪除節(jié)點(diǎn)是頭節(jié)點(diǎn)」 的兩種特殊情況,直接囊括了。用最少的代碼,處理最多的情況

二叉樹(shù)

「二叉樹(shù)查找樹(shù)」 是指在鏈表的基礎(chǔ)上往數(shù)組中追加元素時(shí),考慮到數(shù)據(jù)的大小關(guān)系,將其分成左右兩個(gè)方向的表現(xiàn)形式。

圖片

?二叉查找樹(shù)使 「數(shù)據(jù)搜索」 更有效。

?


?「我們這里不對(duì)具體的數(shù)據(jù)結(jié)構(gòu)進(jìn)行詳細(xì)的介紹。如果了解更多關(guān)于數(shù)據(jù)結(jié)構(gòu)的和對(duì)應(yīng)的算法的東西,可以移步到我們之前的文章中。」 總有一款適合你。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    計(jì)算機(jī)基礎(chǔ)知識(shí)

    世界上第一臺(tái)數(shù)字式電子計(jì)算機(jī)是由美國(guó)賓夕法尼亞大學(xué)的物理學(xué)家約翰 莫克利(John Mauchly)和工程師普雷斯伯 埃克特(Presper Eckert)領(lǐng)導(dǎo)研制的取名為ENIAC
    發(fā)表于 03-08 15:50

    計(jì)算機(jī)組成原理基礎(chǔ)知識(shí)

    計(jì)算機(jī)組成原理基礎(chǔ)知識(shí),前言參考:《王道計(jì)算機(jī)組成原理》學(xué)習(xí)筆記總目錄+思維導(dǎo)圖2019 王道考研 計(jì)算機(jī)組成原理第一章 計(jì)算機(jī)系統(tǒng)概述1.
    發(fā)表于 07-16 07:48

    計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識(shí)了解

    計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)復(fù)習(xí)一、 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識(shí)了解:計(jì)算機(jī)網(wǎng)絡(luò)(Internet)的發(fā)展 面向終端的計(jì)算機(jī)網(wǎng)絡(luò)(單個(gè)
    發(fā)表于 07-26 06:27

    計(jì)算機(jī)基礎(chǔ)知識(shí)點(diǎn)匯總,不看肯定后悔

    計(jì)算機(jī)基礎(chǔ)知識(shí)點(diǎn)匯總,不看肯定后悔
    發(fā)表于 11-15 06:03

    計(jì)算機(jī)基礎(chǔ)知識(shí)

    前言《MSP430單片機(jī)應(yīng)用基礎(chǔ)與實(shí)踐》(華中科技大學(xué)出版社)------第0章------計(jì)算機(jī)基礎(chǔ)知識(shí)(本文章作備忘錄使用)1.進(jìn)制轉(zhuǎn)換2.數(shù)值數(shù)據(jù)的表示3.計(jì)算機(jī)的碼制
    發(fā)表于 11-29 06:03

    計(jì)算機(jī)簡(jiǎn)介

    1計(jì)算機(jī)基礎(chǔ)知識(shí)1.計(jì)算機(jī)簡(jiǎn)介1.1計(jì)算機(jī)定義:按照一定邏輯處理數(shù)據(jù)的帶存儲(chǔ)的機(jī)器。微型,小型,大型等。2.2計(jì)算機(jī)組成分為硬件、軟件2.2
    發(fā)表于 12-23 06:45

    計(jì)算機(jī)應(yīng)用基礎(chǔ)課件

    計(jì)算機(jī)應(yīng)用基礎(chǔ)課件內(nèi)容有計(jì)算機(jī)基礎(chǔ)知識(shí)計(jì)算機(jī)鍵盤(pán)及漢字輸入,操作系統(tǒng)及使用,網(wǎng)絡(luò)基礎(chǔ)知識(shí)和Internet,電子表格軟件Excel2000
    發(fā)表于 09-25 12:30 ?0次下載
    <b class='flag-5'>計(jì)算機(jī)</b>應(yīng)用基礎(chǔ)課件

    計(jì)算機(jī)基礎(chǔ)知識(shí)

    2.1   計(jì)算機(jī)的產(chǎn)生和發(fā)展2.1.1   計(jì)算機(jī)的產(chǎn)生和發(fā)展2.1.2   我國(guó)計(jì)算機(jī)的發(fā)展情況2.1.3  
    發(fā)表于 03-10 12:12 ?0次下載

    計(jì)算機(jī)基礎(chǔ)知識(shí)選擇題

    計(jì)算機(jī)基礎(chǔ)知識(shí)選擇題 1.微型計(jì)算機(jī)是由( )、存儲(chǔ)器、輸入設(shè)備和輸出設(shè)備等部件組成的。  A. 硬盤(pán) B. 軟盤(pán) C. 鍵盤(pán) D. 運(yùn)算控制單元 2.一臺(tái)微機(jī)型號(hào)
    發(fā)表于 03-03 08:32 ?89次下載

    計(jì)算機(jī)基礎(chǔ)知識(shí)練習(xí)題

    計(jì)算機(jī)基礎(chǔ)知識(shí)練習(xí)題(一)單選題:1.計(jì)算機(jī)的描述中,( )是錯(cuò)誤的。A. 計(jì)算機(jī)是一種可供計(jì)算的機(jī)器  、B.
    發(fā)表于 03-03 08:33 ?70次下載

    計(jì)算機(jī)基礎(chǔ)知識(shí)試題

    計(jì)算機(jī)基礎(chǔ)知識(shí)試題 1、CPU的主要功能是進(jìn)行(     )。
    發(fā)表于 10-25 10:59 ?7913次閱讀

    計(jì)算機(jī)總線技術(shù)基礎(chǔ)知識(shí)

    計(jì)算機(jī)總線技術(shù)基礎(chǔ)知識(shí) 任何一個(gè)微處理器都要與一定數(shù)量的部件和外圍設(shè)備連接,但如果將各部件和每一種外圍設(shè) 備都分別用一
    發(fā)表于 05-22 08:52 ?812次閱讀

    計(jì)算機(jī)基礎(chǔ)知識(shí)介紹

    計(jì)算機(jī)基礎(chǔ)知識(shí)計(jì)算機(jī)基礎(chǔ)知識(shí)計(jì)算機(jī)基礎(chǔ)知識(shí)
    發(fā)表于 12-03 16:13 ?0次下載

    計(jì)算機(jī)測(cè)控系統(tǒng)與操作系統(tǒng)概述集合【labview基礎(chǔ)知識(shí)

    計(jì)算機(jī)測(cè)控系統(tǒng)與操作系統(tǒng)概述集合,labview基礎(chǔ)知識(shí)
    發(fā)表于 01-12 11:13 ?19次下載

    計(jì)算機(jī)控制技術(shù)的基礎(chǔ)知識(shí)點(diǎn)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是計(jì)算機(jī)控制技術(shù)的基礎(chǔ)知識(shí)點(diǎn)說(shuō)明包括了:1 計(jì)算機(jī)控制系統(tǒng)的概念,2 計(jì)算機(jī)控制系統(tǒng)的組成,3 計(jì)算機(jī)控制系統(tǒng)的分
    發(fā)表于 04-27 08:00 ?5次下載
    <b class='flag-5'>計(jì)算機(jī)</b>控制技術(shù)的<b class='flag-5'>基礎(chǔ)知識(shí)</b>點(diǎn)說(shuō)明