“THREAD”
Disusun untuk memenuhi salah satu tugas mata kuliah Sistem Operasi.
Oleh :
Irpan Yahyal Pauji
1803010025
Teknik Informatika A
Puja dan puji syukur kehadirat ALLAH SWT yang telah memberikan rahmat dan
hidayah serta inayah-Nya sehingga saya dapat meneyelesaika tugas makalah yang
berjudul “thread” ini tepat pada waktunya. Makalah ini saya buat untuk memenuhi
tugas dari mata kuliah sistem operasi.
Terima kasih kami ucapkan kepada semua pihak yang telah membantu dalam bentuk
materi dan saran, serta dibuat dengan segala masukan dan kekurangan yang telah
diberikan pada saya sehingga makalah ini dapat selesai.
Saya berharap kepada semua pihak dengan segala kritik dan saran yang bersifat
membangun, sangat kami harapkan untuk dimasa yang akan datang agar bisa
menyempurnakan makalah ini, sebab makalah ini masih banyak kekurangannya.
Penulis
BAB I
PENDAHULUAN
A. Latar Belakang
Java adalah bahasa pemrograman banyak thread, yang artinya beberapa hal
bisa dilakukan bersama-sama. Thread adalah unit terkecil dari eksekusi suatu
program. Thread mengeksekusi rangkaian instruksi satu demi satu. Ketika sistem
menjalankan program, komputer akan membuat thread baru. (Thread dalam konteks
ini disebut proses, akan tetapi perbedaanya tidank penting di sini). Instruksi-instruksi
dalam program akan dieksekusi oleh thread ini secara berantai, satu demi satu dari
awal hingga akhir. Thread disebut "mati" jika program selesai dieksekusi.
Dalam sistem komputer modern, beberapa thread bisa tercipta dalam satu waktu.
Pada satu saat tertentu, hanya ada satu thread yang bisa dijalankan, karena CPU
hanya bisa melakukan satu hal dalam satu waktu. (Pada komputer dengan
multiprosesor, multicore, dan hyper-threading, masing-masing prosesor atau core
melakukan thread yang berbeda-beda). Akan tetapi sebenarnya komputer membagi
waktu menjadi bagian-bagian kecil sehingga seolah-olah seluruh thread dijalankan
secara bersama-sama. Pembagian waktu berarti CPU mengeksekusi suatu thread
dalam kurun waktu tertentu, setelah itu beralih mengeksekusi thread yang lain,
kemudian thread lain, dan seterusnya dan kemudian kembali ke thread pertama --
kira-kira 100 kali per detik. Di mata user, semua thread berjalan pada saat yang sama.
Java bisa membuat satu atau lebih thread yang bisa dijalankan secara paralel. Hal ini
adalah bagian mendasar, yang dibuat di dalam core bahasa, bukan merupakan
tambahan (add-on) seperti bahasa pemrograman lain. Tetap saja pemrogaman dengan
banyak thread adalah sesuatu yang tidak mudah.
Penggunaan thread yang banyak digunakan untuk membuat GUI (Graphical User
Interface) yang responsif. Pada dasarnya suatu program harus dapat terus bejalan dan
pada saat yang sama tetap bisa menerima input dari user, menanggapi klik mouse,
dan sebagainya.
Thread juga digunakan untuk mempercepat suatu proses, misalnya kita ingin
membuat program yang menunggu suatu input I/O dari network, dan pada saat yang
sama mengolahnya sehingga proses pengolahan berjalan serentak. Jika program harus
menunggu seluruh input datang baru kemudian melakukan pengolahan, tentunya akan
memakan waktu yang lebih lama, terutama apabila aliran network lambat atau
pengolahannya memakan waktu lama.
BAB II
PEMBAHASAN
A. PENGERTIAN THREAD
Thread adalah sebuah alur kontrol dari sebuah proses. Kontrol single thread
hanya memungkinkan proses untuk menjalankan satu tugas pada satu waktu. Banyak
sistem operasi modern telah memiliki konsep yang dikembangkan agar
memungkinkan sebuah proses untuk memiliki eksekusi multi-threads, agar dapat
secara terus menerus mengetik dan menjalankan pemeriksaan ejaan didalam proses
yang sama, maka sistem operasi tersebut memungkinkan proses untuk menjalankan
lebih dari satu tugas pada satu waktu.
Thread merupakan unit dasar dari useran CPU, yang terdiri dari Thread_ID,
program counter , register set, dan stack. Sebuah thread berbagi code section, data
section, dan sumber daya sistem operasi dengan thread lain yang dimiliki oleh proses
yang sama. Thread juga sering disebut lightweight process.
//program ke sembilanbelas
//single thread
public class racesingle{
public static void main(String args[]){
raceTest horse1 = new raceTest();
raceTest horse2 = new raceTest();
raceTest horse3 = new raceTest();
System.out.println("\nRace Starting ....\n");
System.out.println("Race started!\n\n");
horse1.run("horse1");
horse2.run("horse2");
horse3.run("horse3");
}
}
class raceTest{
private int pause;
private int stage=0;
public void run(String name){
try{
System.out.println(name + " started!");
do{
System.out.println(
" - stage: " + (stage+1)
);
pause = (int) (Math.random() * 1000);
stage++;
} while (stage<5);
}
catch(Exception exception){
System.out.println(exception.toString());
}
System.out.println(name + " finished!");
}
}
2. Multithread Process
Merupakan satu atau beberapa thread yang dijalankan secara
bersamaan (multiproses), dimana masing-masing thread tersebut dijalankan
pada jalur masing-masing. Setiap thread pada multithread menjalankan kode
atau script program secara berurutan. Multithread dapat diartikan juga sebagai
suatu proses dengan thread banyak dapat mengerjakan lebih dari satu tugas
pada satu satuan waktu.
Multithread sering pula disebut dengan multiproses atau multitasking pada
sistem operasi. Gambar multithread ditunjukkan pada gambar 2.2.
Kadang kala ada situasi dimana sebuah aplikasi diperlukan untuk menjalankan
beberapa tugas yang serupa. Sebagai contohnya sebuah web server dapat
mempunyai ratusan klien yang mengaksesnya secara concurrent. Kalau web
server berjalan sebagai proses yang hanya mempunyai single thread maka ia
hanya dapat melayani satu klien pada pada satu satuan waktu.
Bila ada klien lain yang ingin mengajukan permintaan maka ia harus
menunggu sampai klien sebelumnya selesai dilayani. Solusinya adalah
dengan membuat web server menjadi multithreading. Dengan ini maka sebuah
web server akan membuat thread yang akan mendengar permintaan klien,
ketika permintaan lain diajukan maka web server akan menciptakan thread
lain yang akan melayani permintaan tersebut.
//program keduapuluh
//multithread
public class race{
public static void main(String args[]){
raceThread horse1 = new raceThread("horse1");
raceThread horse2 = new raceThread("horse2");
raceThread horse3 = new raceThread("horse3");
System.out.println("\nRace Starting ....\n");
// Mulai Thread
horse1.start();
horse2.start();
horse3.start();
System.out.println("Race started!\n\n");
}
}
class raceThread extends Thread{
private int pause;
private int stage=0;
public raceThread(String name){
super(name);
}
public void run(){
try{
do {
System.out.println(
this.getName()
+ " - stage: " + (stage+1)
);
pause = (int) (Math.random() * 1000);
Thread.sleep(pause);
stage++;
} while (stage<5);
}
catch(InterruptedException exception){
System.out.println(exception.toString());
}
System.out.println(getName() + " finished!");
}
}
Hasil program :
Race Starting ....
horse1 - stage: 1
horse2 - stage: 1
Race started!
horse3 - stage: 1
horse1 - stage: 2
horse1 - stage: 3
horse3 - stage: 2
horse2 - stage: 2
horse3 - stage: 3
horse1 - stage: 4
horse2 - stage: 3
horse1 - stage: 5
horse3 - stage: 4
horse3 - stage: 5
horse1 finished!
horse3 finished!
horse2 - stage: 4
horse2 - stage: 5
horse2 finished!
C. KEUNTUNGAN THREAD
2. Resource sharing
Thread berbagi memori dan sumber daya dengan thread lain yang
dimiliki oleh proses yang sama. Keuntungan dari berbagi kode adalah
mengizinkan sebuah aplikasi untuk mempunyai beberapa thread yang berbeda
dalam lokasi memori yang sama.
3. Economy
Dalam pembuatan sebuah proses banyak dibutuhkan
pengalokasian memori dan sumber daya. Alternatifnya adalah dengan useran
thread, karena thread berbagi memori dan sumber daya proses yang
memilikinya maka akan lebih ekonomis untuk membuat dan context
switch thread. Akan sulit untuk mengukur perbedaan waktu antara proses
dan thread dalam hal pembuatan dan pengaturan, tetapi secara umum
pembuatan dan pengaturan proses lebih lama dibandingkan thread. Pada
Solaris, pembuatan proses lebih lama 30 kali dibandingkan pembuatan thread,
dan context switch proses 5 kali lebih lama dibandingkan context switch
thread.
b. One to One
Model ini memetakan setiap thread tingkatan user ke setiap thread.
One to One menyediakan lebih banyak concurrency dibandingkan model
Many to One. Keuntungannya sama dengan keuntungan thread kernel.
Kelemahan model ini ialah setiap pembuatan thread user memerlukan
tambahan thread kernel. Karena itu, jika mengimplementasikan sistem ini
maka akan menurunkan kinerja dari sebuah aplikasi sehingga biasanya
jumlah thread dibatasi dalam sistem. Adapun contoh dari one to one, yaitu
Windows NT/XP/2000, Linux, Solaris 9. Gambar 2.4. menunjukkan model
One to One.
E. STATUS THREAD
Suatu thread dapat berada dalam salah satu status seperti berikut ini:
1. New
Thread yang berada pada status ini merupakan objek dari kelas Thread yang
baru dibuat, yaitu saat instansiasi objek dengan statement new. Pada saat thread
berada pada status new, belum ada sumber daya yang dialokasikan, sehingga
thread belum bisa menjalankan perintah apapun.
Menjalankan thread
Method start() dari kelas Thread harus dipanggil, agar thread bisa
menjalankan tugasnya. Ada dua hal yang terjadi pada saat pemanggilan
method start(), yaitu alokasi memori untuk dibuat dan pemanggilan method
run().
2. Runnable
Pada saat method run() dipanggil, maka status thread berubah menjadi
runnable, artinya thread tersebut sudah memenuhi syarat untuk dijalankan oleh
Java Virtual Machine (JVM). Thread yang sedang berjalan juga dikategorikan
dalam status runnable.
Blocking statement dan interupsi I/O
Yaitu kondisi yang menghalangi pengeksekusian thread. Ada beberapa
jenis blocking statement, seperti pemanggilan method sleep(), suatu
method yang menerima argumen bertipe integer dalam bentuk milisekon.
Argumen tersebut menunjukkan berapa lama thread akan “tidur”. Selain
sleep() dulunya dikenal method suspend(), tetapi sudah disarankan untuk
tidak diguankan lagi karena mengakibatkan terjadinya deadlock.
Disamping adanya blocking statement, adanya interupsi I/O juga dapat
menyebabkan thread menjadi blocked.
3. Blocked
Status blocking menunjukkan bahwa sebuah thread terhalang untuk
menjalankan tugasnya, sehingga dapat dikatakan thread tersebut terhenti untuk
sementara. Thread akan menjadi runnable kembali jika interval method sleep()-
nya telah berakhir, atau pemanggilan method resume() untuk mengakhiri
method suspend() atau karena I/O sudah tersedia lagi.
Keluar dari method run()
Hal ini bisa terjadi karena thread tersebut memang telah menyelesaikan
pekerjaannya di method run(), maupun karena adanya pembatalan thread.
4. Dead
Setelah keluar dari method run(), thread akan berada dalam status dead dan
menjadi tidak aktif lagi. Status jelas dari thread tidak dapat diketahui, tetapi
method isAlive() mengembalikan nilai boolean untuk mengetahui apakah
thread tersebut dead atau tidak.
Gambar 2.6. merupakan ringkasan dari status thread.
F. CLASS THREAD
Ada tiga macam class Thread, yaitu:
1. Constructor
a. Thread()
Membuat sebuah object Thread yang baru.
b. Thread(String name)
Membuat sebuah object Thread dengan memberikan penamaan yang
spesifik.
c. Thread(Runnable target)
Membuat sebuah object Thread yang baru berdasar pada object
Runnable. Target menyatakan sebuah object diaman method run()
dipanggil.
d. Thread(Runnable target, String name)
Membuat sebuauh object Thread yang baru dengan nama yang spesifik
dan berdasarkan pada object Runnable.
2. Contants
a. public final static int MIN_PRIORITY
Nilai prioritas minimum, 0
b. public final static int NORM_PRIORITY
Nilai default prioritas, 5
c. public final static int MAX_PRIORITY
Nilai prioritas maksimum, 10
3. Method
a. public static Thread currentThread()
Mengembalikan sebuah reference kepada thread yang sedang berjalan.
b. public final String getName()
Mengembalikan nama thread.
c. public final void setName(String name)
Mengulang pemberian nama thread sesuai dengan argument name. Hal ini
menyebabkan SecurityException.
d. public final int getPriority()
Mengembalikan nilai prioritas yang telah diberikan kepada thread
tersebut.
e. public final boolean isAlive()
Menunjukkan bahwa thread tersebut sedang berjalan atau tidak.
f. public final void sleep (long milis)
Menunda thread dalam jangka waktu milis. Hal ini dapat menyebabkan
InterruptedException.
g. Public void run()
Eksekusi thread dimulai dari method ini.
h. Public void start()
Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil
method run().
G. PRIORITAS THREAD
Untuk menentukan thread mana yang akan menerima control dari CPU
dan akan dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas.
Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10,
dimana semakin tinggi prioritas dari sebuah thread, berarti semakin besar
kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu.
Sebagai contoh, asumsikan bahwa ada dua buah thread yang berjalan bersama-sama.
Thread pertama akan diberikan prioritas nomor 5, sedangkan thread yang kedua
memiliki prioritas 10. Anggap bahwa thread pertama telah berjalan pada saat thread
kedua dijalankan. Thread kedua akan menerima control dari CPU dan akan
dieksekusi pada saat thread kedua tersebut memiliki prioritas yang lebih tinggi
dibandingkan thread yang pada saat itu tengah berjalan.
Salah satu contoh dari skenario ini adalah context switch. Sebuah context switch
terjadi apabila sebagian dari thread telah dikontrol oleh CPU dari thread yang lain.
Ada beberapa skenario mengenai bagaimana cara kerja dari context switch. Salah
satu skenario adalah sebuah thread yang sedang berjalan memberikan kesempatan
kepada CPU untuk mengontrol thread lain sehingga ia dapat berjalan. Dalam
kasus ini, prioritas tertinggi dari thread adalah thread yang siap untuk menerima
kontrol dari CPU. Cara yang lain dari context switch adalah pada saat sebuah thread
yang sedang berjalan diambil alih oleh thread yang memiliki prioritas tertinggi
seperti yang telah dicontohkan sebelumnya.
Hal ini juga mungkin dilakukan apabila lebih dari satu CPU tersedia, sehingga lebih
dari satu prioritas thread yang siap untuk dijalankan. Untuk menentukan diantara dua
thread yang memiliki prioritas sama untuk menerima kontrol dari CPU, sangat
bergantung kepada sistem operasi yang digunakan. Windows 95/98/NT
menggunakan time-slicing dan round-robin untuk menangani kasus ini. Setiap
thread dengan prioritas yang sama akan diberikan sebuah jangka waktu tertentu untuk
dieksekusi sebelum CPU mengontrol thread lain yang memiliki prioritas yang sama.
//program ke duapuluhsatu
//programpriority
class A extends Thread{
public void run(){
System.out.println("Thread A started" );
for(int i=1;i<=4;i++){
System.out.println("\t From ThreadA: i= "+i);
}
System.out.println("Exit from A");
}
}
class ThreadPriority{
public static void main(String args[]){
A threadA=new A();
B threadB=new B();
C threadC=new C();
threadA.setPriority(Thread.NORM_PRIORITY);
threadB.setPriority(Thread.MIN_PRIORITY);
threadC.setPriority(Thread.MAX_PRIORITY);
threadA.start();
threadB.start();
threadC.start();
System.out.println("End of main thread");
}
}
H. PEMBUATAN THREAD
a. Struktur
class MyThread implements Runnable{
.....
public void run(){
// thread body of execution
}
}
b. Membuat Objek
MyThread myObject = new MyThread();
c. Membuat Thread Object:
thread thr1 = new Thread( myObject );
d. Cara menjalankan
thr1.start();
Dari dua cara untuk menciptakan thread seperti diatas, memilih salah satu dari kedua
cara tersebut bukan sebuah permasalahan. Implement sebuah interface Runnable
menyebabkan lebih banyak pekerjaan yang harus dilakukan karena kita
harus mendeklarasikan sebuah object Thread dan memanggil method Thread dari
object tersebut.
Sedangkan menurunkan (extend) sebuah class Thread, bagaimanapun
menyebabkan class tersebut tidak dapat menjadi turunan dari class yang lainnya
karena Java tidak memperbolehkan adanya multiple inheritance.
1. Menyediakan API dalam level pengguna tanpa dukungan dari kernel sehingga
pemanggilan fungsi tidak melalui system call. Jadi, jika memanggil fungsi yang
sudah ada di pustaka, maka akan menghasilkan pemanggilan fungsi call yang
sifatnya lokal dan bukan system call.
2. Menyediakan API di level kernel yang didukung secara langsung oleh sistem
operasi. Pemanggilan fungsi call akan melibatkan system call ke kernel.
Ada tiga pustaka thread yang sering digunakan saat ini, yaitu: POSIX
Pthreads, Java, dan Win32. Implementasi POSIX standard dapat dengan cara user
level dan kernel level, sedangkan Win32 adalah kernel level. Java API thread dapat
diimplementasikan oleh Pthreads atau Win32.
Pada umumnya sistem operasi memperbolehkan proses atau thread untuk dibatalkan
secara asynchronous. Tetapi Pthread API menyediakan deferred cancellation. Hal ini
berarti sistem operasi yang mengimplementasikan Pthread API akan mengizinkan
deferred cancellation.
K. PENJADWALAN THREAD
Thread baru dapat dijalankan dengan berbagai macam penjadwalan pada saat
baru dibuat. Kebijakan penjadwalan yang menentukan setiap proses, di mana proses
tersebut akan ditaruh dalam daftar proses sesuai proritasnya dan bagaimana thread
bergerak dalam daftar proses tersebut.
Untuk menjadwalkan thread, sistem dengan model mulithreading many to many atau
many to one menggunakan:
L. SINKRONISASI
Thread yang berjalan bersama-sama tetapi tidak bergantung satu dengan yang
lainnya. Thread tersebut adalah thread yang berjalan sendiri tanpa memperhatikan
status dan aktifitas dari thread lain yang sedang berjalan. Pada hal tersebut, setiap
thread tidak membutuhkan resource atau method dari luar sehingga tidak
membutuhkan komunikasi dengan thread lain.
Contoh program yang tidak disinkronisasi, yaitu sebuah kode sederhana yang
mencetak sebuah string dengan urutan tertentu.
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
Contoh program diatas, tidak menunjukkan permasalahan yang serius. Akan tetapi
pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahan-
permasalahan tertentu.
Berikut ini adalah contoh program yang telah disinkronisasi dari sebuah objek yang
bernama account digunakan oleh beberapa objek, yaitu MyThread, YourThread,
dan HerThread, terlihat pada gambar 2.7.
Didalam objek account tersebut ada nilai yang diubah oleh ketiga objek yang
mengakses objek account. MyThread menambah nilai 1 sebanyak 10 kali dengan
pemanggilan objek sebanyak 5 kali pada variabel balance di dalam objek account.
YourThread mengurangi nilai 1 sebanyak 10 kali pada variable balance didalam
objek account dengan pemanggilan objek sebanyak 5 kali. Dan HerThread hanya
menampilkan nilai variable balance sebanyak 10 kali didalam objek.
}catch(InterruptedException exception){
System.out.println(exception.toString());
}
}
}
//shared object
class Account {
int balance = 0;
int i=0;
public void deposit( ) {
i=0;
do {
balance += 1;
i++;
System.out.println(balance + " deposit " + i);
}while (i<10);
}
class Account {
int balance = 0;
int i=0;
public synchronized void deposit( ) {
i=0;
do {
balance += 1;
i++;
System.out.println(balance + " deposit " + i);
}while (i<10);
}
public synchronized void withdraw( ) {
i=0;
do {
balance -= 1;
i++;
System.out.println(balance + " withdraw " + i );
}while (i<10);
}
public synchronized void enquire( ) {
i=0;
do {
i++;
System.out.println(balance + " Enquire " + i);
}while (i<10);
}
}
1 deposit 1
2 deposit 2
3 deposit 3
4 deposit 4
5 deposit 5
…
-5 deposit 5
-4 deposit 6
-3 deposit 7
-2 deposit 8
-1 deposit 9
0 deposit 10
0 Enquire 1
0 Enquire 2
0 Enquire 3
0 Enquire 4
0 Enquire 5
0 Enquire 6
0 Enquire 7
0 Enquire 8
0 Enquire 9
0 Enquire 10
Finished executing
BAB III
PENUTUP
A. KESIMPULAN
Thread adalah sebuah alur kontrol dari sebuah proses. Thread terbagi menjadi
dua jenis yaitu Single Thread dan Multithread. Dilihat dari kegunaannya multithread
adalah thread yang paling banyak dipakai akhir-akhir ini. Suatu proses yang
multithreaded mengandung beberapa perbedaan alur kontrol dengan ruang alamat
yang sama. Keuntungan dari multithreaded meliputi peningkatan respon dari user,
pembagian sumber daya proses, ekonomis, dan kemampuan untuk mengambil
keuntungan dari arsitektur multiprosesor. User level thread adalah thread yang
tampak oleh programmer dan tidak diketahui oleh kernel. User level thread secara
tipikal dikelola oleh sebuah library thread di ruang user. Kernel level thread didukung
dan dikelola oleh kernel sistem operasi. Secara umum, user level thread lebih cepat
dalam pembuatan dan pengelolaan dari pada kernel thread. Ada tiga perbedaan tipe
dari model yang berhubungan dengan user dan kernel thread.
• Model many to one: memetakan beberapa user level thread hanya ke satu
buah kernel thread.
• Model one to one: memetakan setiap user thread ke dalam satu kernel thread.
berakhir.
• Model many to many: mengizinkan pengembang untuk membuat user thread
sebanyak mungkin, konkurensi tidak dapat tercapai karena hanya satu thread
yang dapat dijadualkan oleh kernel dalam satu waktu.
Java adalah unik karena telah mendukung thread didalam tingkatan bahasanya.
Semua program Java sedikitnya terdiri dari kontrol sebuah thread tunggal dan
mempermudah membuat kontrol untuk multiple thread dengan program yang sama.
JAVA juga menyediakan library berupa API(Application Program Interface) untuk
membuat thread, termasuk method untuk suspend dan resume suatu thread, agar
thread tidur untuk jangka waktu tertentu dan menghentikan thread yang berjalan.
Sebuah java thread juga mempunyai empat kemungkinan keadaan, diantaranya: New,
Runnable, Blocked dan Dead. Perbedaan API untuk mengelola thread seringkali
mengganti keadaan thread itu sendiri.
B. SARAN
http://irfantek.blogspot.com/2015/12/makalah-proses-dan-thread.html?=1
https://yudiansyahstimik.wordpress.com/2013/02/18/makalah-system-operasi/
https://sysvictoryjc.blogspot.com/2018/03/makalah-struktur-sistem-operasi_29.html?
=1
https://sanjayfirmanzyah97.blogspot.com/2017/03/mengupas-sedikit-tentang-sistem-
operasi.html
J.E.N.I. -. Pengenalan Pemrograman 2. Jakarta: Jardiknas.
Gata, Windu. 2005. Bahasa Pemrograman Java Gui, Error Exception, Thread, I/O
(Input/Output), Database & Pembuatan Laporan. Jakarta:-.
Silberschatz, Abraham, Peter Baer Galvin, dan Greg Gagne. 2005. Operating
System Concepts. Seventh Edition. USA: John Wiley & Sons, Inc.
https://www.java.lyracc.com/belajar/java-untuk-pemula/dasar-dasar-thread.
http://ulpiupie.blogspot.com/2012/04/prosesthread-dalam-sistem-operasi.html
http://id.wikipedia.org/wiki/sistem_operasi
https://www.academia.edu/18745198/MAKALAH_SISTEM_OPERASI