班級連結 | 2024計算機基礎與程式設計 |
---|---|
作業要求 | 第九周作業 |
作業目標 | ①作業系統責任 ②記憶體與程序管理 ③分時系統 ④CPU排程 ⑤檔案、檔案系統 ⑥檔案保護 ⑦磁碟排程 |
教材學習內容總結
《電腦科學概論》第10、11章
第10章
- 作業系統定義:
作業系統(OS)是具有操作硬體特殊許可權的程式,負責執行和管理其他程式 - 主要責任:
主要負責管理計算機資源(如記憶體、輸入/輸出裝置等)和為人機互動提供介面 - 程式載入方式:
作業系統是開機第一個啟動的程式,負責啟動其他程式,早期作業系統採用批處理方式 - 抽象硬體:
作業系統透過提供API來抽象硬體,稱為裝置驅動程式,使得程式設計師可以標準化地與硬體互動 - 多工處理:
作業系統能夠在單個CPU上透過共享時間來執行多個程式 - 虛擬記憶體:
作業系統透過虛擬記憶體技術隱藏記憶體的複雜性,允許程式的記憶體大小靈活增減 - 動態記憶體分配:
作業系統自動處理虛擬記憶體和實體記憶體之間的對映 - 記憶體保護:
作業系統透過給程式分配專用的記憶體範圍來隔離程式,防止互相影響和病毒 - 多使用者支援:
作業系統可以處理多使用者的訪問,開發了分時作業系統
第11章
- 文字檔案和二進位制檔案:
檔案的基本分類包括文字檔案和二進位制檔案 - 檔案操作:
介紹檔案的建立、讀取、寫入和刪除等基本操作 - 檔案訪問:
介紹檔案的訪問許可權和模式 - 檔案保護:
涉及檔案的安全性和保護措施 - 目錄樹:
檔案系統中目錄的組織結構通常以樹狀結構展示 - 路徑名:
在檔案系統中定位檔案的方法,包括絕對路徑和相對路徑的概念 - 先到先服務磁碟排程法:
是一種基本的磁碟排程演算法,即按照請求的順序進行處理 - 最短尋道時間優先磁碟排程法:
是一種最佳化磁碟訪問時間的排程演算法 - SCAN磁碟排程法:
是另一種磁碟排程演算法,透過減少磁頭移動來最佳化效能
《C語言程式設計》第8章
- 一維陣列的定義和初始化:
一維陣列的宣告、定義以及初始化的方法。 - 二維陣列的定義和初始化:
二維陣列的宣告、定義以及初始化的技巧。 - 向函式傳遞一維陣列:
介紹將一維陣列作為引數傳遞給函式的方法,並在函式中處理陣列。 - 排序和查詢:
基本的排序演算法(如氣泡排序、選擇排序等)和查詢演算法(如線性查詢、二分查詢等)。 - 向函式傳遞二維陣列:
介紹將二維陣列作為引數傳遞給函式的方法,並在函式中對二維陣列進行操作。
教材學習中的問題與解決過程
問題1:陣列在記憶體中是如何連續儲存的?
AI:
陣列在記憶體中的連續儲存是指陣列的元素在記憶體中是按照順序一個接一個地存放的,沒有間隔。這種儲存方式有以下幾個特點:
- 連續的記憶體塊:
當一個陣列被建立時,作業系統會為該陣列分配一個連續的記憶體塊。這意味著陣列的第一個元素的地址緊接著就是第二個元素的地址,以此類推。 - 記憶體地址計算:
由於陣列元素在記憶體中是連續存放的,所以可以透過基地址(陣列首元素的地址)加上元素的偏移量(索引乘以元素大小)來計算任意元素的地址。例如,如果陣列的基地址是A,每個元素大小是size,那麼第i個元素的地址就是A + i*size。 - 提高訪問效率:
連續儲存可以提高資料訪問效率。現代計算機的CPU快取系統是按照塊(block)來載入資料的,當資料在記憶體中連續存放時,CPU可以預載入一個資料塊到快取中,這樣當訪問連續資料時,就可以減少快取未命中的情況,提高訪問速度。 - 簡化記憶體管理:
連續儲存簡化了記憶體管理。作業系統只需要記錄陣列的起始地址和總大小,就可以管理整個陣列的記憶體。 - 記憶體對齊:
連續儲存有助於記憶體對齊。許多計算機系統要求資料按照特定的邊界對齊,連續儲存可以保證陣列元素按照這些邊界對齊,從而提高記憶體訪問效率。 - 陣列越界:
由於陣列元素是連續儲存的,陣列越界(訪問陣列之外的記憶體)可能會導致未定義行為,包括程式崩潰或者資料損壞。 - 動態陣列實現:
在一些程式語言中,動態陣列(如C++中的std::vector或Java中的ArrayList)雖然在內部可能不是完全連續的(可能因為擴容需要重新分配記憶體),但對外表現為連續儲存,以提供隨機訪問的能力。 - 陣列操作:
連續儲存使得陣列操作(如複製、比較)更加高效,因為可以透過簡單的記憶體塊複製來實現。 - 程式語言支援:
大多數程式語言都支援陣列的連續儲存,提供了便捷的語法來宣告和運算元組。
連續儲存是陣列區別於其他資料結構(如連結串列)的一個重要特性,它為陣列提供了快速的隨機訪問能力,同時也帶來了記憶體利用率和靈活性上的一些限制。
問題2:為什麼陣列名可以作為指向其首元素的指標使用?
AI:
在C語言中,陣列名可以作為指向其首元素的指標使用,這是由C語言的語法和記憶體模型決定的。以下是幾個關鍵原因:
- 語言設計:
C語言的設計允許陣列名在大多數表示式中被解釋為指向陣列首元素的指標。這是C語言的一個基本特性,它使得處理陣列更加靈活和高效。 - 記憶體模型:
在記憶體中,陣列是一塊連續的記憶體區域。陣列名實際上代表的是這塊記憶體區域的起始地址。因此,當陣列名被用作指標時,它指向的是陣列的第一個元素。 - 語法糖:
在C語言中,陣列名作為指標使用是一種“語法糖”。這意味著在編寫程式碼時,可以使用陣列名來訪問陣列的首元素,而在內部,編譯器會將其處理為指向首元素的指標。 - 指標運算:
當陣列名被用作指標時,可以進行指標運算。例如,array + 1 表示指向陣列第二個元素的指標,因為指標運算會根據陣列元素的大小自動進行偏移。 - 函式引數傳遞:
在C語言中,函式引數的傳遞是透過值進行的,但對於陣列,實際上是傳遞陣列首元素的地址。因此,當陣列作為引數傳遞給函式時,陣列名自然被用作指標。 - 記憶體訪問:
透過將陣列名視為指標,可以直接訪問陣列中的元素,而不需要額外的間接訪問操作。這簡化了陣列元素的訪問方式。 - 相容性:
這種設計使得C語言與底層硬體的記憶體模型緊密相容,允許程式設計師以接近硬體的方式操作記憶體,這對於效能最佳化和底層程式設計非常重要。 - 陣列操作:
許多陣列操作,如複製、比較和搜尋,都需要透過指標來實現。將陣列名視為指標簡化了這些操作的實現。 - 標準庫函式:
C語言標準庫中的許多函式,如memcpy、memcmp和memmove,都接受指向記憶體塊的指標作為引數。將陣列名作為指標使用,可以方便地與這些函式配合。 - 歷史原因:
C語言的這種設計也受到了其歷史背景的影響。C語言起源於早期的作業系統和編譯器開發,這種設計反映了對記憶體操作的直接控制需求。
綜上所述,陣列名在C語言中可以作為指向其首元素的指標使用,這是由C語言的設計、記憶體模型和實用性共同決定的。這種特性使得C語言在處理陣列時非常靈活和高效。
基於AI的學習
學習進度條
計劃學習時間:25h
實際學習時間:25h