Pertanyaan Perbedaan antara stack dan call stack di multithreading?


Saat membaca jawaban tentang semua hal yang dibagikan oleh thread, saya menemukan istilah "call stack". Sementara saya menyadari fakta bahwa thread memiliki tumpukan mereka sendiri yang tidak mereka bagikan dengan utas lainnya, saya tidak mengerti apa panggilan stack akan berarti sehubungan dengan utas. Saya telah melihat beberapa jawaban tetapi mereka tidak begitu jelas. Harap klarifikasi apa arti tumpukan panggilan dan perbedaannya dengan tumpukan dalam konteks multitasking. Salam


5
2017-11-19 09:54


asal


Jawaban:


Harap klarifikasi arti tumpukan panggilan dan perbedaannya dengan tumpukan   dalam konteks multitasking.

Perbedaannya halus, tetapi ini adalah cara saya memahami hal itu. Seringkali orang menggunakan ini agak interchangeably tetapi panggilan stack adalah semata-mata struktur data. Ini menggambarkan setumpuk panggilan fungsi bersama dengan berbagai status terkait seperti nilai variabel lokal, status pengembalian, dll.

Tumpukan juga merupakan struktur data, tetapi akhirnya a pengalokasi memori. Ini kolam memori yang dialokasikan untuk benang yang akan digunakan untuk hal-hal seperti panggilan stack dengan waktu simetris, sangat sederhana, konstan push dan pop gaya alokasi dan deallocating memori.

Anda mungkin menganggapnya seperti hubungan antara std::vector dan std::allocator, berbicara kasar. std::vector benar-benar sebuah struktur data. std::allocator mengalokasikan memori untuk itu (yang biasanya melibatkan struktur data di balik kap mesin, tetapi struktur data yang digunakan semata-mata untuk manajemen memori). Tapi std::vector tidak harus digunakan std::allocator.

Secara konseptual, call stack tidak benar-benar harus menggunakan stack untuk mengalokasikan memori. Akan sulit untuk menemukan, dalam praktiknya, kompiler yang pernah melakukan ini. Misalnya, tumpukan panggilan dapat benar-benar menggunakan tumpukan alih-alih tumpukan. Ini sebenarnya bisa membutuhkan alokasi memori linear-waktu setiap kali ingin hanya mendorong argumen untuk panggilan fungsi. Ini akan mengerikan, tetapi itu tidak bertentangan dengan konsep call stack.

Biasanya memanggil tumpukan menggunakan tumpukan thread-lokal untuk mengalokasikan memori karena praktis, efisien, sesuai dengan sifat LIFO alokasi / alokasi yang diharapkan, dan memungkinkan setiap utas untuk memiliki ruang memorinya sendiri (mengurangi kemacetan yang terkait dengan akses memori bersama).


2
2017-11-19 10:10



Call stack adalah struktur data stack yang menyimpan informasi tentang subrutin aktif dari program komputer.

Di mana tumpukan benang adalah tumpukan tumpukan pribadi dan Anda mengetahuinya.

Jika thread menjalankan fungsi, fungsi saat itu call stack akan disimpan ke dalam thread stack .

Kedua hal ini pada dasarnya sama. Mereka sama-sama menumpuk struktur data.


1
2017-11-19 10:11



Baca wiki tentang sebut tumpukan dan multithreading.

Dalam teori murni, implementasi C mungkin bahkan tidak menggunakan tumpukan apa pun. Dalam prakteknya, setiap dikompilasi Implementasi C yang saya dengar menggunakan call stack yang merupakan tumpukan prosesor (beberapa prosesor, mungkin Itanium IA-64, semacam-memiliki dua tumpukan mesin) ketika ada satu (AFAIK, IBM z Series mainframe tidak memilikinya perangkat keras stack, itu adalah penggunaan konvensional dari beberapa register). Jadi untuk sebagian besar prosesor & ABIs (ARM, x86, x86-64, ...) call stack adalah stack dan setiap thread memiliki miliknya sendiri.


0
2017-11-19 10:09