Apa utas yang dibagikan secara umum?


20

Nah ini pertanyaan umum. Dan jika ada yang ingin membuatnya implementasi spesifik maka saya akan lebih suka hal-hal terkait Unix. Tetapi pertama-tama perlu diketahui masalah berikut secara umum:

Saya membaca proses tunggal dapat memiliki beberapa utas. Beberapa utas proses yang sama memang berbagi hal-hal di antara mereka. Saya ingin tahu apa yang mereka bagikan dan apa yang tidak. Mempertimbangkan proses terdiri dari ruang alamat, tumpukan, tumpukan, variabel global, kode, data, sumber daya OS, apa di antara mereka dibagi oleh utas? Saya memiliki dugaan sebagai berikut:

  1. Variabel global - Saya telah membaca thread berbagi variabel global. Juga saat pemrograman di Java dan C #, saya telah membuat utas untuk berbagi variabel tingkat kelas. Jadi saya percaya bahwa utas berbagi variabel global (meskipun tidak yakin apakah konsep dalam bahasa pemrograman tingkat tinggi diterjemahkan sebagaimana halnya dengan fakta tingkat sistem operasi rendah).

  2. Heap - Karena variabel global disimpan di heap, heap dibagi di antara utas.

  3. Stack - Karena setiap utas dapat memiliki urutan / kode eksekusi sendiri, ia harus memiliki tumpukannya sendiri di mana ia dapat mendorong / pop konten program counternya (ketika mengatakan panggilan fungsi dan pengembalian terjadi). Jadi utas dari proses yang sama tidak berbagi tumpukan.

Sekarang saya tidak yakin tentang berbagi hal-hal berikut

  1. Address space - Tidak yakin apa yang sebenarnya diperhitungkan di dalam address space. Tapi saya kira address space umumnya digunakan dalam konteks proses, bukan utas. Dan karena semua utas dari proses yang sama berada di ruang alamat yang sama dengan proses induk, dikatakan bahwa utas berbagi ruang alamat. (Tapi kemudian mereka mempertahankan tumpukan berbeda di dalam ruang alamat yang sama?)

  2. Sumber daya OS - Saya kira ini bisa sangat spesifik implementasi. Misalnya, proses induk dapat secara selektif menangani file yang sama untuk beberapa utasnya dan tidak untuk semua. Atau saya salah dan sumber daya OS berarti sesuatu selain file?

  3. Kode - Utas dapat memiliki kode yang berbeda, sehingga kode berbagi tidak selalu demikian.

  4. Data - Tidak yakin tentang apa yang harus dipertimbangkan dalam data. Tetapi yakin bahwa variabel global dibagi di antara utas. Dan yakin bahwa variabel lokal tidak dibagikan secara serupa.

Secara keseluruhan saya sangat bingung karena istilah yang tidak jelas, generalisasi super yang dilakukan dalam buku Sistem Operasi dan detail spesifik implementasi ekstra yang disediakan secara online. Jadi saya berusaha mencari jawaban yang dapat memuaskan saya.

Jawaban:


13

Secara umum setiap utas memiliki register sendiri (termasuk penghitung programnya sendiri), penunjuk tumpukannya sendiri, dan tumpukannya sendiri. Segala sesuatu yang lain dibagikan di antara utas yang berbagi proses.

Secara khusus suatu proses umumnya dianggap terdiri dari serangkaian utas yang berbagi ruang alamat, heap, data statis, dan segmen kode, dan deskriptor file * .

Ruang alamat hanyalah pemetaan alamat logis untuk bagian tertentu dari memori fisik. Jadi ketika kita mengatakan bahwa semua utas dalam suatu proses berbagi ruang alamat yang sama, artinya saat mengakses variabel foodalam lingkup global semua utas akan melihat variabel yang sama. Demikian pula, utas-utas semuanya dapat menjalankan titik berbeda dalam kode pada waktu tertentu, tetapi semuanya diizinkan untuk memanggil fungsi global bar(), yang akan sesuai dengan fungsi yang sama untuk setiap utas dalam proses.

Sebagian besar sistem operasi modern telah menambahkan gagasan penyimpanan lokal utas , yang merupakan variabel lingkup global yang tidak dibagi. Contoh umum penggunaan ini adalah untuk variabel errno. Itu adalah variabel tunggal lingkup global, tetapi dalam kebanyakan sistem operasi modern setiap utas diberi salinan lokalnya sendiri, sehingga kesalahan dalam panggilan pustaka pada satu utas tidak akan memengaruhi perilaku utas lainnya.

* Ada beberapa status proses tambahan yang dibagikan oleh semua utas dalam suatu proses, hal-hal seperti id proses, penanganan sinyal, dan kunci file. Untuk daftar lengkap kondisi proses yang dibagikan oleh utas, Anda perlu melihat dokumentasi untuk penerapan threading tertentu. Misalnya, halaman manual pthreads .


4

Utas muncul dalam dua perspektif: sistem operasi, dan bahasa pemrograman. Dalam kedua kasus, ada beberapa variasi dalam atribut apa yang dimiliki thread.

Definisi minimal utas adalah bahwa hal-hal yang terjadi secara berurutan, satu demi satu.

Dalam model eksekusi mesin yang khas, setiap utas memiliki set register tujuan umum dan penghitung programnya sendiri. Jika mesin menetapkan register spesifik sebagai penunjuk tumpukan, ada satu salinan per utas.

Dari perspektif sistem operasi, minimum yang perlu dilakukan sistem operasi untuk mendukung utas adalah menyediakan cara untuk beralih di antara mereka. Ini dapat terjadi baik secara otomatis ( multitasking premptive atau hanya ketika utas membuat permintaan eksplisit (multitasking kooperatif; dalam hal ini utas kadang-kadang disebut serat ). Ada juga model hibrida dengan hasil preemption dan kooperatif, misalnya preemption antara utas grup yang berbeda atau tugas tetapi menghasilkan secara eksplisit antara utas dari grup / tugas yang sama.Pindah antar utas melibatkan minimal menyimpan nilai register dari utas lama dan mengembalikan nilai register utas baru.

Dalam sistem operasi multitasking yang menyediakan isolasi antara tugas (atau proses , Anda dapat memperlakukan istilah ini sebagai sinonim dalam konteks OS), setiap tugas memiliki sumber dayanya sendiri, dalam ruang alamat tertentu, tetapi juga membuka file, hak istimewa, dll. Isolasi memiliki harus disediakan oleh kernel sistem operasi , suatu entitas yang berada di atas proses. Setiap tugas biasanya memiliki setidaknya satu utas - tugas yang tidak mengeksekusi kode tidak banyak digunakan. Sistem operasi mungkin atau mungkin tidak mendukung banyak utas dalam tugas yang sama; misalnya Unix yang asli tidak. Suatu tugas masih dapat menjalankan banyak utas dengan mengatur untuk beralih di antara mereka - ini tidak memerlukan hak istimewa khusus. Ini disebut “ utas pengguna”, Khususnya dalam konteks Unix. Saat ini sebagian besar sistem Unix memang menyediakan utas kernel, khususnya karena itu satu-satunya cara untuk memiliki beberapa utas dari proses yang sama berjalan pada prosesor yang berbeda.

Sebagian besar sumber daya sistem operasi selain dari waktu komputasi melekat pada tugas, bukan utas. Beberapa sistem operasi (misalnya, Linux) secara eksplisit membatasi tumpukan, dalam hal ini setiap utas memiliki sendiri; tetapi ada OS di mana kernel tidak tahu apa-apa tentang tumpukan, mereka hanya bagian dari tumpukan sejauh yang bersangkutan. Kernel juga biasanya mengelola konteks kernel untuk setiap utas, yang merupakan struktur data yang berisi informasi tentang apa yang sedang dilakukan utas; ini memungkinkan kernel menangani banyak utas yang diblokir dalam panggilan sistem pada saat yang bersamaan.

Sejauh menyangkut sistem operasi, utas tugas menjalankan kode yang sama, tetapi berada pada posisi yang berbeda dalam kode tersebut (nilai-nilai program counter berbeda). Mungkin atau mungkin tidak terjadi bahwa bagian-bagian tertentu dari kode suatu program selalu dieksekusi di utas tertentu, tetapi biasanya ada kode umum (misalnya fungsi utilitas) yang dapat dipanggil dari utas apa pun. Semua utas melihat data yang sama, kalau tidak mereka akan dianggap tugas yang berbeda; jika beberapa data hanya dapat diakses oleh utas tertentu, itu biasanya semata-mata bidang bahasa pemrograman, bukan dari sistem operasi.

Dalam sebagian besar bahasa pemrograman, penyimpanan dibagi di antara utas program yang sama. Ini adalah model memori bersama dari pemrograman bersamaan; ini sangat populer, tetapi juga sangat rawan kesalahan, karena programmer perlu berhati-hati ketika data yang sama dapat diakses oleh banyak utas karena kondisi lomba dapat terjadi. Perhatikan bahwa bahkan variabel lokal dapat dibagi di antara utas: “variabel lokal” (biasanya) berarti variabel yang namanya hanya valid selama satu eksekusi fungsi, tetapi utas lain dapat memperoleh pointer ke variabel itu dan mengaksesnya.

Ada juga bahasa pemrograman di mana setiap utas memiliki penyimpanannya sendiri, dan komunikasi di antara mereka terjadi dengan mengirim pesan melalui saluran komunikasi. Ini adalah model message passing dari pemrograman bersamaan. Erlangadalah bahasa pemrograman utama yang berfokus pada pengiriman pesan; lingkungan eksekusi memiliki penanganan utas yang sangat ringan, dan mendorong program yang ditulis dengan utas yang berumur pendek, berbeda dengan kebanyakan bahasa pemrograman lainnya di mana membuat utas merupakan operasi yang relatif mahal dan lingkungan runtime tidak dapat mendukung yang sangat besar jumlah utas pada saat yang sama. Subset berurutan Erlang (bagian dari bahasa yang terjadi dalam utas, khususnya manipulasi data) sebagian besar berfungsi murni; jadi utas dapat mengirim pesan ke utas lain yang berisi beberapa data dan tidak ada utas yang perlu khawatir tentang data yang dimodifikasi oleh utas lain saat sedang menggunakannya.

Beberapa bahasa memadukan kedua model dengan menawarkan penyimpanan thread-lokal, dengan atau tanpa sistem tipe untuk membedakan lokasi penyimpanan thread-lokal dari yang global. Penyimpanan thread-local biasanya merupakan fitur kenyamanan yang memungkinkan nama variabel untuk menunjuk lokasi penyimpanan yang berbeda di utas yang berbeda.

Beberapa tindak lanjut (sulit) yang mungkin menarik untuk dipahami apa utasnya:

  • Apa minimum yang perlu dilakukan kernel untuk mendukung banyak utas?
  • Di lingkungan multiprosesor, apa yang diperlukan untuk memigrasikan utas dari satu prosesor ke prosesor lainnya?
  • Apa yang diperlukan untuk mengimplementasikan multithreading kooperatif ( coroutine ) dalam bahasa pemrograman favorit Anda tanpa dukungan dari sistem operasi dan tanpa menggunakan dukungan bawaannya jika ada? (Berhati-hatilah karena sebagian besar bahasa pemrograman tidak memiliki primitif yang diperlukan untuk mengimplementasikan coroutine di dalam satu utas.)
  • Apa yang bisa terlihat dari bahasa pemrograman jika memiliki konkurensi tetapi tidak ada konsep (eksplisit) utas? (Contoh utama: pi-kalkulus .)

Ini adalah hal paling menarik yang saya baca dalam beberapa bulan.
JSON

2

Itu tergantung. Jika Anda mempertimbangkan utas seperti yang didefinisikan misalnya oleh POSIX (dan ditawarkan oleh sistem Unix) atau oleh Windows (tidak terbiasa dengan nanti, Anda harus bertanya secara spesifik), maka itu memberikan jawaban Anda (pada dasarnya seperti yang dijelaskan oleh jawaban @WanderingLogic). Linux memiliki ide utangnya sendiri, menggunakan clone(2)system call non-standar . Ini menawarkan kontrol yang agak halus tentang apa yang dibagikan orang tua dan anak. Sejauh memiliki fork(2)dan vfork(2)pada dasarnya membungkus internal clone(2), menyebutnya dengan bendera tertentu, yaitu, Anda dapat membuat "utas" yang berbagi apa-apa dengan orangtua. Lihat halaman manualnya untuk perincian, mereka tersedia online misalnya di sini . Ya, Linux memang menawarkan utas gaya POSIX, tetapi lebih dari itu.


0

Thread berbagi:

  • Ruang alamat
  • Tumpukan
  • Data statis
  • Segmen kode
  • Deskriptor file
  • Variabel global
  • Proses anak
  • Alarm yang tertunda
  • Sinyal dan penangan sinyal
  • Informasi akuntan

Utas memiliki mereka sendiri:

  • Penghitung program
  • Daftar
  • Tumpukan
  • Negara
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.