Rumah  >  Artikel  >  Tutorial sistem  >  Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

WBOY
WBOYke hadapan
2024-02-13 16:40:16909semak imbas

Linux, sebagai sistem pengendalian yang digunakan secara meluas dalam pelayan dan peranti terbenam, menduduki bahagian pasaran yang semakin meningkat. Dalam senario ini, pengurusan memori adalah penting kerana ia secara langsung mempengaruhi prestasi dan kestabilan sistem, terutamanya untuk pengaturcara. Bagi pengaturcara yang ingin membangunkan aplikasi berprestasi tinggi pada platform Linux, kemahiran dalam pengurusan memori Linux adalah satu kemestian. Hari ini kami akan memperkenalkan artikel yang harus dibaca oleh setiap pengaturcara: Pengurusan memori Linux.
Apa yang anda perlu tahu tentang bahagian ingatan:

  1. Pemetaan alamat
  2. Kaedah pengurusan memori
  3. Tiada pengecualian halaman

Mari kita lihat dahulu beberapa pengetahuan asas Dari perspektif proses, memori dibahagikan kepada dua bahagian: mod kernel dan mod pengguna Nisbah klasik adalah seperti berikut:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!
Dari mod pengguna kepada mod kernel biasanya dicapai melalui panggilan sistem dan gangguan. Memori mod pengguna dibahagikan kepada kawasan yang berbeza untuk tujuan yang berbeza:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Sudah tentu, mod kernel tidak akan digunakan secara sembarangan, jadi ia dibahagikan seperti berikut:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Mari kita lihat dengan lebih dekat bagaimana kenangan ini diuruskan.

Alamat

Proses pemetaan alamat dalam Linux ialah alamat logik –> alamat linear –> alamat fizikal adalah yang paling mudah: isyarat digital yang dihantar dalam bas alamat, manakala alamat linear dan alamat logik mewakili peraturan penukaran adalah seperti berikut:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Bahagian ini dilengkapkan oleh MMU, yang melibatkan daftar utama CR0 dan CR3. Apa yang muncul dalam arahan mesin ialah alamat logik, dan peraturan alamat logik adalah seperti berikut:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Alamat logik dalam Linux adalah sama dengan alamat linear, yang bermaksud bahawa Inter menjadikan perkara yang sangat rumit untuk keserasian, dan Linux memudahkannya menjadi malas.

Cara menguruskan memori

Apabila sistem but, ia akan mengesan saiz dan keadaan memori Sebelum membina struktur yang kompleks, adalah perlu untuk menguruskan kenangan ini dengan cara yang mudah. ​​Ini adalah bootmem, yang hanya peta bit, tetapi terdapat juga beberapa pengoptimuman di dalamnya.

Tidak kira betapa dioptimumkan bootmem, kecekapannya tidak tinggi Lagipun, ia perlu dilalui apabila memperuntukkan memori Sistem rakan boleh menyelesaikan masalah ini: secara dalaman menyimpan beberapa serpihan memori percuma dengan kuasa 2 ingin memperuntukkan 3 muka surat, Pergi ke senarai 4 muka surat dan pilih satu, peruntukkan 3 dan kemudian letakkan baki 1 kembali Proses pelepasan memori hanyalah proses terbalik. Gunakan gambar untuk mewakilinya:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Anda dapat melihat bahawa 0, 4, 5, 6, dan 7 semuanya sedang digunakan Jadi, apabila 1 dan 2 dilepaskan, adakah ia akan digabungkan?

static inline unsigned long
__find_buddy_index(unsigned long page_idx, unsigned int order)
{
    return page_idx ^ (1 

Seperti yang anda lihat daripada kod di atas, 0 dan 1 ialah rakan, dan 2 dan 3 ialah rakan Walaupun 1 dan 2 bersebelahan, mereka tidak. Pemecahan memori adalah musuh operasi sistem Mekanisme sistem rakan boleh menghalang pemecahan pada tahap tertentu Selain itu, kita boleh mendapatkan bilangan halaman percuma dalam setiap pesanan melalui cat /proc/buddyinfo.

Setiap kali sistem rakan kongsi memperuntukkan memori, ia adalah dalam unit halaman (4KB), tetapi kebanyakan struktur data yang digunakan semasa sistem berjalan adalah sangat kecil. Ia jelas tidak menjimatkan kos untuk memperuntukkan 4KB kepada objek kecil. Gunakan papak dalam Linux untuk menyelesaikan peruntukan objek kecil:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

Apabila berlari, sapukan "borong" beberapa memori kepada rakan, proses dan potong menjadi kepingan dan "jual" secara pukal. Dengan aplikasi meluas sistem berbilang pemproses berskala besar dan sistem NUMA, papak akhirnya mendedahkan kelemahannya:

  1. Pengurusan giliran yang kompleks
  2. Menguruskan data dan storan baris gilir adalah mahal
  3. Barisan beratur separa yang panjang boleh menjadi sangat panjang
  4. Sokongan NUMA sangat rumit

Untuk menyelesaikan masalah ini, pakar telah membangunkan slub: struktur halaman diubah suai untuk mengurangkan overhed struktur pengurusan papak, setiap CPU mempunyai papak aktif setempat (kmem_cache_cpu), dsb. Untuk sistem terbenam kecil, terdapat lapisan simulasi papak, yang mempunyai lebih banyak kelebihan dalam sistem sedemikian.

小内存的问题算是解决了,但还有一个大内存的问题:用伙伴系统分配10 x 4KB的数据时,会去16 x 4KB的空闲列表里面去找(这样得到的物理内存是连续的),但很有可能系统里面有内存,但是伙伴系统分配不出来,因为他们被分割成小的片段。那么,vmalloc就是要用这些碎片来拼凑出一个大内存,相当于收集一些“边角料”,组装成一个成品后“出售”:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

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

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

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

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

缺页异常

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

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

处理的流程如下:

Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!

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

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

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

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

Atas ialah kandungan terperinci Kuasai pengurusan memori Linux dan tingkatkan prestasi program anda!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lxlinux.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam