<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

計算機基礎知識之內存

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

計算機是進行 「數據處理」 的設備,而程序表示的就是處理順序和數據結構。由于處理對象(數據)是存儲在 「內存」「磁盤」 上的,因此我們今天來聊聊內存和磁盤。

內存的物理機制

?內存實際上是一種名為 「內存IC電子元件。

?

「內存IC」 中有 電源 、 「地址信號 、 「數據信號」 、 「控制信號」 等用于輸入輸出的大量 「引腳」 (IC的引腳),通過為其 「指定地址」 ,來進行數據的讀寫。

下圖是 「內存IC」 的引腳配置示例。圖片

  • VCCGND是**「電源」**
  • A0~A9「地址信號」 的引腳
  • D0~D7「數據信號」 的引腳
  • RDWR「控制信號」 的引腳

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

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

由于地址用來表示數據的存儲場所,因此我們可以得出這個 「內存IC」 可以存儲1024個1字節的數據。又因為1024=1K,所以內存IC的容量就是1KB。

向內存IC讀寫數據

寫入數據

假設我們往內存IC中寫入1字節的數據。

  • 可以給VCC接入+5V,給GND接入0V的電源
  • 并使用A0~A9「地址信號」 來指定**「數據的存儲場所」**
  • 然后把數據的值輸入給D0~D7的數據信號
  • 并**「把WR(write的縮寫)信號設定為1」**

執行完這些操作,就可以在 「內存IC」 內部寫入數據了。

圖片

讀取數據

在讀取數據時,只需要通過A0~A9的地址信號指定數據的存儲場所,然后再 「將RD(read的縮寫)信號設成1」 即可。執行完這些操作,指定地址中存儲的數據就會被輸出到D0~D7的數據信號引腳中。

圖片

WRRD這樣可以讓IC運行的信號稱為 「控制信號」 。

? 「內存IC」 內部有大量可以存儲8位數據的地方,通過地址指定這些場所,之后即可進行數據的讀寫。

?


內存的邏輯模型

?內存的邏輯模型是樓房

?

圖片

上圖表示的是,內存為1KB時,有1024層的樓房,每層都有1字節的數據。并且地址的值是從上往下逐漸變大的。

不過,在實際的 編程環境」 下,還包含著物理內存中不存在的概念,那就是 「數據類型」 。在編程語言中的 「數據類型」 表示存儲的是何種類型的數據。從內存來看,就是占用的內存大?。ㄕ加械臉菍訑担┑囊馑?。

?即使是 「物理」 上以1個字節位單位來逐一讀取數據的內存,在 「程序」 中,通過指定其類型,也能實現以 「特定字節數」 為單位來進行讀寫

?

我們通過一個具體示例來進行說明。

下面是一個往a、b、c這三個變量中寫入數據123C語言程序,

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

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

這3個變量表示的是內存的特定區域。

?通過使用變量,即便不指定 「物理地址」 ,也可以在程序中對內存進行讀寫。

?

這是因為,在程序運行時候,操作系統「自動決定」 變量的物理地址。

在3個變量的數據類型分別是

  • char:1字節長度
  • short:2字節長度
  • long:4字節長度

因此,雖然同樣是數據123,存儲時其占據的內存大小是不一樣的。

圖片上面的示例圖中,采用的是 「將數據低位存儲在內存低位地址」 的低字節序Little Endian方式。

由此,我們可以得出一個結論: 「根據程序中所指定的變量的數據類型的不同,讀寫的物理內存大小也會隨之發生變化」 。


數組是高效使用內存的基礎

? 「數組」 是指多個 「同樣數據類型」 的數據在內存中連續排列的形式。

?

作為數組元素的各個數據會通過 「連續的編號」 被區分開來,這個編號稱為 索引 。 「指定索引后,就可以對該索引對應地址的內存進行讀寫操作」 。

如下用C語言定義char類型、short類型、long類型三個數組。

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

數組的定義中所指定的數據類型,表示一次能夠讀取的內存大小。

?數組是使用內存的基本,因為其他的內存使用技能,每一種都需要以數組為基礎

?

圖片


棧、隊列以及環形緩沖區

?棧和隊列,都可以不通過指定地址和索引來對數組的元素進行讀寫。

?

棧和隊列的區別在于 「數據出入的順序是不同的」 。在對內存數據進行讀寫時, 「?!?/strong> 用的LIFO(Last Input First Out, 「后入先出」 )方式,而 「隊列」 用的是FIFO(First Input First Out, 「先進先出」 )方式。

?在內存中 「預留」 出棧和隊列所需要的空間,并確定好寫入和讀出的順序,就不用再指定地址和索引了

?

我們假定往棧中寫入數據的函數名為Push,把棧中讀出數據的函數名為Pop

使用棧

// 往棧中寫入數據
Push(123);  // 寫入123
Push(456);  // 寫入456
Push(789);  // 寫入789

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

圖片

?當我們需要 「暫時」 舍棄當前的數據,隨后再 「恢復」 原貌時候,優先選用棧

?

使用隊列

假定往隊列中寫入數據的函數名為EnQueue,把棧中讀出數據的函數名為DeQueue

// 往棧中寫入數據
EnQueue(123);  // 寫入123
EnQueue(456);  // 寫入456
EnQueue(789);  // 寫入789

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

圖片

?當我們需要處理 「通訊」 中發送的數據時,或由 「同時運行的多個程序」 所發送過來的數據時,會用到這種隊列中存儲的不規則數據進行處理的方法

?

隊列一般是以環形緩沖區Ring Buffer的方式來實現的。

假設我們要有6個元素的數組來實現一個隊列。這時可以從數組的 「起始位置」 開始有序地存儲數據,然后再按照存儲時的順序數據讀出。在數組的末尾寫入數據后,后一個數據就會被寫入數據的起始位置(此時數據已經被讀出所以該位置是空的)

圖片

環形緩沖區的模型


鏈表

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

?

在數組的各個元素中, 「除了數據的值之外,通過為其附帶上下一個元素的索引」 ,即可實現鏈表。 「數據的值和下一個元素的索引組合在一起」 ,就構成了數組的一個元素。

圖片

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

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

這里,我們把之前我們針對JS鏈表相關算法的一些技巧直接遷移過來了。這里使用 「哨兵節點」 來對鏈表操作進行簡化處理。

? 「哨兵節點」 是為了簡化處理鏈表 「邊界條件」 而引入的**「附加鏈表節點」**

?

哨兵節點通常位于 「鏈表的頭部」 ,它的值沒有任何意義。在一個有哨兵節點的鏈表中, 「從第二個節點開始才真正的保存有意義的信息 。

追加數據

function append(head,value) {
  // 哨兵節點 
  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;
}

首先,創建一個 「哨兵節點」 (該節點的 「值」 沒有意義 -即ListNode(0)參數為啥不重要),并把該節點當做鏈表的頭節點, 「把原始的鏈表添加到哨兵節點的后面」dumy.next = head)。

然后,返回真正的頭節點(哨兵節點的下一個節點)node.next

這里有一個小的注意點,就是在 「遍歷」 鏈表的時候,并不是直接對dumy進行處理,而是用了一個 「零時游標節點」 (node)。這樣做的好處就是,在append操作完成以后,還可以通過dumy節點來,直接返回鏈表的頭節點dumy.next。因為,dumy一直沒參與遍歷過程。

刪除數據

?為了刪除一個節點,需要找到被刪除節點的 「前一個節點」 ,然后把該節點的next指針指向它 「下一個節點的下一個節點」 。

?

「哨兵節點」 ,在刪除指定節點

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;
}

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

二叉樹

「二叉樹查找樹」 是指在鏈表的基礎上往數組中追加元素時,考慮到數據的大小關系,將其分成左右兩個方向的表現形式。

圖片

?二叉查找樹使 「數據搜索」 更有效。

?


?「我們這里不對具體的數據結構進行詳細的介紹。如果了解更多關于數據結構的和對應的算法的東西,可以移步到我們之前的文章中?!?/strong> 總有一款適合你。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 計算機
    +關注

    關注

    19

    文章

    6709

    瀏覽量

    85153
  • 內存
    +關注

    關注

    8

    文章

    2785

    瀏覽量

    72890
  • 數據處理
    +關注

    關注

    0

    文章

    522

    瀏覽量

    28304
  • 數據結構
    +關注

    關注

    3

    文章

    564

    瀏覽量

    39932
收藏 人收藏

    評論

    相關推薦

    計算機基礎知識

    世界上第一臺數字式電子計算機是由美國賓夕法尼亞大學的物理學家約翰 莫克利(John Mauchly)和工程師普雷斯伯 ??颂?Presper Eckert)領導研制的取名為ENIAC
    發表于 03-08 15:50

    計算機組成原理基礎知識

    計算機組成原理基礎知識,前言參考:《王道計算機組成原理》學習筆記總目錄+思維導圖2019 王道考研 計算機組成原理第一章 計算機系統概述1.
    發表于 07-16 07:48

    計算機網絡基礎知識了解

    計算機網絡技術復習一、 計算機網絡基礎知識了解:計算機網絡(Internet)的發展 面向終端的計算機網絡(單個
    發表于 07-26 06:27

    介紹一下計算機底層知識

    的更遠,而計算機基礎知識又是重中之重。下面,跟隨我的腳步,為你介紹一下計算機底層知識。CPU還不了解 CPU 嗎?現在就帶你了解一下 CPU 是什么CPU 的全稱是Central Pr
    發表于 07-26 06:21

    介紹一下計算機底層知識

    我們每個程序員或許都有一個夢,那就是成為大牛,我們或許都沉浸在各種框架中,以為框架就是一切,以為應用層才是最重要的,你錯了。在當今計算機行業中,會應用是基本素質,如果你懂其原理才能讓你在行業中走的更遠,而計算機基礎知識又是重中之
    發表于 07-28 06:15

    計算機基礎知識點匯總,不看肯定后悔

    計算機基礎知識點匯總,不看肯定后悔
    發表于 11-15 06:03

    計算機基礎知識

    前言《MSP430單片機應用基礎與實踐》(華中科技大學出版社)------第0章------計算機基礎知識(本文章作備忘錄使用)1.進制轉換2.數值數據的表示3.計算機的碼制
    發表于 11-29 06:03

    計算機簡介

    1計算機基礎知識1.計算機簡介1.1計算機定義:按照一定邏輯處理數據的帶存儲的機器。微型,小型,大型等。2.2計算機組成分為硬件、軟件2.2
    發表于 12-23 06:45

    計算機應用基礎課件

    計算機應用基礎課件內容有計算機基礎知識,計算機鍵盤及漢字輸入,操作系統及使用,網絡基礎知識和Internet,電子表格軟件Excel2000
    發表于 09-25 12:30 ?0次下載
    <b class='flag-5'>計算機</b>應用基礎課件

    計算機基礎知識選擇題

    計算機基礎知識選擇題 1.微型計算機是由( )、存儲器、輸入設備和輸出設備等部件組成的。  A. 硬盤 B. 軟盤 C. 鍵盤 D. 運算控制單元 2.一臺微機型號
    發表于 03-03 08:32 ?89次下載

    計算機基礎知識練習題

    計算機基礎知識練習題(一)單選題:1.計算機的描述中,( )是錯誤的。A. 計算機是一種可供計算的機器  、B.
    發表于 03-03 08:33 ?70次下載

    計算機基礎知識試題

    計算機基礎知識試題 1、CPU的主要功能是進行(     )。
    發表于 10-25 10:59 ?7861次閱讀

    計算機總線技術基礎知識

    計算機總線技術基礎知識 任何一個微處理器都要與一定數量的部件和外圍設備連接,但如果將各部件和每一種外圍設 備都分別用一
    發表于 05-22 08:52 ?784次閱讀

    計算機基礎知識介紹

    計算機基礎知識計算機基礎知識計算機基礎知識
    發表于 12-03 16:13 ?0次下載

    計算機控制技術的基礎知識點說明

    本文檔的主要內容詳細介紹的是計算機控制技術的基礎知識點說明包括了:1 計算機控制系統的概念,2 計算機控制系統的組成,3 計算機控制系統的分
    發表于 04-27 08:00 ?5次下載
    <b class='flag-5'>計算機</b>控制技術的<b class='flag-5'>基礎知識</b>點說明
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>