2011-08-01 52 views
2

如果我們有一個字符串"A"和數字65,因爲它們在內存中看起來相同,操作系統如何知道哪個字符串和哪個數字?操作系統如何檢測數字和字符串?

另一個問題 - 假設一個程序分配一些內存(比如說一個字節)。操作系統如何記住內存分配的位置?

+0

你的#1沒有多大意義。 – pyroscope

+0

@ pyroscope-我認爲這實際上是一個非常合理的問題。計算機知道如何將不同類型的變量視爲不同的類型並不明顯,因爲它們在一天結束時看起來都是相同的。 – templatetypedef

回答

3

這些細節都不由操作系統處理。它們由用戶程序處理。

對於你的第一個問題,在內存內部,字符'A'和數值65(當然,假設你只是查看一個字節的數據)之間絕對沒有區別。當你看到這些位被程序解釋時會產生差異。例如,如果用戶程序試圖將字符串打印到屏幕上,則可能會向操作系統發出一些系統調用請求操作系統打印該字符。在這種情況下,OS中的代碼由一系列彙編指令組成,以在顯示設備中的某處複製這些位。然後,顯示器負責渲染一組合適的像素以繪製字符'A'。換句話說,該計劃從未「知道」該值是「A」。相反,硬件只是推動了一些控制另一塊代碼的位,最終將這些位轉換爲像素。

對於第二個問題,這真的取決於內存管理器。程序分配內存和知道存儲位置的方法很多。我不完全明白你在問什麼,但我相信這個答案應該是足夠了:

  1. 在操作系統級別,操作系統內核甚至不知道該字節被分配。相反,操作系統只是爲用戶程序分配巨大的內存塊,以便在運行時使用。程序終止時,所有內存都會被回收。

  2. 在方案一級,大多數程序包含存儲器管理器,與分配和七手八腳一個任務的代碼段大塊的存儲器成小塊,然後可以被程序使用。這通常將分配的內存作爲「塊」列表進行跟蹤,其中每塊內存都被視爲元素的雙向鏈表。每個塊通常用表示正在使用的信息和塊的大小來標註,這允許內存管理器在釋放內存後回收內存。

  3. 在用戶代碼級別,當您詢問內存時,通常會將其存儲在指針中以跟蹤內存的位置。這只是存儲地址的內存中的一系列字節,操作系統和內存管理器除非指示,否則永遠不會查看。

希望這有助於!

+0

謝謝,有沒有什麼好的資源解釋它!我非常感謝你的回答! – undone

0
  1. 對於計算機,字符串是數字。一個最簡單的例子是一張ASCII表格,其中每個字母都附有一個數字。所以如果你對C很熟悉,你可以寫printf("%c", 0x65),實際上得到的是A而不是數字。希望這是有道理的。

  2. 操作系統不記得程序分配的內存的位置。這就是pointers

1

第2號 - 系統記錄(特定過程的)所有分配,因此可以刪除它們,例如,當進程終止時。我建議你閱讀一本關於操作系統原理的書(例如Tanenbaum的「現代操作系統」)。

+0

是不是更像操作系統爲進程分配一塊內存(例如虛擬內存),並且由該進程決定如何處理它,而不是操作系統記錄分配? – OsQu

+0

這裏有幾層管理,虛擬內存映射是操作系統中的某些東西(* nix中的sbrk),而給予該進程的頁面則由任何應用程序使用(例如某種形式的malloc或Java GC )。 – pyroscope

1
  1. 字符「A」和整數65在內存中以相同的方式存儲(至少在32位系統上)。然而,字符串「A」的存儲方式不同,可能取決於系統或編程語言。以C爲例,它將字符串存儲爲基本上由空字符和後跟空字符組成的數組。

  2. 操作系統使用內存管理器來跟蹤哪些進程正在使用哪些內存部分。