2024-2025-1 20241328 《計算機基礎與程式設計》第九周學習總結

Eureka23662發表於2024-11-23

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 JOINLEFT JOIN有什麼區別?

回答INNER JOIN返回兩個表中匹配的記錄,而LEFT JOIN返回左表的所有記錄,即使右表沒有匹配的記錄,右表部分會顯示為NULL


問題 7: 什麼是資料庫的規範化?為什麼要進行規範化?

回答:資料庫規範化是將資料表拆分成多個更小的表,以消除冗餘和依賴,確保資料一致性。規範化的目的是減少資料冗餘,避免資料異常。


問題 8: C語言中的指標是什麼?為什麼指標重要?

回答:指標是儲存記憶體地址的變數。指標很重要,因為它可以直接操作記憶體、傳遞大型資料結構和支援動態記憶體分配。


問題 9: 陣列和指標有什麼關係?為什麼陣列名是指標?

回答:陣列名是指向陣列第一個元素的指標。陣列名本質上是一個常量指標,可以透過指標訪問陣列的元素。


問題 10: 動態記憶體分配是如何工作的?如何避免記憶體洩漏?

回答:動態記憶體分配透過malloccalloc等函式在執行時分配記憶體。避免記憶體洩漏的關鍵是使用free函式釋放不再使用的記憶體。


問題 11: C語言中的指標比陣列強大在哪些方面?

回答:指標比陣列強大,因為指標可以進行算術運算,靈活地操作記憶體,且可以指向不同型別的資料。陣列在編譯時已固定大小,而指標可以動態分配記憶體。


總結

透過這次的蘇格拉底式挑戰,我們探討了作業系統、資料庫和C語言中的關鍵知識點,以下是總結:

  • 作業系統:涉及程序管理、記憶體管理、虛擬記憶體、檔案系統等核心功能,程序與程式的區別,以及虛擬記憶體對程式執行的重要性。
  • 資料庫:講解了關聯式資料庫的結構及其與層次模型的不同,SQL中的常見連線操作,以及資料庫規範化的必要性。
  • C語言:涵蓋了指標和陣列的關係,指標在記憶體管理中的重要作用,動態記憶體分配的使用以及如何避免記憶體洩漏。

理解這些基礎知識對於深入學習作業系統原理、資料庫設計和C語言程式設計至關重要。這些概念為更高階的電腦科學學習打下了堅實的基礎。

程式碼除錯中的問題和解決過程

問題 1: 記憶體洩漏

問題描述

在使用動態記憶體分配(如 malloccalloc)時,我有時會忘記釋放記憶體(使用 free)。這導致程式執行一段時間後,記憶體逐漸被耗盡,程式變得緩慢,甚至崩潰。

解決過程
  • 我首先檢查了所有使用 malloccallocrealloc 等函式分配的記憶體,確保每次使用完動態記憶體後都呼叫了 free 來釋放它。
  • 我使用了工具如 Valgrind 來檢測程式中的記憶體洩漏。Valgrind 可以幫助我識別未釋放的記憶體,並指出具體的位置。
  • 我在每次記憶體分配後,新增了註釋,提醒自己需要在適當的時機釋放這些記憶體,避免忘記。

問題 2: 陣列越界

問題描述

在處理陣列時,我偶爾會出現陣列越界的問題,尤其是在訪問陣列時,索引超過了陣列的有效範圍。這通常會導致未定義的行為(如程式崩潰或資料錯誤)。

解決過程
  • 我透過仔細檢查程式碼,確保訪問陣列時不會超過陣列的邊界。例如,在處理迴圈時,我會確保索引小於陣列的大小。
  • 使用偵錯程式(如 GDB)來逐步除錯程式碼,觀察陣列的索引和陣列長度,幫助我發現越界訪問的原因。
  • 我還在陣列訪問時,加入了邊界檢查的程式碼。例如,在訪問陣列元素之前,我會判斷索引是否在有效範圍內。

其他(感悟、思考等,可選)

學習這些計算機基礎知識,讓我對電腦科學有了更深刻的理解。每個部分都與實際程式設計和系統設計緊密相關,幫助我從宏觀上理解了計算機如何高效地工作。

  1. 作業系統讓我意識到它不僅是一個“中介”,而且是計算機高效執行的核心。特別是程序管理和記憶體管理,原來計算機如何排程任務、分配記憶體,是為了讓多個程式併發執行且互不干擾,背後的機制非常複雜但又至關重要。

  2. 資料庫的學習讓我看到了資料如何高效儲存、檢索和管理。關聯式資料庫與其他資料模型(如層次模型)的對比,讓我明白了資料結構的選擇和設計對系統效能的巨大影響。而SQL的學習,更讓我理解了如何用簡潔的語句表達複雜的資料操作,增強了我的程式設計思維。

  3. 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小時

改進情況:

透過前幾周的學習進度,我逐漸意識到自己在時間估算上的差距。起初,計劃學習時間總是比實際花費的時間少。隨著學習進度的推進,尤其是涉及到程式設計和除錯時,實際學習時間逐漸增加。我已經開始更好地估算每週所需的時間,並逐步提高自己的計劃能力。

接下來,我會繼續改進估算方法,結合實際情況調整每週的學習計劃,爭取在接下來的幾周內逐漸接近我的學習目標。

相關文章