有 Memory Segmentation 和 Paging 等技術時,C/C++,Pascal 等低級語言中對內存布局的控制意義何在?


我來補充一下 @劉然 的回答吧。

利益相關:嵌入式開發N年……

1、不是所有硬體都支持paging,比如嵌入式,需要面對各種低端的CPU、小內存的開發環境,控制內存布局十分必要,有不少嵌入式開發環境還只支持平面內存模式呢,段頁模式是什麼鬼?各種小型、微型的嵌入式環境都不支持。

2、凡是寫過bootloader的人都知道,boot階段是什麼都沒有的,一切都要自己初始化。題主你可能想說要在bootloader里初始化一個支持paging的東西?你知道這玩意多複雜么?

3、就算是在支持段頁的內存模型中,內存碎片總是會有的吧?我說的是地址碎片。32位Windows環境下可以一次申請的最大連續內存大概是1.2GB的樣子,要是中間掏空幾段,那你想申請大內存都申請不到。

4、Windows驅動里有一個non-paged memory的概念,要在這裡分頁,沒門。很多操作系統在處理中斷之類的請求的時候,訪問分頁的內存的能力十分有限(看具體代碼了),所以,不是所有東西都能分頁。

………………

所以,種種理由告訴我們,自己控制內存布局是十分必要的,大多數情況下內存也不是無限制的使用的。


啊喂,這些都是高級語言好不好。。。現在的年輕人啊,用著C語言這麼高級的語言,還嫌控制內存布局沒用?

我猜你一定沒寫過8086實模式彙編吧。。。

在遠古的洪荒時代,內存都是全局可見的,人們為了訪問多一點點內存,小心翼翼地操作著段寄存器。。。

少年們啊,珍惜來之不易的虛擬內存抽象吧。在你們內存回收都自動,調一個mmap就覺得自己底層得不得了的今天,可曾想過為了這一天努力過的千萬前輩啊!

我打賭至少一半程序員都不知道我剛才在說什麼。


有時候找了阿姨來家裏打掃還是會有不滿意的地方啊...沒辦法


例如:計算機體系結構與程序性能

所以,又何止低級語言需要注意了。


一怒之下刪了所有代碼,原來一直寫得是低級語言,太丟人了。

謝題主


事實上memory segmentation 和paging的技術的主要目的是為了protection和為了內存的連續性。

而C語言中對內存的控制主要是為了對資源更加有效的利用吧


你只要稍微做點高級的事,就得拆開封裝看黑盒,這是沒辦法的事


低級語言寫應用程序的時候也不需要注意。但是低級語言用來處理/維護runtime的資源(library,data)和底層操作(如用/dev/mem做用戶態驅動)時,需要了解內存布局


我看著低級語言呆了十秒,然後把答案都刪了。


Segment和paging是操作系統對內存的抽象和優化,用戶程序是無法介入這一塊的。


現在的年輕人啊,多看點書不好么


你說的這些已經是高級語言了,malloc出來的內存已經是抽象過的。

不過現在可以通過控制內存布局改善局部性,提高各級cache命中率。


減少 頁面故障 導致的性能下降;

增加 緩存命中率;

減少 內存碎片

提高 內存使用效率

有些設備是通過內存映射訪問的,對內存的精細控制尤為重要.


推薦閱讀:

FPGA和嵌入式有哪些區別於聯繫?
對做黑客感興趣該從什麼起步,怎樣發展?
注釋會影響解釋型語言的效率嗎?
如何實現一個關係資料庫?
如何學習Zynq?

TAG:操作系統 | 編程語言 |