2024-2025-1 20241328 《計算機基礎與程式設計》第九周學習總結
作業資訊
這個作業屬於哪個課程 | 2024-2025-1-計算機基礎與程式設計 |
---|---|
這個作業要求在哪裡 | 2024-2025-1計算機基礎與程式設計第一週作業 |
這個作業的目標 | - 作業系統責任 - 記憶體與程序管理 - 分時系統 - CPU排程 - 檔案、檔案系統 - 檔案保護-磁碟排程 |
教材學習內容總結
電腦科學概論(第七版)第10、11章總結
第10章:作業系統基礎
1. 作業系統的概念與功能
- 作業系統定義:作業系統是管理計算機硬體和軟體資源的程式,它提供使用者與計算機硬體之間的介面。作業系統的主要功能是資源管理(CPU、記憶體、外設等)和任務排程。
- 作業系統的核心功能:
- 程序管理:管理和排程計算機上的各個程序。
- 記憶體管理:有效分配、回收記憶體,支援虛擬記憶體技術。
- 檔案系統管理:管理儲存裝置中的檔案,提供檔案的存取、儲存與保護功能。
- 裝置管理:管理計算機外部裝置的輸入輸出操作。
- 使用者介面:為使用者提供與計算機互動的介面。
2. 程序管理
- 程序的定義:程序是程式的一個執行例項,每個程序都有獨立的記憶體空間和執行狀態。
- 程序狀態:程序有不同的狀態,包括執行態、就緒態、阻塞態等。
- 程序排程:作業系統根據特定的排程演算法來決定哪個程序在何時執行,常見的排程演算法有:
- 先來先服務(FCFS)
- 短作業優先(SJF)
- 優先順序排程
- 時間片輪轉(RR)
3. 記憶體管理
- 記憶體分配:作業系統負責分配記憶體給程序使用,常見的記憶體分配方式有:
- 連續記憶體分配:為每個程序分配一個連續的記憶體塊。
- 分頁系統:將記憶體劃分為固定大小的頁,程序使用頁來儲存資料。
- 分段系統:將程序的記憶體劃分為若干段(如程式碼段、資料段等)。
- 虛擬記憶體:透過硬碟空間模擬出比實體記憶體更大的記憶體空間,讓程式看起來可以使用比實際實體記憶體更多的記憶體。
4. 檔案系統
- 檔案的定義與管理:檔案是資料儲存的基本單位,作業系統需要管理檔案的建立、刪除、讀取和寫入。
- 檔案的組織方式:作業系統為檔案提供目錄結構,檔案可以按照檔名進行組織,並支援對檔案進行許可權控制(如讀、寫、執行許可權)。
- 檔案儲存:檔案通常儲存在硬碟或其他外部儲存裝置上,作業系統透過檔案系統來訪問和管理這些檔案。
5. 輸入輸出管理
- 輸入輸出裝置:包括鍵盤、滑鼠、顯示器、硬碟等外部裝置。
- 緩衝區管理:作業系統為I/O操作提供緩衝區,以提高資料傳輸的效率。
- I/O排程:作業系統透過排程演算法最佳化I/O操作的順序,以減少等待時間,提高效能。
第11章:資料庫系統
1. 資料庫系統概述
- 資料庫的定義:資料庫是一個有組織的資料集合,透過資料庫管理系統(DBMS)進行管理,提供高效的資料儲存、查詢、更新和管理功能。
- 資料庫管理系統(DBMS):DBMS是一種軟體,它用於管理資料庫中的資料,提供資料存取、管理、更新等功能,確保資料的完整性、一致性和安全性。
2. 資料模型
- 層次模型:資料以樹形結構組織,記錄間有父子關係,適用於層次化的資料儲存。
- 網狀模型:資料以圖形結構組織,記錄間可以有多對多的關係,比層次模型更靈活。
- 關係模型:資料以二維表格形式組織,每個表由行(記錄)和列(欄位)組成。關係模型是目前最常用的資料模型,關聯式資料庫管理系統(RDBMS)採用此模型。
3. 關聯式資料庫
- 表(Relation):資料庫中的基本儲存單位。每張表包含若干列(屬性)和行(記錄)。
- 主鍵(Primary Key):用來唯一標識每條記錄的欄位,保證表中每條記錄的唯一性。
- 外來鍵(Foreign Key):用於建立表之間聯絡的欄位,它指向另一表的主鍵。
- 資料完整性:包括實體完整性、參照完整性和域完整性等,保證資料在儲存和操作過程中的正確性和一致性。
4. SQL語言
- SQL的定義:SQL(結構化查詢語言)是一種用於訪問和運算元據庫的標準語言。
- 資料查詢(SELECT):從資料庫中查詢資料,支援過濾、排序、聚合等操作。
- 資料操作:包括插入(INSERT)、更新(UPDATE)和刪除(DELETE)資料。
- 資料定義:包括建立、修改和刪除表(CREATE、ALTER、DROP)。
- 資料控制:用於控制使用者許可權,管理資料庫安全性(如GRANT、REVOKE)。
5. 資料庫設計
- 實體-關係模型(ER圖):一種圖形化的資料庫設計工具,用來描述資料庫中的實體及其之間的關係。
- 規範化:透過消除冗餘資料、避免更新異常等方式,將資料庫設計為符合一定規範的結構。常見的規範化正規化有:
- 第一正規化(1NF):要求資料表中的每列都是原子性的。
- 第二正規化(2NF):在1NF的基礎上,要求消除部分依賴。
- 第三正規化(3NF):在2NF的基礎上,要求消除傳遞依賴。
C語言程式設計第8章:指標和陣列
1. 指標基礎
- 指標的定義:指標是儲存記憶體地址的變數,指標變數的值是另一個變數的地址。透過指標可以訪問和操作該地址所指向的資料。
- 指標運算:指標可以進行加法、減法操作,例如,指標加1表示指向下一個同型別資料的記憶體地址。
- 指標型別:指標的型別必須與所指向的資料型別一致。
2. 指標與陣列的關係
- 陣列名作為指標:陣列名實際上是指向陣列首元素的指標。
- 透過指標訪問陣列元素:可以透過指標運算來訪問陣列的元素。例如,
*(arr + i)
等同於arr[i]
。 - 二維陣列與指標:二維陣列的元素可以透過指標操作進行訪問。二維陣列可以視為指向指標的指標(如
int arr[3][4]
可以視為int *arr[3]
)。
3. 指標與函式
- 透過指標傳遞引數:使用指標可以傳遞變數的地址,使得函式能夠修改傳入的變數。
- 指標作為函式返回值:函式可以返回指標,返回動態分配的記憶體地址等。
4. 動態記憶體分配
- 動態記憶體分配函式:
malloc(size_t size)
:分配一塊指定大小的記憶體,返回該記憶體的指標。calloc(size_t num, size_t size)
:分配指定數量和大小的記憶體,並初始化為0。realloc(void *ptr, size_t size)
:調整已經分配記憶體的大小。free(void *ptr)
:釋放之前分配的記憶體。
5. 多維陣列與指標
- 多維陣列:多維陣列本質上是指向指標的指標。二維陣列可以透過指標進行遍歷和訪問。
..
基於AI的學習
問題 1: 作業系統的主要功能是什麼?
回答:作業系統的主要功能包括程序管理、記憶體管理、檔案系統管理、裝置管理和使用者介面。
問題 2: 什麼是程序?程序和程式有什麼區別?
回答:程序是程式的一個執行例項,具有自己的記憶體空間和執行狀態。程式是靜態的,而程序是動態的,表示程式正在執行的狀態。
問題 3: 為什麼需要虛擬記憶體?
回答:虛擬記憶體允許程式使用比實際實體記憶體更多的記憶體,透過將部分資料儲存到硬碟來擴充套件記憶體,避免因記憶體不足而導致程式崩潰。
問題 4: 檔案系統如何管理檔案?
回答:檔案系統透過目錄結構來管理檔案,提供檔案的儲存、訪問、建立、刪除等操作,並且對檔案進行許可權控制。
問題 5: 關聯式資料庫是什麼?與層次模型有什麼不同?
回答:關聯式資料庫以表格形式組織資料,透過行和列來表示。與層次模型不同,關聯式資料庫可以處理更復雜的多對多關係,不需要像層次模型那樣按樹形結構組織資料。
問題 6: SQL中的INNER JOIN
和LEFT JOIN
有什麼區別?
回答:INNER JOIN
返回兩個表中匹配的記錄,而LEFT JOIN
返回左表的所有記錄,即使右表沒有匹配的記錄,右表部分會顯示為NULL
。
問題 7: 什麼是資料庫的規範化?為什麼要進行規範化?
回答:資料庫規範化是將資料表拆分成多個更小的表,以消除冗餘和依賴,確保資料一致性。規範化的目的是減少資料冗餘,避免資料異常。
問題 8: C語言中的指標是什麼?為什麼指標重要?
回答:指標是儲存記憶體地址的變數。指標很重要,因為它可以直接操作記憶體、傳遞大型資料結構和支援動態記憶體分配。
問題 9: 陣列和指標有什麼關係?為什麼陣列名是指標?
回答:陣列名是指向陣列第一個元素的指標。陣列名本質上是一個常量指標,可以透過指標訪問陣列的元素。
問題 10: 動態記憶體分配是如何工作的?如何避免記憶體洩漏?
回答:動態記憶體分配透過malloc
、calloc
等函式在執行時分配記憶體。避免記憶體洩漏的關鍵是使用free
函式釋放不再使用的記憶體。
問題 11: C語言中的指標比陣列強大在哪些方面?
回答:指標比陣列強大,因為指標可以進行算術運算,靈活地操作記憶體,且可以指向不同型別的資料。陣列在編譯時已固定大小,而指標可以動態分配記憶體。
總結
透過這次的蘇格拉底式挑戰,我們探討了作業系統、資料庫和C語言中的關鍵知識點,以下是總結:
- 作業系統:涉及程序管理、記憶體管理、虛擬記憶體、檔案系統等核心功能,程序與程式的區別,以及虛擬記憶體對程式執行的重要性。
- 資料庫:講解了關聯式資料庫的結構及其與層次模型的不同,SQL中的常見連線操作,以及資料庫規範化的必要性。
- C語言:涵蓋了指標和陣列的關係,指標在記憶體管理中的重要作用,動態記憶體分配的使用以及如何避免記憶體洩漏。
理解這些基礎知識對於深入學習作業系統原理、資料庫設計和C語言程式設計至關重要。這些概念為更高階的電腦科學學習打下了堅實的基礎。
程式碼除錯中的問題和解決過程
問題 1: 記憶體洩漏
問題描述
在使用動態記憶體分配(如 malloc
或 calloc
)時,我有時會忘記釋放記憶體(使用 free
)。這導致程式執行一段時間後,記憶體逐漸被耗盡,程式變得緩慢,甚至崩潰。
解決過程
- 我首先檢查了所有使用
malloc
、calloc
、realloc
等函式分配的記憶體,確保每次使用完動態記憶體後都呼叫了free
來釋放它。 - 我使用了工具如 Valgrind 來檢測程式中的記憶體洩漏。Valgrind 可以幫助我識別未釋放的記憶體,並指出具體的位置。
- 我在每次記憶體分配後,新增了註釋,提醒自己需要在適當的時機釋放這些記憶體,避免忘記。
問題 2: 陣列越界
問題描述
在處理陣列時,我偶爾會出現陣列越界的問題,尤其是在訪問陣列時,索引超過了陣列的有效範圍。這通常會導致未定義的行為(如程式崩潰或資料錯誤)。
解決過程
- 我透過仔細檢查程式碼,確保訪問陣列時不會超過陣列的邊界。例如,在處理迴圈時,我會確保索引小於陣列的大小。
- 使用偵錯程式(如 GDB)來逐步除錯程式碼,觀察陣列的索引和陣列長度,幫助我發現越界訪問的原因。
- 我還在陣列訪問時,加入了邊界檢查的程式碼。例如,在訪問陣列元素之前,我會判斷索引是否在有效範圍內。
其他(感悟、思考等,可選)
學習這些計算機基礎知識,讓我對電腦科學有了更深刻的理解。每個部分都與實際程式設計和系統設計緊密相關,幫助我從宏觀上理解了計算機如何高效地工作。
-
作業系統讓我意識到它不僅是一個“中介”,而且是計算機高效執行的核心。特別是程序管理和記憶體管理,原來計算機如何排程任務、分配記憶體,是為了讓多個程式併發執行且互不干擾,背後的機制非常複雜但又至關重要。
-
資料庫的學習讓我看到了資料如何高效儲存、檢索和管理。關聯式資料庫與其他資料模型(如層次模型)的對比,讓我明白了資料結構的選擇和設計對系統效能的巨大影響。而SQL的學習,更讓我理解了如何用簡潔的語句表達複雜的資料操作,增強了我的程式設計思維。
-
C語言中的指標和記憶體管理是最讓我“震撼”的部分。透過指標操作記憶體,能夠更加靈活地管理程式的資料結構。動態記憶體分配和釋放,雖然看起來簡單,但實際上對程式的效率和安全性至關重要。指標不僅讓我更接近計算機底層,也讓我更加註重資源的合理利用,避免記憶體洩漏等問題。
總體來說,學習這些知識不僅是瞭解計算機如何工作的過程,更讓我意識到每一行程式碼背後的系統設計和最佳化。在日後的程式設計實踐中,我會更加註重效率、穩定性和可維護性,這些基礎知識無疑為我後續深入學習其他計算機領域(如演算法、網路、分散式系統等)打下了堅實的基礎。
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 200/200 | 2/2 | 20/20 | |
第二週 | 300/500 | 2/4 | 18/38 | |
第三週 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五週 | 400/1700 | 3/12 | 25/115 | |
第六週 | 500/2200 | 4/16 | 35/150 | |
第七週 | 500/2700 | 5/21 | 40/190 | |
第八週 | 400/3100 | 3/24 | 30/220 | |
第九周 | 300/3400 | 3/27 | 35/255 |
計劃學習時間:15小時
實際學習時間:10小時
改進情況:
透過前幾周的學習進度,我逐漸意識到自己在時間估算上的差距。起初,計劃學習時間總是比實際花費的時間少。隨著學習進度的推進,尤其是涉及到程式設計和除錯時,實際學習時間逐漸增加。我已經開始更好地估算每週所需的時間,並逐步提高自己的計劃能力。
接下來,我會繼續改進估算方法,結合實際情況調整每週的學習計劃,爭取在接下來的幾周內逐漸接近我的學習目標。