|
Pada tulisan sebelumnya yang berjudul "Eksplorasi
Proses pada Windows 9x/Me - Bagian II" sudah dibahas mengenai
thread, multitasking dan juga multithreading. Bagian terakhir dari
tulisan eksplorasi proses kali ini akan dibahas mengenai serba-serbi
penjadwalan pada sistem operasi Windows 98 SE, mulai dari prioritas,
context switch, sampai dengan kesimpulan. Penjadwalan
Penjadwal (scheduler) bertugas mengatur kegiatan multitasking dengan
menentukan thread mana yang akan menerima time slice prosesor
berikutnya. Penjadwal menentukan thread mana yang akan berjalan
berikutnya berdasarkan prioritas penjadwalannya.
Prioritas Penjadwalan
Setiap thread memiliki prioritas sendiri untuk penjadwalan.
Tingkatan prioritas berkisar antara nol (prioritas terendah) sampai
31 (prioritas tertinggi). Hanya thread sistem (istilah teknisnya
disebut zero-page thread) saja yang bisa menggunakan prioritas nol.
Prioritas tiap thread ditentukan melalui kriteria berikut:
- Priority class proses.
- Priority level thread dalam priority class prosesnya.
Priority class dan priority level dikombinasikan sehingga
membentuk base priority.
1. Priority Class
Setiap proses mempunyai salah satu priority class berikut:
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
Secara default, priority class dari proses adalah
NORMAL_PRIORITY_CLASS. Tetapi Windows menyediakan fungsi
CreateProcess() untuk membuat proses dan sekaligus menentukan
priority class dari proses yang akan dibuat tersebut. Selain itu
juga disediakan fungsi untuk mendapatkan/merubah priority class dari
suatu proses yang sedang berjalan, yaitu dengan menggunakan fungsi
GetPriorityClass() dan SetPriorityClass().
2. Priority Level
Berikut ini adalah priority level yang terdapat dalam priority
class:
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL
Semua thread dibuat dengan THREAD_PRIORITY_NORMAL. Ini berarti
prioritas thread sama dengan prioritas prosesnya. Fungsi untuk
mendapatkan/merubah priority level suatu thread adalah
GetThreadPriority() dan SetThreadPriority().
3. Base Priority
Tingkatan prioritas untuk setiap thread ditentukan dari kombinasi
priority class dan priority level-nya. Kombinasi ini membentuk base
priority. Tabel berikut menunjukkan tingkatan base priority yang
terdiri dari kombinasi priority class dan priority level.
Tabel 1 Tabel base priority pada Windows 9x
(Win32® Programmer’s Reference)


Dari nilai-nilai base priority pada tabel di atas, bisa
dikelompokkan juga menjadi empat tingkatan priority class, yaitu:
idle, normal (background dan foreground), high, dan real time. Tabel
2 berikut menjelaskan bagaimana prioritas dibagi menjadi
kelas-kelas.

4. Context Switches
Setiap tingkatan prioritas memiliki antrian tersendiri (prioritas
normal memilliki antrian tersendiri, prioritas idle memiliki antrian
tersendiri, dan seterusnya). Penjadwal mengatur antrian-antrian
untuk setiap tingkatan prioritas tersebut. Ketika prosesor ‘kosong’,
sistem operasi melakukan context switching. Langkah-langkahnya
adalah sebagai berikut:
- Simpan context dari thread yang tadinya berjalan.
- Tempatkan thread tersebut di akhir antrian.
- Load context dari dispatcher.
- Cari prioritas tertinggi dari antrian yang berisi ready
threads.
- Ambil thread tersebut dari antrian.
- Hapus context milik dispatcher.
- Load isi context thread yang akan dieksekusi, dan eksekusi
thread tersebut.
Thread yang di-suspend atau di-block tidak akan diberikan time
slice oleh penjadwal (walaupun prioritasnya tinggi) sampai siap
untuk dijalankan.
Untuk selengkapnya bisa dilihat pada gambar 1 dan 2.


Penyebab umum terjadinya context switch adalah:
- Time slice telah habis.
- Thread dengan prioritas yang lebih tinggi siap untuk
dijalankan.
- Thread tersebut harus menunggu sesuatu (wait).
Ketika thread yang sedang berjalan harus menunggu sesuatu (wait),
sisa time slice dari thread yang bersangkutan tidak akan
diakumulasikan dengan thread baru, tetapi dihapus/dihilangkan.
Context itu sendiri merupakan suatu struktur yang berisi
data-data register yang sangat tergantung oleh jenis prosesor.
Struktur context yang sudah didefinisikan adalah untuk prosesor
Intel, MIPS, Alpha, dan PowerPC. Microsoft mendefinisikan struktur
dari context dalam file header WinNT.h untuk semua jenis prosesor.
Borland Delphi 5 mengkonversinya ke dalam format struktur pascal
(record) sebagai berikut:
_CONTEXT =
record
{$EXTERNALSYM _CONTEXT}
ContextFlags: DWORD;
{ This section is specified/returned if CONTEXT_DEBUG_REGISTERS
is set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is
NOT included in CONTEXT_FULL. }
Dr0: DWORD;
Dr1: DWORD;
Dr2: DWORD;
Dr3: DWORD;
Dr6: DWORD;
Dr7: DWORD;
{ This section is specified/returned if the
ContextFlags word contains the flag CONTEXT_FLOATING_POINT. }
FloatSave: TFloatingSaveArea;
{ This section is specified/returned if the
ContextFlags word contains the flag CONTEXT_SEGMENTS. }
SegGs: DWORD;
SegFs: DWORD;
SegEs: DWORD;
SegDs: DWORD;
{ This section is specified/returned if the
ContextFlags word contains the flag CONTEXT_INTEGER. }
Edi: DWORD;
Esi: DWORD;
Ebx: DWORD;
Edx: DWORD;
Ecx: DWORD;
Eax: DWORD;
{ This section is specified/returned if the
ContextFlags word contains the flag CONTEXT_CONTROL. }
Ebp: DWORD;
Eip: DWORD;
SegCs: DWORD;
EFlags: DWORD;
Esp: DWORD;
SegSs: DWORD;
end;
Windows menyediakan fungsi GetThreadContext() untuk mengambil isi
context dari thread tertentu. Untuk mendapatkan isi context yang
benar, thread yang bersangkutan harus di-suspend dulu karena seiring
dengan berjalannya thread, isi context juga akan berubah.
Disediakannya struktur ini bukan berarti isi context bisa
diubah-ubah sembarangan oleh pemrogram, karena pada dasarnya context
digunakan oleh sistem operasi untuk melakukan berbagai operasi
internal.
5. Priority Boosts
Setiap thread memiliki dynamic priority. Prioritas inilah yang
sebenarnya digunakan oleh penjadwal untuk menentukan thread mana
yang akan dijalankan berikutnya. Awalnya, nilai dynamic priority
sama dengan base priority. Kemudian, sistem operasi bisa menaikkan
(boost) atau menurunkan (lower) dynamic priority, untuk memastikan
semua thread mendapat ‘giliran’ untuk dieksekusi sehingga tidak ada
yang mengalami startvation (suatu keadaan dimana proses/thread tidak
pernah mendapat giliran pemroses dikarenakan prioritasnya yang
rendah).
Sistem operasi menaikkan dynamic priority suatu thread untuk
alasan-alasan sebagai berikut:
- Ketika suatu proses yang prioritasnya NORMAL_PRIORITY_CLASS
berada di foreground, penjadwal akan menaikkan priority class
dari proses-proses yang berhubungan dengan proses foreground
tersebut, sehingga prioritasnya bisa lebih besar atau sama
dengan priority class dari proses-proses background. Priority
class dikembalikan seperti semula ketika proses tidak ada di
foreground lagi.
- Ketika suatu window (tampilan antarmuka) menerima input,
seperti timer, mouse, atau keyboard, penjadwal menaikkan
prioritas dari thread yang memiliki window tersebut.
- Ketika kondisi wait untuk thread yang di-block telah
selesai, penjadwal menaikkan prioritas thread.
Setelah menaikkan dynamic priority suatu thread, penjadwal
menurunkan prioritasnya satu tingkatan setiap thread menyelesaikan
satu time slice, sampai prioritasnya sama dengan base priority.
Perlu dicatat bahwa dynamic priority suatu thread tidak akan pernah
kurang dari base priority-nya.
6. Priority Inversion
Priority inversion terjadi ketika ada dua thread atau lebih dengan
prioritas yang berbeda berlomba-lomba untuk dijadwalkan. Kita ambil
contoh sederhananya dengan tiga thread: A, B, dan C. Thread A
memiliki prioritas yang tinggi dan siap untuk dijadwalkan. Thread B,
yang memiliki prioritas rendah, sedang mengeksekusi sesuatu
di-critical section (bagian kode yang hanya bisa dieksekusi oleh
satu thread pada satu waktu). Thread A, yang berprioritas tinggi,
mulai menunggu giliran masuk critical section yang sedang dipakai
oleh thread B. Thread C memiliki prioritas menengah. Thread C
menerima semua waktu prosesor, karena thread yang berprioritas lebih
tinggi (thread A) sedang menunggu thread yang berprioritas rendah
(thread B). Thread B tidak akan meninggalkan critical section,
karena tidak memiliki prioritas yang lebih tinggi dari thread C
untuk dijadwalkan.
Jika satu thread yang berprioritas tinggi tergantung pada satu
thread yang berprioritas rendah, thread tersebut tidak akan pernah
dijalankan, karena thread yang berprioritas menengah mengambil semua
waktu prosesor. Sistem operasi akan mengetahui bahwa thread
berprioritas tinggi bergantung pada thread yang berprioritas rendah,
sehingga thread yang berprioritas rendah akan dinaikkan prioritasnya
sampai melebihi thread yang berprioritas tinggi. Hal ini akan
menyebabkan thread yang awalnya berprioritas rendah untuk berjalan
dan thread yang berprioritas tinggi mendapatkan giliran atas
critical section.
Algoritma Penjadwalan
Dari hasil eksplorasi di atas dapat disimpulkan beberapa hal sebagai
berikut:
- Dalam mengatur urutan thread-thread yang akan dieksekusi,
penjadwal menggunakan prioritas thread (priority level) untuk
menentukan urutannya. Logikanya, thread yang prioritasnya lebih
tinggi akan dijadwalkan lebih dulu daripada thread yang
prioritasnya lebih rendah. Hal ini merupakan karakteristik dari
Priority Scheduling.
- Dalam mengatur urutan thread-thread yang memiliki prioritas
yang sama, penjadwal mengeksekusi thread berdasarkan urutan
masuk ke antrian (FIFO), tetapi setiap thread yang akan
dieksekusi diberikan dulu time slice yang merupakan ‘jatah’
waktu untuk berada di pemroses. Ini merupakan karakteristik dari
Penjadwalan Round-Robin.
- Setiap thread dikelompokkan ke dalam antrian-antrian
berdasarkan tingkat prioritasnya. Penjadwal akan mulai
mengeksekusi thread-thread yang ada di antrian berprioritas
paling tinggi dulu, kemudian mengeksekusi thread di antrian yang
satu tingkat lebih rendah prioritasnya. Hal ini juga merupakan
karakteristik dari Penjadwalan Multiple-Feedback Queues.
Sehingga bisa dikatakan bahwa sistem operasi Windows 98 SE
menggunakan Multiple-Feedback Queues yang ‘didalamnya’ memberlakukan
aturan-aturan penjadwalan berprioritas (Priority Scheduling) untuk
semua thread yang dibagi ke dalam antrian-antrian berdasarkan
prioritasnya, dan disetiap antrian diberlakukan aturan-aturan
penjadwalan Round-Robin.
Kesimpulan
Dari analisis yang dilakukan terhadap proses dan thread yang sudah
dipaparkan sebelumnya, maka dapat diambil kesimpulan sebagai
berikut:
- Proses merupakan aplikasi/program yang sedang berjalan,
tetapi yang benar-benar dijalankan oleh pemroses adalah bagian
dari proses, yaitu thread.
- Setiap proses minimal memiliki satu thread (primary thread),
artinya jika tidak ada thread dalam satu proses, maka proses
juga tidak akan ada.
- Prioritas yang sesungguhnya adalah base priority yang
dimiliki oleh thread (karena thread merupakan unit yang
dieksekusi oleh pemroses), tetapi yang dibaca oleh penjadwal
adalah dynamic priority yang mana pada awalnya memiliki nilai
yang sama dengan base priority. Base priority sendiri merupakan
kombinasi dari priority class dan priority level.
- Multitasking (mengeksekusi banyak task) atau multithreading
(mengeksekusi banyak thread) hanyalah istilah yang digunakan
bagi manusia yang menggambarkan seakan-akan pemroses
mengeksekusi beberapa task/kode dalam satu waktu. Padahal pada
dasarnya di sisi pemroses (tunggal) hanya ada SATU yang
dieksekusi.
- Pada Microsoft® Win32® Programmer’s Reference dijelaskan
bahwa time slice besarnya adalah 20 milidetik, artinya secara
teoritis dalam satu detik pemroses dapat mengeksekusi minimal 50
thread.
- Ketika terjadi perubahan thread yang dieksekusi, terjadi dua
kali context switch, yaitu satu untuk thread itu sendiri dan
satu lagi untuk dispatcher yang melakukan pemilihan dan
pengambilan thread di antrian. Sehingga, berdasarkan poin
sebelumnya hal tersebut berarti minimal context switch terjadi
kira-kira 100 kali dalam satu detik.
- Strategi penjadwalan yang digunakan Windows 98 SE adalah
Multiple-Feedback Queues.
Tamat.
Referensi
- Ezzel, B. and Blaney, J. (1998), Windows 98 Developer’s
Handbook, Marina Village Parkway, Alameda, CA 94501: SYBEX Inc.
- Haryanto, B. Ir. (1999), Buku Teks Ilmu Komputer:Sistem
Operasi, Edisi Kedua. Bandung, Informatika.
- Microsoft, Microsoft® Win32® Programmer’s Reference,
Copyright © 1992 – 1996 Microsoft Corporation.
- Microsoft, “.NET Framework Developer Specifications”, .NET
Framework SDK, Unpublished work. © 2000 – 2001 Microsoft
Corporation.
- Nutt, J. G. (2000), Operating Systems:A Modern Perspective,
Second Edition, United States: Addison Wesley Longman Inc.
- Stallings, W. (1995), Operating Systems, 2nd ed. Englewood
Cliffs, New Jersey: Prentice Hall.
- Tanenbaum, S. A. (1992), Modern Operating System, Englewood
Cliffs, New Jersey: Prentice-Hall Inc.
Demikian tulisan bagian terakhir mengenai eksplorasi proses pada Windows 9x/Me. Semoga
bermanfaat bagi Anda semuanya. Jika ada saran atau komentar bisa
dilayangkan ke
arioss@softhome.net. Untuk membaca tulisan menarik lainnya
silakan menuju ke situs Sony AK Knowledge Center dengan alamat di
www.sony-ak.com.
Terimakasih.
| Send
your comments or suggestions |
|
|
|