Bagikan melalui


Ukuran Tumpukan Utas

Setiap utas atau serat baru menerima ruang tumpukannya sendiri yang terdiri dari memori yang dipesan dan awalnya diterapkan. Ukuran memori yang dipesan mewakili total alokasi tumpukan dalam memori virtual. Dengan demikian, ukuran yang dipesan terbatas pada rentang alamat virtual. Halaman yang awalnya diterapkan tidak menggunakan memori fisik sampai dirujuk; namun, mereka menghapus halaman dari batas total penerapan sistem, yang merupakan ukuran file halaman ditambah ukuran memori fisik. Sistem menerapkan halaman tambahan dari memori tumpukan yang dipesan sesuai kebutuhan, sampai tumpukan mencapai ukuran yang dipesan dikurangi satu halaman (yang digunakan sebagai halaman penjaga untuk mencegah luapan tumpukan) atau sistem sangat rendah memori sehingga operasi gagal.

Yang terbaik adalah memilih ukuran tumpukan sesecil mungkin dan menerapkan tumpukan yang diperlukan agar utas atau serat berjalan dengan andal. Setiap halaman yang dicadangkan untuk tumpukan tidak dapat digunakan untuk tujuan lain.

Tumpukan dibebaskan ketika utasnya keluar. Ini tidak dibebaskan jika utas dihentikan oleh utas lain.

Ukuran default untuk memori tumpukan yang dicadangkan dan awalnya diterapkan ditentukan dalam header file yang dapat dieksekusi. Pembuatan utas atau serat gagal jika tidak ada cukup memori untuk memesan atau menerapkan jumlah byte yang diminta. Ukuran reservasi tumpukan default yang digunakan oleh linker adalah 1 MB. Untuk menentukan ukuran reservasi tumpukan default yang berbeda untuk semua utas dan serat, gunakan pernyataan STACKSIZE dalam file definisi modul (.def). Sistem operasi membulatkan ukuran yang ditentukan ke kelipatan terdekat dari granularitas alokasi sistem (biasanya 64 KB). Untuk mengambil granularitas alokasi sistem saat ini, gunakan fungsi GetSystemInfo .

Untuk mengubah ruang tumpukan yang awalnya diterapkan, gunakan parameter dwStackSize dari fungsi CreateThread, CreateRemoteThread, atau CreateFiber . Nilai ini dibulatkan ke atas ke halaman terdekat. Umumnya, ukuran cadangan adalah ukuran cadangan default yang ditentukan dalam header yang dapat dieksekusi. Namun, jika ukuran yang awalnya diterapkan yang ditentukan oleh dwStackSize lebih besar dari atau sama dengan ukuran cadangan default, ukuran cadangan adalah ukuran penerapan baru ini dibulatkan ke kelipatan terdekat 1 MB.

Untuk mengubah ukuran tumpukan yang dipesan, atur parameter dwCreationFlags dari CreateThread atau CreateRemoteThread ke STACK_SIZE_PARAM_IS_A_RESERVATION dan gunakan parameter dwStackSize . Dalam hal ini, ukuran yang awalnya diterapkan adalah ukuran default yang ditentukan dalam header yang dapat dieksekusi. Untuk serat, gunakan parameter dwStackReserveSize dari CreateFiberEx. Ukuran yang diterapkan ditentukan dalam parameter dwStackCommitSize .

Fungsi SetThreadStackGuarantee menetapkan ukuran minimum tumpukan yang terkait dengan utas panggilan atau serat yang akan tersedia selama pengecualian luapan tumpukan apa pun.