Sejauh yang saya tahu setiap utas mendapatkan tumpukan yang berbeda ketika utas dibuat oleh sistem operasi. Saya ingin tahu apakah setiap utas memiliki tumpukan yang berbeda untuk dirinya sendiri juga?
Sejauh yang saya tahu setiap utas mendapatkan tumpukan yang berbeda ketika utas dibuat oleh sistem operasi. Saya ingin tahu apakah setiap utas memiliki tumpukan yang berbeda untuk dirinya sendiri juga?
Jawaban:
Tidak. Semua utas berbagi tumpukan yang sama.
Setiap utas memiliki tumpukan pribadi , yang dapat dengan cepat menambah dan menghapus item. Ini membuat memori berbasis tumpukan cepat, tetapi jika Anda menggunakan terlalu banyak memori tumpukan, seperti yang terjadi dalam rekursi tak terbatas, Anda akan mendapatkan tumpukan melimpah.
Karena semua utas berbagi heap yang sama, akses ke pengalokasi / deallocator harus disinkronkan. Ada berbagai metode dan pustaka untuk menghindari perselisihan pengalokasi .
Beberapa bahasa memungkinkan Anda membuat kumpulan memori pribadi, atau tumpukan individu, yang dapat Anda tetapkan ke satu utas.
you will get a stack overflow.
Stack overflow di Stack Overflow!
Secara default, C hanya memiliki satu heap.
Meskipun demikian, beberapa pengalokasi yang sadar thread akan mempartisi heap sehingga setiap thread memiliki area sendiri untuk dialokasikan. Idenya adalah ini harus membuat skala heap lebih baik.
Salah satu contoh tumpukan tersebut adalah Hoard .
Tergantung pada OS-nya. Runtime c standar pada windows dan unices menggunakan heap bersama di seluruh thread. Ini berarti mengunci setiap malloc / gratis.
Di Symbian, misalnya, setiap utas dilengkapi dengan heapnya sendiri, meskipun utas dapat membagikan petunjuk ke data yang dialokasikan di heap mana pun. Desain Symbian lebih baik menurut saya karena tidak hanya menghilangkan kebutuhan penguncian selama alokasi / bebas, tetapi juga mendorong spesifikasi kepemilikan data yang bersih di antara utas. Juga dalam kasus ketika utas mati, ia mengambil semua objek yang dialokasikan bersamanya - yaitu tidak dapat membocorkan objek yang telah dialokasikan, yang merupakan properti penting untuk dimiliki di perangkat seluler dengan memori terbatas.
Erlang juga mengikuti desain serupa di mana "proses" bertindak sebagai unit pengumpulan sampah. Semua data dikomunikasikan antara proses dengan menyalin, kecuali untuk blob biner yang referensi dihitung (saya pikir).
Tergantung pada apa yang Anda maksud saat mengucapkan "heap".
Semua utas berbagi ruang alamat, jadi objek dengan alokasi heap dapat diakses dari semua utas. Secara teknis, tumpukan juga dibagikan dalam pengertian ini, yaitu tidak ada yang mencegah Anda mengakses tumpukan utas lain (meskipun hampir tidak masuk akal untuk melakukannya).
Di sisi lain, ada struktur heap yang digunakan untuk mengalokasikan memori. Di situlah semua pembukuan untuk alokasi memori heap dilakukan. Struktur ini diatur secara canggih untuk meminimalkan perselisihan di antara utas - jadi beberapa utas mungkin berbagi struktur heap (arena), dan beberapa mungkin menggunakan arena yang berbeda.
Lihat utas berikut untuk penjelasan yang sangat baik tentang detailnya: Bagaimana malloc bekerja di lingkungan multithread?
Biasanya, utas berbagi heap dan sumber daya lainnya, namun ada konstruksi seperti utas yang tidak. Di antara konstruksi seperti utas ini adalah proses ringan Erlang, dan proses lengkap UNIX (dibuat dengan panggilan ke fork()
). Anda mungkin juga bekerja pada konkurensi multi-mesin, dalam hal ini opsi komunikasi antar-utas Anda jauh lebih terbatas.
Secara umum, semua utas menggunakan ruang alamat yang sama dan oleh karena itu biasanya hanya memiliki satu tumpukan.
Namun, ini bisa sedikit lebih rumit. Anda mungkin mencari Thread Local Storage (TLS), tetapi hanya menyimpan nilai tunggal.
Khusus Windows: TLS-space dapat dialokasikan menggunakan TlsAlloc dan dibebaskan menggunakan TlsFree (Ringkasan di sini ). Sekali lagi, ini bukan heap, hanya DWORD.
Anehnya, Windows mendukung banyak Heaps per proses. Seseorang dapat menyimpan pegangan Heap di TLS. Kemudian Anda akan memiliki sesuatu seperti "Thread-Local Heap". Namun, hanya pegangan yang tidak diketahui oleh utas lainnya, mereka masih dapat mengakses memorinya menggunakan pointer karena ruang alamatnya masih sama.
EDIT : Beberapa pengalokasi memori (khususnya jemalloc di FreeBSD) menggunakan TLS untuk menetapkan "arena" ke utas. Ini dilakukan untuk mengoptimalkan alokasi untuk beberapa inti dengan mengurangi overhead sinkronisasi.
Pada sistem Operasi FreeRTOS, tugas (utas) berbagi tumpukan yang sama tetapi masing-masing memiliki tumpukannya sendiri. Ini sangat berguna ketika berhadapan dengan arsitektur RAM rendah daya rendah, karena kumpulan memori yang sama dapat diakses / dibagikan oleh beberapa utas, tetapi ini hadir dengan sedikit tangkapan, pengembang perlu mengingat bahwa mekanisme untuk menyinkronkan malloc dan gratis diperlukan, itulah mengapa perlu menggunakan beberapa jenis sinkronisasi proses / kunci saat mengalokasikan atau membebaskan memori di heap, misalnya semaphore atau mutex.