Anda di halaman 1dari 42

Chapter 4 : Threads and Concurrency

Source : Operating System Concepts, 10/e by Abraham Silberschatz, Peter Baer Galvin, Greg Gagne
Kelompok 3
01 Muhammad Daffa 19082010031

02 Anisa Rahma Salsabila 19082010051

03 Hastri Cantya Danahiswari 19082010056

04 Talenta Ekklesia Noor 19082010113


4.1 Overview
Thread adalah unit dasar dalam penggunaan
CPU yang terdiri dari ID thread,program
counter (PC), satu set register, dan stack. Sem
ua berbagi dengan thread lain yang dimili
ki untuk proses yang sama pada bagian kode,
bagian data, dan sistem operasi lainnya sepe
rti open file dan sinyal.
4.1.1 Motivation
Aplikasi biasanya diimplementasikan sebagai proses terpisah dengan beberapa
thread kendali. Di bawah ini beberapa contoh aplikasi multithreads:
• Aplikasi yang membuat gambar mini foto dari kumpulan gambar dapat
menggunakan thread terpisah untuk menghasilkan thumbnail dari
masing-masing gambar terpisah.
• Web Browser mungkin memiliki satu thread untuk menampilkan gambar atau
teks, sementara thread yang lain mengambil data dari jaringan.
• Pengolah kata mungkin memiliki thread untuk menampilkan grafik, thread
yang lain untuk menanggapi penekanan tombol dari pengguna, dan thread
04tata bahasa di latar belakang.
ketiga untuk melakukan pemeriksaan ejaan dan
Gambar Proses
Single-threaded
dan Multithreaded
Your Picture Here
Single-Threaded dan Multithreaded Process
Aplikasi dirancang untuk memanfaatkan kemampuan pemrosesan
pada multicore sistem. Aplikasi semacam itu dapat melakukan beberapa
tugas intensif CPU secara paralel di beberapa inti komputasi. Dalam situasi
tertentu, satu aplikasi mungkin diperlukan untuk melakukan beberapa tugas
serupa.
Misalnya, server web menerima permintaan klien untuk web halaman,
gambar, suara, dan lain sebagainya. Server web yang disalahgunakan mungkin
memiliki beberapa (mungkin ribuan) klien mengaksesnya secara bersamaan.
Jika server web dijalankan sebagai file proses single-threaded tradisional, itu
04 dan klien mungkin harus
hanya dapat melayani satu klien pada satu waktu,
menunggu sangat lama sampai permintaannya diterima dan dilayani.
Salah satu solusinya adalah
menjalankan server sebagai
proses tunggal yang menerima
permintaan. Ketika server
menerima permintaan, itu membuat
proses terpisah untuk melayani
permintaan itu.
Ini umumnya lebih efisien
untuk menggunakan satu proses yang
berisi banyak thread. Jika proses
server web multithread, server akan
membuat thread terpisah yang
mendengarkan permintaan klien. Saat
permintaan dibuat, file server membuat
thread baru untuk melayani
permintaan dan melanjutkan
mendengarkan permintaan
tambahan.
4.1.2 Benefits
• Responsif
• Bisa berbagi sumber
daya
• Ekonomis
• Skalabilitas
4.2 Multicore Programming

Dalam desain sistem adalah menempatkan banyak komputasi core pada satu
chip pemrosesan di mana setiap inti muncul sebagai CPU terpisah ke sistem
operasi. Ini mengacu pada sistem seperti multicore dan pemrograman
multithreaded yang menyediakan mekanisme penggunaan secara lebih
efisien dari beberapa inti komputasi dan peningkatan konkurensi.

04
4.2.1 Programming Challenges
1. Mengidentifikasi tugas
Ini melibatkan pemeriksaan aplikasi untuk menemukan area yang dapat
dibagi menjadi tugas yang terpisah dan bersamaan. Idealnya, tugas
adalah independen satu sama lain dan dengan demikian dapat berjalan
secara paralel pada setiap inti.
2. Keseimbangan
Saat mengidentifikasi tugas yang dapat berjalan secara paralel, programmer
juga harus memastikan bahwa tugas melakukan pekerjaan yang sama
dengan nilai yang sama.
04
Programming Challenges
3. Pemisahan data
Sama seperti aplikasi yang dibagi menjadi tugas terpisah, file data yang
diakses dan dimanipulasi oleh tugas harus dibagi untuk dijalankan inti
secara terpisah.
4. Ketergantungan data
Data yang diakses oleh tugas harus diperiksa ketergantungan antara dua
atau lebih tugas. Saat satu tugas bergantung data dari yang lain,
programmer harus memastikan bahwa eksekusi file tugas
disinkronkan untuk mengakomodasi ketergantungan data.
5. Pengujian dan debugging
04 di beberapa core, banyak
Ketika sebuah program berjalan secara paralel
jalur eksekusi yang berbeda dimungkinkan. Pengujian dan
debugging program bersamaan seperti itu secara inheren lebih
sulit daripada pengujian dan debugging aplikasi single-
threaded.
4.2.2 Types of Parallelism
1. Paralelisme Data
Berfokus pada pendistribusian subset dari 2. Paralelisme Tugas
data yang sama di beberapa inti komputasi Tidak melibatkan distribusi data
dan melakukan operasi yang sama pada tetapi tugas (thread) di
masing-masing inti. Pertimbangkan, beberapa inti komputasi.
misalnya, menjumlahkan konten array Setiap thread melakukan
berukuran N. operasi unik. Perbedaan
Pada a sistem inti tunggal, satu thread hanya thread mungkin
akan menjumlahkan elemen [0]. . . [N - 1]. beroperasi pada data yang
Namun, pada sistem inti ganda, thread A, sama, atau mungkin beroperasi
yang berjalan pada inti 0, dapat pada data yang berbeda.
menjumlahkan elemen
[0]. . . [N ∕ 2 - 1] sementara thread 04
B, berjalan pada inti 1, dapat
menjumlahkan elemen [N ∕ 2]. . . [N - 1].
Kedua thread akan berjalan secara paralel
pada inti komputasi terpisah.
4.3 Multithreading Mode
ls

Namun, dukungan untuk threads dapat disediakan baik di tingkat


pengguna, untuk threads pengguna, atau oleh kernel, untuk
threads kernel. Threads pengguna didukung di atas kernel dan
dikelola tanpa dukungan kernel, sedangkan threads
kernel didukung dan dikelola langsung oleh sistem
operasi. Hampir semuanya kontemporer sistem
operasi termasuk Windows, Linux, dan macOS mendukung kernel
threads.
4.3.1 Many-to-One Model
Model many-to-one
menggambarkan
beberapa user-level
thread terhubung ke
satu kernel thread.
Manajemen thread
diselesaikan oleh
thread library di user
space, sehingga
efisien. Namun,
seluruh proses akan terblokir
jika sebuah thread membuat
sebuah blocking system call.
Sebuah thread library
tersedia untuk Sistem
Solaris dan diadaptasi pada
versi awal Java
4.3.2 One-to-One Model
Model one-to-one
menggambarkan satu
user thread
terhubung ke satu
kernel thread. Model ini
menyediakan
concurrency lebih
dibandingkan model
many-to-one dengan
memperbolehkan thread
lain untuk tetap berjalan
ketika sebuah thread
membuat sebuah
blocking system call. Linux
dan keluarga OS
Windows
4.3.3 Many-to-Many Model
Sebuah variasi pada
many-to-many model
tetap menggandakan
Model many-to-many beberapa user-level
membagi beberapa thread ke kernel thread
user-level thread ke yang lebih kecil atau
kernel thread yang lebih sama tetapi juga
kecil atau sama.
Jumlah kernel thread memperbolehkan sebuah
tergantung pada user-level thread untuk
aplikasi tertentu atau dihubungkan kepada
mesin tertentu. sebuah kernel
  thread. Variasi ini
disebut juga two-
level model.
4.4 Thread Libraries

Sebuah thread library menyediakan programmer sebuah API


untuk membuat dan mengelola thread. Ada 2 cara utama untuk
mengimplementasikan sebuah thread library. Pendekatan pertama
adalah dengan menyediakan seluruh library di user space tanpa
dukungan kernel. Sedangkan pendekatan kedua adalah dengan
mengimplementasikan kernel-level library langsung didukung
oleh sistem operasi.
Tiga thread library utama yang digunakan sekarang
adalah POSIX Pthreads, Windows, dan Java.
4.4.1 Pthreads
Pthread merujuk pada POSIX
standard (IEEE 1003.1c)
mendefinisikan sebuah API
untuk pembuatan dan sinkronisasi
thread. Operating-System designer
bisa mengimplementasikan
spesifikasi pembuatan API dengan
berbagai cara. Sistem yang

mengimplementasikan spesifikasi 04
Pthreads antara lain UNIX-
type system, termasuk
Linux dan MacOS.
4.4.2 Windows Threads

Teknik untuk membuat thread


menggunakan Windows thread
library hampir sama dengan
teknik Pthreads. Di bawah ini
adalah gambar API Windows
Thread di program C.

04
4.4.3 Java Threads
Thread merupakan model fundamental dari eksekusi
program di sebuah program Java, dan Bahasa Java dan API-nya
menyediakan banyak set fitur untuk membuat dan mengelola
thread. Java Threads tersedia di beberapa sistem seperti Windos,
Linux, dan MacOS.
4.4.3.1 Java Executor Framework
Dimulai dari versi 1.5 beserta API-
nya, Java memperkenalkan
beberapa fitur concurrency baru yang
menyediakan pengembang dengan
control yang jauh lebih baik
terhadap pembuatan
dan komunikasi thread. Alat ini
tersedia di java.util.concurrent
package.
Sebagai tambahan,
pendekatannya memisahkan 04
pembuatan thread dari hasil yang
mereka hasilkan, daripada
menunggu thread berakhir sebelum
dapat mengambil hasil, induk
hanya akan menunggu hasilnya
4.5 Solaris dan Manajemen SMP (Symetric Multiprocessing)

Solaris adalah salah satu sistem operasi open-source Unix yang didasarkan pada
arsitektur System V. Solaris diluncurkan oleh oracle dan dikembangkan oleh Sun
microsystem. Solaris merupakan sistem operasi yang bisa dijalankan pada perangkat
keras dengan spesifikasi X64 bit, X86 bit, dan SPARC.

04
Konsep pada Solaris

• Process
Proses pada UNIX yang mencakup ruang alamat pengguna, stack, dan proses
kontrol block.
• User-level Threads (ULT)
Implementasi dari ULT (User Level Thread) yang berhubungan dengan eksekusi
pada proses.
• Lightweight Processes (LTP)
Dilihat sebagai pemetaan antara ULT dan urutan kernel. Setiap LWP mendukung
ULT kepada urutan kernel. LWP dijadwalkan oleh kernel dan dieksekusi secara
paralel pada multiprosessor. 04
• Kernel Threads
Entitas yang bersifat fundamental yang dapat dijadwalkan dan dikirim untuk
dijalankan pada salah satu sistem prosessor.
 
Terjadi single ULT yang terkait dengan single LWP. Hal itu
merupakan proses yang terjadi pada proses UNIX secara
tradisional. Apabila pada proses terjadi banyak ULT yang
terkait dengan single LWP maka, menjadi rangkaian single
kernel.

Akantetapi, terdapat juga kernel yang tidak terkait dengan


LWP. Kernel membuat dan menjalankan rangkaian kernel
untuk eksekusi fungsi sistem secara spesifik. Kegunaan
rangkaian kernel pada proses kernel untuk
mengimplementasikan fungsi sistem dan mengurangi
process switch ke thread switch.
 
Pada three-level thread structure (ULT, LWP, kernel thread)
solaris memfasilitasi manajemen thread dengan OS dan
04
menyediakan interface yang baik pada aplikasi.
Dengan begitu, aplikasi memiliki akses pada hardware.
Gambar Ilustrasi Proses dan Threads Pada Solaris Seperti, mengetik atau membaca file, membuat proses
baru, dan sebagainya.
Struktur Data LWP
• Pengenal LWP
• Prioritas pada LWP dan kernel thread yang mendukung
• Sinyal yang menunjukkan bahwa kernel telah diterima
• Stack kernel untuk LWP seperti, argumen system call,
results, dan kode error pada setiap level
• Penggunaan memori dan pembuatan data profil
• Pointer yang menunjukkan thread kernel
• Pointer yang menunjukkan struktur proses
Selalu ada 1 kernel untuk setiap
LWP.LWP terlihat bersama proses
pada aplikasi. Dimana data
struktur LWP bersama dengan
proses alamat. Pada waktu yang
sama, setiap LWP terikat dengan
satu kernel dan data struktur
kernel terawat pada alamat kernel

Gambar Ilustrasi Struktur Proses Pada UNIX dan Solaris Tradisional


• Eksekusi pada thread

- RUN: thread dapat dijalankan dan siap


untuk di eksekusi
- ONPROC: thread sedang dieksekusi
pada prosesor
- SLEEP: thread di blocked
- STOP: thread telah berhenti
- ZOMBIE: thread telah diterminasi
- FREE: asal thread telah di rilis dan
thread menunggu dihapus dari data
struktur thread OS

Gambar Ilustrasi Solaris Thread States


• Interupsi pada thread • Solusi yang terjadi pada solaris,yaitu:

OS memiliki 2 bentuk fundamental dari aktivitas  Solaris menggunakan satu set kernel
konkurensi yaitu, proses dan interupsi. thread untuk menangani interupsi.
Proses (pada threads) bekerja dan mengatur  Akses kontrol kernel ke struktur data
kegunaan shared data structures yang berarti, dan sinkronisasi antara thread dengan
banyak variasi primitif yang melaksanakan interupsi menggunakan primitif
eksekusi bersama - sama dan pengecualian bersama.
menyinkronkan eksekusi yang terjadi.  Interupsi pada thread dianggap
Kegunaan interupsi, yaitu menyinkronkan memliki prioritas yang lebih tinggi
dengan mencegah berdasarkan waktu yang daripada semua jenis kernel thread
dihabiskan. lainnya
 
4.6 Thread Issues
4.6.1 Panggilan Sistem fork () dan exec()
• Jika salah satu thread dalam panggilan program fork() apakah proses baru
menduplikasi semua thread, atau apakah proses baru thread tunggal?
Beberapa UNIX sistem telah memilih untuk memiliki dua versi garpu(), satu
yang menduplikasi semua thread dan satu lagi yang hanya menduplikasi
thread yang memanggil garpu() panggilan sistem.
• Exec() system call biasanya bekerja dengan cara jika thread memanggil exec()
panggilan sistem, program yang ditentukan dalam parameter ke exec ()
akan menggantikan seluruh proses termasuk semua thread dari dua versi
garpu() untuk digunakan tergantung pada aplikasinya. Jika exec ()
dipanggil segera setelah bercabang,04maka menduplikasi semua thread
tidak diperlukan, karena program ditentukan dalam
parameter untuk exec () akan menggantikan prosesnya.
4.6.2 Signal Handling
Sebuah sinyal digunakan dalam UNIX sistem untuk memberi tahu proses
bahwa peristiwa tertentu telah terjadi. Sinyal dapat diterima baik secara
sinkron maupun asinkron, tergantung pada sumber dan alasan
acara yang diberi sinyal. Semua sinyal, baik sinkron maupun asinkron,
mengikuti pola yang sama :
1. Sebuah sinyal dihasilkan oleh terjadinya peristiwa tertentu.
2. Sinyal dikirim ke suatu proses.
3. Setelah terkirim, sinyal harus ditangani.
 
Contoh sinyal sinkron termasuk akses memori ilegal dan pembagian
04
dengan 0. Jika program yang berjalan melakukan salah satu dari tindakan
ini, sinyal akan dihasilkan. Ketika sinyal dibangkitkan oleh peristiwa di luar
proses yang sedang berjalan, proses itu menerima sinyal secara
tidak sinkron.
Signal Handling
Sebuah sinyal dapat ditangani oleh salah satu dari dua kemungkinan penangan:
1. Penangan sinyal default
2. Penangan sinyal yang ditentukan pengguna

Setiap sinyal memiliki penangan sinyal default yang dijalankan kernel saat menangani sinyal itu.
Tindakan default ini dapat diganti dengan penangan sinyal yang ditentukan pengguna yang dipanggil
untuk menangani sinyal. Menangani sinyal dalam program single-threaded sangatlah mudah: sinyal
selalu dikirim ke suatu proses. Namun, pengiriman sinyal lebih rumit dalam program
multithread, di mana suatu proses mungkin memiliki beberapa thread. Lalu, ke mana sinyal
harus dikirimkan?

 
Secara umum, opsi berikut ada:
04
1. Kirimkan sinyal ke thread tempat sinyal diterapkan.
2. Kirimkan sinyal ke setiap thread dalam proses.
3. Mengirimkan sinyal ke thread tertentu dalam proses.
4. Tetapkan thread tertentu untuk menerima semua sinyal untuk proses tersebut.
 
Signal Handling
Metode pengiriman sinyal tergantung pada jenis sinyal yang dihasilkan. Misalnya, sinyal sinkron
perlu dikirim ke thread yang menyebabkan sinyal dan tidak ke thread lain dalam
prosesnya. Namun, situasi dengan sinyal asinkron tidak begitu jelas. Beberapa
sinyal asinkron - seperti sinyal yang menghentikan suatu proses (<kontrol> <C>, misalnya) —
harus dikirim ke semua thread.
Standar UNIX fungsi untuk mengirimkan sinyal adalah sebagai berikut :

Fungsi ini menentukan proses (pid) ke mana sinyal tertentu (sinyal) harus dikirim. Sebagian besar
versi multithread dari UNIX memungkinkan thread menentukan sinyal mana yang akan diterima dan
yang akan diblokir. Dalam beberapa kasus, sinyal asinkron hanya dapat dikirimkan ke thread
yang tidak memblokirnya. POSIX Pthreads menyediakan fungsi berikut, yang memungkinkan sinyal
dikirim ke thread tertentu. 04
Asynchronous Procedure Calls (APCs) memungkinkan thread pengguna menentukan fungsi yang akan
dipanggil ketika thread pengguna menerima pemberitahuan tentang peristiwa tertentu. Seperti yang
ditunjukkan dengan namanya, sebuah APC secara kasar setara dengan sinyal asinkron dalam
UNIX.
4.6.3 Thread Cancellation
Pembatalan Thread melibatkan penghentian thread sebelum
selesai.Misalnya, jika beberapa thread secara bersamaan mencari melalui
database dan satu thread mengembalikan hasilnya, thread yang tersisa
mungkin dibatalkan. Situasi lain mungkin terjadi saat pengguna
menekan tombol di browser web yang menghentikan pemuatan
halaman web lebih jauh. Thread yang akan dibatalkan sering disebut
sebagai thread target. Pembatalan thread target dapat terjadi dalam
dua skenario berbeda:
1. Pembatalan asinkron.
Satu thread segera mengakhiri thread target.
 
2. Pembatalan yang ditangguhkan. 04
Dengan pembatalan yang ditangguhkan, sebaliknya, satu thread
menunjukkan bahwa target thread harus dibatalkan, tetapi
pembatalan hanya terjadi setelah thread target telah memeriksa
sebuah bendera untuk menentukan apakah itu harus
4.6.3 Thread Cancellation
Di Pthreads, pembatalan thread dimulai menggunakan pthread batal ()
fungsi. Pengenal thread target diteruskan sebagai parameter ke fungsi
tion. Kode berikut menggambarkan pembuatan - dan kemudian membatalkan —
thread

04
Thread Cancellation
Memohon pthread cancel () namun hanya menunjukkan permintaan untuk
membatalkan thread target; pembatalan sebenarnya bergantung pada
bagaimana thread target disiapkan untuk menangani permintaan. Saat thread
target akhirnya dibatalkan, panggilan ke pthread join () di thread cancel
kembali. Pthreads mendukung tiga mode pembatalan. Setiap mode
didefinisikan sebagai status dan tipe, seperti yang diilustrasikan pada tabel di
bawah. thread dapat menyetel status dan jenis pembatalannya menggunakan
API.

04
Thread Cancellation
Salah satu teknik untuk menetapkan titik pembatalan adalah dengan
memanggil Pthread_testcancel () fungsi. Jika ditemukan permintaan
pembatalan menunggu keputusan, panggilan ke pthread_ testcancel () tidak
akan kembali, dan thread akan berakhir. Jika tidak, panggilan ke fungsi
tersebut akan kembali, dan thread akan terus berjalan. Selain itu, Pthreads
memungkinkan fungsi yang dikenal sebagai penangan pembersihan untuk
dipanggil jika thread dibatalkan.

Kode berikut mengilustrasikan bagaimana thread dapat menanggapi


pembatalan permintaan menggunakan pembatalan yang ditangguhkan:
04
4.6.4 Thread Local Storage
Dalam beberapa hal, TLS mirip dengan statis data; perbedaannya adalah TLS
data unik untuk setiap thread. Sebagian besar pustaka dan kompiler thread
menyediakan dukungan untuk TLS.

Sebagai contoh, Java menyediakan ThreadLocal <T> kelas dengan set() dan
dapatkan() metode untuk ThreadLocal <T> benda.

Pthreads termasuk tipe pthread key t, yang menyediakan kunci yang khusus
untuk setiap thread. Kunci ini kemudian dapat digunakan untuk
mengakses TLS data. Bahasa Microsoft C # 04 hanya perlu menambahkan atribut
penyimpanan [ThreadStatic] untuk mendeklarasikan data thread-local.
Compiler menyediakan kata kunci kelas penyimpanan
benang untuk mendeklarasikan TLS data.
4.6.5 Scheduler Activations
Sebuah aplikasi mungkin memerlukan sejumlah LWP agar berjalan efisien.
Mempertimbangkan Sebuah CPU aplikasi-bound berjalan pada satu
prosesor. Hanya dalam skenario ini satu thread dapat berjalan dalam satu
waktu, jadi satu LWP Cukup. Aplikasi I/O intensif mungkin
membutuhkan banyak LWPs untuk dieksekusi, bagaimanapun.
Biasanya, file LWP adalah diperlukan untuk setiap panggilan sistem
pemblokiran bersamaan.
Misalnya, lima permintaan baca file yang berbeda terjadi secara bersamaan.
Lima LWP dibutuhkan, karena semua bisa menunggu I/O penyelesaian di
04 empat LWPs, maka
kernel. Jika suatu proses memiliki hanya
permintaan kelima harus menunggu salah satu dari LWPs untuk
kembali dari kernel.
Scheduler Activations
Satu skema untuk komunikasi antara pustaka thread pengguna
dan kernel dikenal sebagai aktivasi penjadwal. Ia bekerja sebagai
berikut:
• Kernel pro-membuat aplikasi dengan satu set prosesor virtual
(LWPs), dan aplikasi dapat menjadwalkan thread pengguna ke
prosesor virtual yang tersedia. Selanjutnya,kernel harus
menginformasikan aplikasi tentang kejadian tertentu.
Prosedur ini dikenal sebagai upcall. Upcall ditangani oleh pustaka
thread dengan ekstensi penangan upcall, dan penangan upcall
harus dijalankan pada prosesor virtual.
Dalam skenario ini, kernel melakukan upcall ke aplikasi memberi
tahu bahwa sebuah thread akan memblokir dan mengidentifikasi
thread tertentu. Kernel kemudian mengalokasikan prosesor
virtual baru ke
penangan upcall pada prosesor 04
aplikasi. Aplikasi-kation menjalankan
virtual baru ini, yang
menyimpan file status thread pemblokiran dan melepaskan
prosesor virtual yang menjalankan thread pemblokiran.
Penangan upcall kemudian menjadwalkan thread lain yang memenuhi
syarat untuk dijalankan pada prosesor virtual baru. Ketika
peristiwa yang ditunggu oleh thread pemblokiran, kernel akan melakukan
4.7 MAC OS X GRAND CENTRAL DISPATCH

Sistem operasi menyediakan banyak konkurensi


berdasarkan nomor cores yang tersedia dan
kapasitas yang tersedia untuk thread. GCD
mengalami kemajuan kualitatif dalam kegunaan
dan efisiensi. Gambar Queues Pada GCD
Blocks dijalankan berdasarkan
basis FIFO (first in-first
Sebuah block merupakan perpanjangan sederhana out). Yang berarti, block
dari bahasa pemrograman seperti, C++. Kegunaan yang masuk waktu awal akan
dari block, yaitu untuk mendefinisikan unit agar dijalankan terlebih dahulu.
bekerja mandiri termasuk kode plus data.
04
Contoh: x= ^(printf("hello world\n");}

Gambar Queue
Gambar Contoh Source Code Menampilkan Queue

Perlu diingat, seluruh fungsi GCD dimulai dengan “dispatch_”. Untuk


menampilkan konkuerensi queue secara global perlu kode “dispatch_async()”.
 
Thank you

Anda mungkin juga menyukai