ホームページ  >  記事  >  システムチュートリアル  >  Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

WBOY
WBOY転載
2024-02-13 16:40:16887ブラウズ

Linux は、サーバーや組み込みデバイスで広く使用されているオペレーティング システムとして、市場シェアを拡大​​しています。このようなシナリオでは、メモリ管理はシステムのパフォーマンスと安定性に直接影響するため、特にプログラマにとっては重要です。 Linux プラットフォームで高性能アプリケーションを開発したいプログラマーにとって、Linux メモリ管理の習熟は必須です。今日はすべてのプログラマが読むべき記事「Linux メモリ管理」を紹介します。
メモリ部分について知っておく必要があります:

  1. アドレスマッピング
  2. メモリ管理方法
  3. ページフォールト例外

まず基本的な知識を見てみましょう。プロセスの観点から見ると、メモリはカーネル モードとユーザー モードの 2 つの部分に分割されます。古典的な比率は次のとおりです:

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。
ユーザー モードからカーネル モードへは、通常、システム コールと割り込みによって実現されます。ユーザー モード メモリは、さまざまな目的に応じてさまざまな領域に分割されます:

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

もちろん、カーネル状態は無差別に使用されるわけではないため、次のように分割されます。

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。これらの記憶がどのように管理されるかを詳しく見てみましょう。

######住所######

Linux 内のアドレスのマッピング プロセスは、論理アドレス –> リニア アドレス –> 物理アドレスです。物理アドレスは最も単純です。アドレス バスで送信されるデジタル信号であり、リニア アドレスと論理アドレスは変換を表します。ルール、リニアアドレス規則は次のとおりです:

この部分は、メイン レジスタ CR0 および CR3 を含む MMU によって完了します。機械語命令に記載されるのは論理アドレスであり、論理アドレスの規則は次のとおりです。

Linux の論理アドレスはリニア アドレスと同じです。これは、Inter が互換性のために物事を非常に複雑にしているのに対し、Linux はそれを単純化して怠惰であることを意味します。

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

メモリ管理方法

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

システムが起動すると、メモリのサイズと状態が検出されます。複雑な構造を確立する前に、これらのメモリを簡単な方法で管理する必要があります。これは bootmem であり、単なるビットマップですが、いくつかのビットマップがあります。最適化のアイデア。

bootmem がどれほど最適化されていても、効率は高くありません。結局のところ、メモリを割り当てるときにそれを通過する必要があります。バディ システムはこの問題を解決できます。2 のべき乗サイズの空きメモリ フラグメントを内部的に保存するだけです。 3 ページを割り当てたい場合は、4 ページのリストから 1 ページを選択し、3 ページを割り当て、残りの 1 ページを元に戻すという、メモリ解放のプロセスはその逆のプロセスです。画像を使用してそれを表します:

0、4、5、6、7 がすべて使用されていることがわかります。では、1 と 2 がリリースされたら、それらはマージされるのでしょうか?

リーリー

上記のコードからわかるように、0 と 1 はバディ、2 と 3 はバディであり、1 と 2 は隣接していますが、隣接していません。メモリの断片化はシステム運用の大敵ですが、バディシステムの仕組みにより断片化をある程度防ぐことができ、さらに cat /proc/buddyinfo で各オーダーの空きページ数を取得することができます。

パートナー システムがメモリを割り当てるたびに、メモリはページ (4KB) 単位で割り当てられますが、システムの実行中に使用されるデータ構造のほとんどは非常に小さいため、小さなメモリに 4KB を割り当てるのは明らかにコスト効率が良くありません。物体。 。 Linux でスラブを使用して小さなオブジェクトの割り当てを解決します: Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

実行中は、一部のメモリを相棒に「卸し」、加工して細かく切り、大量に「販売」します。大規模マルチプロセッサ システムと NUMA システムの広範な適用により、スラブはついにその欠点を明らかにしました:

複雑なキュー管理

Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

管理データとキューストレージのオーバーヘッドが大きい

  1. 長時間実行される部分キューは非常に長くなる可能性があります
  2. NUMA サポートは非​​常に複雑です
  3. これらの問題を解決するために、専門家はスラブを開発しました。ページ構造を変換してスラブ管理構造のオーバーヘッドを削減し、各 CPU にローカルでアクティブなスラブ (kmem_cache_cpu) を持たせるなどです。小規模な組み込みシステムの場合は、スラブ シミュレーション レイヤー スロブがあり、そのようなシステムではより多くの利点があります。
  4. 小内存的问题算是解决了,但还有一个大内存的问题:用伙伴系统分配10 x 4KB的数据时,会去16 x 4KB的空闲列表里面去找(这样得到的物理内存是连续的),但很有可能系统里面有内存,但是伙伴系统分配不出来,因为他们被分割成小的片段。那么,vmalloc就是要用这些碎片来拼凑出一个大内存,相当于收集一些“边角料”,组装成一个成品后“出售”:

    Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

    之前的内存都是直接映射的,第一次感觉到页式管理的存在:D 另外对于高端内存,提供了kmap方法为page分配一个线性地址。

    进程由不同长度的段组成:代码段、动态库的代码、全局变量和动态产生数据的堆、栈等,在Linux中为每个进程管理了一套虚拟地址空间:

    Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

    在我们写代码malloc完以后,并没有马上占用那么大的物理内存,而仅仅是维护上面的虚拟地址空间而已,只有在真正需要的时候才分配物理内存,这就是COW(COPY-ON-WRITE:写时复制)技术,而物理分配的过程就是最复杂的缺页异常处理环节了,下面来看!

    缺页异常

    在实际需要某个虚拟内存区域的数据之前,和物理内存之间的映射关系不会建立。如果进程访问的虚拟地址空间部分尚未与页帧关联,处理器自动引发一个缺页异常。在内核处理缺页异常时可以拿到的信息如下:

    1. cr2:访问到线性地址
    2. err_code:异常发生时由控制单元压入栈中,表示发生异常的原因
    3. regs:发生异常时寄存器的值

    处理的流程如下:

    Linux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。

    发生缺页异常的时候,可能因为不常使用而被swap到磁盘上了,swap相关的命令如下:

    swapon                        开启swap
    swapoff                       关闭swap
    /proc/sys/vm/swapiness        分值越大越积极使用swap,可以修改/etc/sysctl.conf中添加vm.swappiness=xx[1-100]来修改
    

    如果内存是mmap映射到内存中的,那么在读、写对应内存的时候也会产生缺页异常。

    在Linux中,内存管理是一个复杂的主题,但是如果程序员能够理解并充分利用它,他们可以极大地提高他们的程序的性能和可靠性。在本文中,我们介绍了Linux内存管理的基本知识、虚拟内存的概念、内存映射文件以及交换空间等。此外,我们还介绍了一些有助于程序员优化内存使用的技巧和工具。现在,不要再让程序的性能拖慢了你的项目,去掌握Linux内存管理吧!

以上がLinux のメモリ管理をマスターして、プログラムのパフォーマンスを向上させましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。