GNU/Linux >> Linux の 問題 >  >> Linux

malloc() から行われる Windows および Linux のネイティブ OS/システム呼び出しは何ですか?

Windows では、MSVC の最近のバージョンでは、malloc (および C++ new new の実際のメモリ割り当て部分と同じ基本を使用して実装されているため ) HeapAlloc() を呼び出します . g++ mingw などの他のバージョンでは、C ランタイムは古いバージョンであり、HeapAlloc を直接呼び出すことはほとんどありません。 、しかし、そのベースでは、まだ HeapAlloc に行きます - 別のものを見つけるには、GlobalAlloc があった Windows 95 より前に戻る必要があります。 と LocalAlloc 関数のセット - しかし、最近は 16 ビット コンパイラを使用している人はいないと思います - 少なくとも Windows プログラミングでは.

Linux で glibc を使用している場合 、 sbrk を呼び出すかどうかは、割り当てのサイズに依存します または mmap - mmap (MAP_ANONYMOUS の場合) フラグ内) は、より大きな割り当てに使用されます (しきい値を超えています。典型的な実装では 2MB だと思います)


malloc() とその仲間は、コンパイラに付属するランタイム システムの一部と見なされます。そのため、各コンパイラは異なる OS 呼び出しを使用して malloc を実装できます。

他の人が言ったように、Linux ではオプションは sbrk() と mmap() です。

Windows では、オプションは HeapAlloc() と VirtualAlloc() です。


<ブロック引用>

私の質問は、次のオペレーティング システムで malloc がどのように実装されているかです。

Linux では、有名な malloc が 2 つあります。 実装:

dlmalloc (Doug Lea の malloc)

ptmalloc

glibc、eglibc、または newlib などの Linux libc では、ptmalloc または ptmalloc のバリアントを実装します。

<ブロック引用>

呼び出される OS 固有の関数と malloc() の実装は何ですか?

Unix および Linux システムの場合 sbrkmmap システムコールが使用されます。 man 2 sbrk を参照 と man 2 mmap 詳細については、


わかりました。Linux についてはわかりませんが、Windows に関しては...

メモリは、2 つの分類された場所に割り当てることができます。

1) ヒープ (プロセス ヒープ、カスタム作成ヒープ) 参照 -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx HeapAlloc や HeapFree などの関数を使用。 LocalAlloc と LocalFree は、デフォルトのプロセス ヒープに割り当てたい場合に、HeapAlloc への「ショートカット」として使用できます。

2)VirtualAlloc、VirtualFreeを使用した仮想メモリ(通常は、セキュリティのためのグローバル仮想メモリへのアクセス制限のため、プロセス固有のみ)。参照 -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx

私の知る限り、malloc は Windows でヒープ割り当て関数を使用します。

これがお役に立てば幸いです。


Linux
  1. OSとLinuxのバージョンを確認する方法

  2. Linuxシステムの現在のランレベルはどれくらいですか?

  3. BsdとGnu/linux Userlandの主な違いは何ですか?

  1. Linux で ext4 ファイルシステムのパフォーマンスを向上させるためのマウント オプションは何ですか

  2. Windows とネイティブ API のシステム コール?

  3. Powershell から OS バージョン、Linux および Windows を判別する

  1. Linux –システムに搭載されているハードディスクを確認する方法は?

  2. 最高のVPSは何ですか:WindowsまたはLinux?

  3. Linux と Windows の .txt ファイル (Unicode エンコーディング) の違いは何ですか?