2014-04-22 96 views
2

我正在和一位同事討論關於malloc的問題,並想知道是否某些libc調用像malloc這樣的情況是由操作系統實現的?libc和malloc是操作系統的一部分嗎?

我一直認爲malloc調用了一些在「sys」中公開的符號來聲明它將使用哪些內存地址。從我認爲操作系統將允許使用一些操作系統級別的API ...這可能類似於被指定的程序的分割:

int assign_memory_segmention(size_t start, size_t end); 

我知道我的文件stdlib.h頭是因爲GPL的GNU的一部分頭......並且GNU已經確保通知我......他們不是Unix。那麼malloc只是某種類型的指向OS堆實現的函數指針?

+2

'malloc'調用系統調用來提供動態內存分配行爲。在Linux中它調用'brk'和'mmap'。所以我把它稱爲系統功能的抽象。 –

+1

C庫包含許多預編譯的普通C代碼,以使程序員/用戶可以訪問它。大部分代碼不是系統調用。操作系統本身不實現'malloc()';它提供了一個允許'malloc()'請求更多內存的機制,但'malloc()'負責將該內存分發給程序。所以,它們不是內核的一部分。 OTOH,C庫中的函數隨操作系統一起提供,並且被大多數程序使用,所以它們與操作系統密切相關。 –

+0

小問題:大多數GPL授權代碼與GNU或自由軟件基金會無關(除非使用由他們創建和公佈的許可證)。由於您的系統可能使用glibc,因此它實際上是* GNU項目的一部分,但是(例如)Linux內核在其源代碼和頭文件中攜帶相同的GPL頭部。 – delnan

回答

3

這個問題最好問另一個問題:什麼是操作系統?或者,如果您願意:您在哪裏打印OS和標準庫之間的界限?

從技術上講,malloc是標準C庫的一部分。由於Linux主要是用C語言編寫的,並且同一個庫也包含很多系統調用,而不是C語言,所以認爲這個庫是OS的一部分是合理的。但是,另一方面,C庫有多個實現,並且GNU C庫也可用於其他操作系統,例如Windows。而且我確定還有其他語言使用標準C庫稱爲OS 而不使用。所以,從那個POV來看,它不是操作系統的一部分。

但是,Linux是內核,操作系統應該命名爲GNU/Linux(需要引用)。但是,再次,有沒有GNU的Linux系統,如Android ...

結論是:術語「操作系統」不是技術性的。如果要精確,請使用內核標準C庫等。

+0

對於這個問題,我發現考慮到操作系統是在syscall內部發生的事情(在內核級代碼中)就足夠了。 –

+1

@AndréPuel:那麼'malloc'沒有在內核模式下運行,所以它不是OS定義的一部分。但它可能會使用OS服務來獲得額外的內存,如果需要的話('brk','mmap'或其他)。 – rodrigo

+0

在這裏,[SCO,GNU和Linux](https://www.gnu.org/philosophy/sco/sco-gnu-linux) - Stallman。另外,還有一些[http://www.etalabs.net/compare_libcs​​.html](標準C庫)可用於Linux。 –

1

是...並且不是。 C malloc()通常是OS調用提供的內存區域的子分配器。操作系統管理所有虛擬內存 - 這是它工作的一部分。