Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah bahasa Go mempunyai kutipan sampah?

Adakah bahasa Go mempunyai kutipan sampah?

青灯夜游
青灯夜游asal
2022-12-09 19:42:386995semak imbas

Bahasa Go mempunyai kutipan sampah. Bahasa Go datang dengan mekanisme pengumpulan sampah (GC); GC dilaksanakan melalui proses yang berasingan. dalam pengiraan. Ruang memori mengandungi dua kawasan penting: kawasan timbunan (Timbunan) dan kawasan timbunan (Timbunan); kawasan timbunan biasanya menyimpan parameter, nilai pulangan dan pembolehubah tempatan panggilan fungsi, tidak menghasilkan pemecahan memori, diuruskan oleh pengkompil, dan tidak memerlukan pembangunan Kawasan timbunan akan menjana serpihan memori Dalam bahasa Go, objek dalam kawasan timbunan diperuntukkan oleh pengagih memori dan dikitar semula oleh pengumpul sampah.

Adakah bahasa Go mempunyai kutipan sampah?

Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.

Bahasa Go mempunyai mekanisme pengumpulan sampah (GC) tersendiri. GC dilakukan oleh proses berasingan, yang mencari pembolehubah yang tidak lagi digunakan dan membebaskannya. Perlu diingatkan bahawa GC akan menduduki sumber mesin apabila berjalan.

Penjelasan terperinci tentang mekanisme kutipan sampah GC dalam bahasa Go

Dalam sains komputer, kutipan sampah (Kutipan Sampah, dirujuk sebagai GC) ialah Mekanisme automatik untuk menguruskan ingatan, pengumpul sampah akan cuba mengitar semula objek dan memori yang diduduki oleh program yang tidak lagi digunakan

Pengaturcara mendapat manfaat daripada GC dan tidak perlu lagi risau atau memohon secara manual untuk operasi ingatan dan pelepasan, GC secara automatik mengeluarkan baki memori apabila program sedang dijalankan
GC hampir tidak dapat dilihat oleh pengaturcara Hanya apabila program memerlukan pengoptimuman khas, pemasaan berjalan dan overhed berjalan GC boleh dilaraskan dengan menyediakan kawalan yang boleh dikawal. API. Hanya apabila anda berada di bawah kawalan anda boleh muncul

Dalam pengkomputeran, ruang memori mengandungi dua kawasan penting: kawasan tindanan (Timbunan) dan kawasan timbunan secara amnya menyimpan panggilan fungsi Parameter, nilai pulangan dan pembolehubah tempatan tidak menjana pemecahan memori dan diuruskan oleh pengkompil dan tidak perlu diuruskan oleh pembangun manakala kawasan timbunan menjana pemecahan memori dalam bahasa Go, objek dalam timbunan kawasan diperuntukkan oleh pengagih ingatan dan dikumpul oleh pemungut sampah. [Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]

Biasanya, proses pelaksanaan pemungut sampah dibahagikan kepada dua komponen separa bebas:

  • Program pengguna (Mutator): kod mod pengguna Untuk GC, kod mod pengguna hanya mengubah suai hubungan rujukan antara objek
  • Pengumpul (Pengumpul): bertanggungjawab untuk melaksanakan Kod kutipan sampah

1 Pengurusan dan peruntukan memori

Pergi pengurusan memori apabila memori tidak lagi digunakan Dilaksanakan secara automatik oleh perpustakaan standardnya, iaitu memperuntukkan daripada memori kepada koleksi Go. Pengurusan memori secara amnya merangkumi tiga komponen yang berbeza, iaitu atur cara pengguna (Mutator), pengalokasi (Allocator) dan pengumpul (Pengumpul) Apabila atur cara pengguna memohon memori, ia akan memohon untuk ingatan baharu melalui pengalokasi memori, dan pengalokasi Akan bertanggungjawab untuk memulakan kawasan memori yang sepadan daripada timbunan

Adakah bahasa Go mempunyai kutipan sampah?

1.1 Kaedah peruntukan pengagih memori

Dalam bahasa pengaturcaraan, pengalokasi memori secara amnya mempunyai dua kaedah peruntukan:

  • Pengumpuk Linear (Pengumpuk Berjujukan, Peruntukan Bump)

  • Senarai Bebas Terbiar Allocator

Linear Allocator

Linear Allocation (Bump Allocator) ialah kaedah peruntukan memori yang cekap, tetapi ia mempunyai had utama. Apabila pengguna menggunakan pengagih linear, dia hanya perlu mengekalkan penunjuk ke lokasi memori tertentu dalam ingatan Jika program pengguna memohon memori daripada pengalokasi, pengalokasi hanya perlu menyemak baki memori kosong, kembalikan memori yang diperuntukkan. kawasan dan ubah suai penunjuk dalam Lokasi dalam ingatan

Walaupun pengalokasi linear mempunyai kelajuan pelaksanaan yang lebih pantas dan kerumitan pelaksanaan yang lebih rendah, pengalokasi linear tidak boleh menggunakan semula memori selepas memori dikeluarkan. Seperti yang ditunjukkan dalam rajah di bawah, jika memori yang diperuntukkan dikitar semula, pengalokasi linear tidak boleh menggunakan semula memori merah

Adakah bahasa Go mempunyai kutipan sampah?

Oleh itu, pengalokasi linear perlu digunakan bersama-sama dengan algoritma kutipan sampah yang sesuai

  • Mark-Compact

  • Menyalin GC)

  • Kitar semula generasi (Generasional GC)

Algoritma di atas boleh menyahfragmentasi objek yang masih hidup melalui penyalinan dan penggabungan memori percuma dengan kerap, supaya kecekapan pengalokasi linear boleh digunakan untuk meningkatkan prestasi pengalokasi memori .

Free-List Allocator

Free-List Allocator (Free-List Allocator) boleh menggunakan semula memori yang telah dikeluarkan Ia akan mengekalkan senarai terpaut secara dalaman. struktur data. Apabila program pengguna memohon untuk ingatan, pengalokasi senarai terpaut percuma akan merentasi blok memori percuma untuk mencari memori yang cukup besar, kemudian memohon sumber baharu dan mengubah suai senarai terpaut

Adakah bahasa Go mempunyai kutipan sampah?

Terdapat empat strategi biasa untuk pengagih senarai terpaut percuma:

  • First-Fit - melintasi dari kepala senarai terpaut dan pilih saiz pertama Memori blok lebih besar daripada memori yang diminta
  • Loop penyesuaian pertama (Next-Fit) — Traverse dari penghujung traversal terakhir, dan pilih blok memori pertama yang saiznya lebih besar daripada memori yang diminta
  • Penyesuaian optimum (Paling Sesuai) — Melintasi keseluruhan senarai terpaut dari kepala senarai terpaut, pilih blok memori yang paling sesuai
  • Penyesuaian Terpisah (Segregated-Fit) — Pisahkan memori kepada beberapa senarai terpaut, saiz blok memori dalam setiap senarai terpaut Sama, apabila memohon memori, mula-mula cari senarai terpaut yang memenuhi syarat, dan kemudian pilih blok memori yang sesuai daripada senarai terpaut

Strategi keempat ialah serupa dengan strategi peruntukan memori yang digunakan dalam bahasa Go

Adakah bahasa Go mempunyai kutipan sampah?

Strategi ini akan membahagikan memori kepada senarai terpaut yang terdiri daripada blok memori 4, 8, 16 dan 32-bait . Apabila kita memohon memori 8-bait daripada pengagih memori, ia akan Cari blok memori percuma yang memenuhi syarat dalam rajah di atas dan mengembalikannya. Strategi peruntukan penyesuaian pengasingan mengurangkan bilangan blok memori yang perlu dilalui dan meningkatkan kecekapan peruntukan memori

1.2 Peruntukan memori dalam Go

Gambar menunjukkan komposisi peruntukan memori:

Adakah bahasa Go mempunyai kutipan sampah?

Dalam bahasa Go, semua objek pada timbunan akan memperuntukkan memori dengan memanggil runtime.newobject fungsi, yang Fungsi akan memanggil runtime.mallocgc untuk memperuntukkan ruang memori saiz yang ditentukan Ini juga merupakan fungsi yang diperlukan untuk program pengguna untuk memohon ruang memori pada timbunan >

Seperti yang dapat dilihat daripada kod
func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
	mp := acquirem()
	mp.mallocing = 1

	c := gomcache()
	var x unsafe.Pointer
	noscan := typ == nil || typ.ptrdata == 0
	if size  Laksanakan logik peruntukan yang berbeza mengikut saiz objek, bahagikan kepada objek mikro, objek kecil dan objek besar mengikut saiz <p><code>runtime.mallocgc</code></p> Objek mikro
    — Gunakan pengalokasi mikro dahulu, kemudian cuba utas dalam urutan Cache, cache pusat dan memori yang diperuntukkan timbunan
  • (0, 16B)Objek kecil
  • — Cuba peruntukkan memori menggunakan cache benang, cache pusat dan timbunan masuk perintah
  • [16B, 32KB]Objek besar
  • — Peruntukkan memori terus pada timbunan
  • (32KB, +∞)

Adakah bahasa Go mempunyai kutipan sampah?

Peruntukan kecil

Untuk peruntukan kecil kurang daripada 32kb, Go akan cuba mendapatkannya daripada cache setempat

Dapatkan memori, cache mengendalikan senarai span (blok memori 32kb)

mcachemspan

Adakah bahasa Go mempunyai kutipan sampah?Setiap utas M diperuntukkan kepada pemproses P, memproses paling banyak satu demi satu

. Apabila memperuntukkan memori,

semasa akan menggunakan cache P setempat semasanya untuk mencari objek percuma pertama yang tersedia dalam senarai goroutine goroutinespan

Peruntukan Besar

Pergi tidak menggunakan cache tempatan untuk menguruskan peruntukan yang besar. Peruntukan yang lebih besar daripada 32kb ini dibundarkan kepada saiz halaman dan halaman diperuntukkan terus kepada timbunan

Adakah bahasa Go mempunyai kutipan sampah?

2. Pengumpulan sampahDalam bahasa Go, algoritma yang dilaksanakan oleh pengumpul sampah ialah tanda tiga warna serentak dan pengumpul imbasan

Pengumpul sampah berjalan pada masa yang sama sebagai program Go, jadi ia perlu dilalui algoritma

write barrier

untuk mengesan potensi perubahan dalam ingatan. Satu-satunya syarat untuk memulakan halangan tulis ialah menghentikan program untuk tempoh masa yang singkat, iaitu "Hentikan Dunia" Integriti data pada timbunan

Adakah bahasa Go mempunyai kutipan sampah?

2.1 Prinsip pelaksanaan

Pengumpulan sampah bahasa Go boleh dibahagikan kepada penamatan jelas, penandaan dan penamatan tanda dan empat fasa pembersihan yang berbeza, dua daripadanya menjana Stop The World (STW)

Kosongkan fasa penamatan

Jeda program dan semua pemproses akan memasuki titik selamat pada masa ini Adakah bahasa Go mempunyai kutipan sampah?

Jika semasa kitaran kutipan sampah dicetuskan secara paksa, kita juga perlu berurusan dengan unit pengurusan memori yang belum dibersihkan

Fasa Penandaan (STW)
    • Tukar keadaan kepada _GCmark, dayakan penghalang tulis, bantuan atur cara pengguna (Mutator Assists) dan arahkan objek akar

    • Sambung semula pelaksanaan program , Proses penandaan dan program pengguna membantu akan mula menandakan objek secara serentak dalam ingatan Halangan tulis akan menandakan kedua-dua penunjuk yang ditimpa dan penunjuk baharu dalam warna kelabu, dan semua objek yang baru dibuat akan ditandakan secara langsung dengan warna hitam

    • Mula mengimbas objek akar, termasuk semua tindanan Goroutine, objek global dan struktur data masa jalan yang tiada dalam timbunan Pemproses semasa akan dijeda semasa pengimbasan tindanan Goroutine

    • Proses objek dalam baris gilir kelabu mengikut turutan, tandakan objek hitam dan tandakan objek yang mereka tunjuk kepada kelabu
    • Gunakan algoritma penamatan teragih untuk menyemak kerja yang tinggal dan temui fasa penandaan Selepas selesai, masukkan fasa penamatan tanda
    fasa penamatan tanda (STW)

    jeda program, tukar status kepada
      dan Program pengguna yang mematikan tag tambahan
    • _GCmarkterminationBersihkan cache benang pada pemproses
    Fasa pembersihan

      Tukar status Tukar kepada
    • untuk memulakan fasa pembersihan, mulakan keadaan pembersihan dan tutup halangan tulis

      _GCoff

    • Pulihkan atur cara pengguna, semua objek yang baru dibuat akan ditandakan dengan warna putih
    • Bersihkan semua unit pengurusan memori di latar belakang secara serentak akan dicetuskan apabila Goroutine memohon untuk unit pengurusan memori baharu

    2.2 Tanda tiga warna Algoritma penandaan tiga warna tiga warna membahagikan objek dalam atur cara kepada tiga kategori: putih, hitam dan kelabu:

    Objek putih - potensi sampah, yang ingatannya mungkin sampah Pengumpul mengitar semula

    objek hitam - objek aktif, termasuk objek yang tidak mempunyai sebarang rujukan kepada penunjuk luaran dan objek yang boleh dicapai daripada objek akar
    • objek kelabu - objek aktif, kerana terdapat penunjuk ke putih Penunjuk luaran objek, pengumpul sampah akan mengimbas sub-objek objek ini
    • Prinsip kerja tanda tiga warna pengumpul sampah adalah sangat mudah dan boleh diringkaskan ke dalam langkah-langkah berikut:

    Pilih objek kelabu daripada koleksi objek kelabu dan tandakannya hitam

    • Tandakan semua objek yang ditunjuk oleh objek hitam sebagai kelabu, pastikan objek mahupun objek yang dirujuk oleh objek tidak akan dikitar semula

    • Ulang dua langkah di atas sehingga tiada warna kelabu objek dalam graf objek

    Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati:

    Video Pengaturcaraan1Adakah bahasa Go mempunyai kutipan sampah?! !

Atas ialah kandungan terperinci Adakah bahasa Go mempunyai kutipan sampah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn