Daftar Isi
Daftar Isi
.. i
Overview Kernel Linux . 1 1. Linux versus Kernel UNIX-like lainnya 1 2. Dependensi Hardware ... 2 3. Versi Linux .. 3 4. Konsep Dasar Sistem Operasi ... 3 4.1. Sistem Multiuser .............. . 4 4.2. User dan Group ............... . 4 4.3. Proses 4 4.4. Arsitektur Kernel .. 5 5. Overview Kernel Linux ... 6 5.1. Model Proses/Kernel . 6 5.2. Implementasi Proses . 7 5.3. Kernel Reentrant . 8 5.4. Ruang Alamat Proses 9 5.5. Sinkronisasi dan Critical Region .. 9 5.5.1. Nonpreemptive kernel 10 5.5.2. Interrupt disabling .. 10 5.5.3. Semaphore .. 10 5.5.4. Spin lock 11 5.5.5. Menghindari deadlock 11 Signal dan Komunikasi Antarproses . 12 Manajemen Proses 13 5.7.1. Proses zombie .. 13 5.7.2. Process group dan login session . 14 Manajemen Memori .. 14 5.8.1. Virtual memory . 14 5.8.2. Penggunaan random access memory .. 15 5.8.3. Kernel Memory Allocator . 15 5.8.4. Penanganan ruang alamat virtual proses 16 5.8.5. Swapping dan Caching .. 16 Device Driver . 17
5.9.
Signal ..18 1. Pengertian Signal 18 1.1. Struktur data dari signal .. 18 1.2. Operasi pada struktur data signal .. 19 2. Real Time Signal . 22
Secara umum, Linux menawarkan beberapa hal di bawah ini dibandingkan dengan sistem UNIX-like komersil : Linux gratis Sistem UNIX dapat di-install tanpa biaya kecuali biaya untuk hardware. Seluruh komponen Linux dapat disesuaikan (customizable) Karena di bawah GNU public license, source code kernel dapat dilihat dan diubah sesuai kebutuhan. Linux dapat berjalan pada platform hardware low-end yang murah Server jaringan dapat dibangun pada sistem Intel 80386 lama dengan 4 MB RAM. Linux memiliki fitur yang powerful Sistem Linux memiliki kecepatan tinggi karena menggunakan seluruh kemampuan hardware. Targer utama Linux adalah efisiensi. Linux memiliki standar kualitas source code yang tinggi Sistem Linux stabil, memiliki tingkat kegagalan dan waktu maintenance yang rendah Kernel Linux memiliki ukuran yang kecil dan padat. Sebuah kernel image, root filesystem, dan program sistem dasar dapat ditulis dalam sebuah disket floppy 1.44. Linux kompatibel dengan sistem operasi lainnya. Linux dapat me-mount filesystem MS-DOS, MS Windows, SVR4, OS/2, Mac OS, Solaris, Sun OS, NeXTSTEP, dan berbagai varian BSD. Linux juga mampu mengoperasikan berbagai layer jaringan seperti Ethernet, FDDI, HIPPI, IBM Token Ring, AT&T WaveLAN, dan lain sebagainya. Linux memiliki dukungan penuh Lebih mudah untuk mendapatkan patch dan update untuk sistem Linux daripada sistem operasi lainnya.
2. Dependensi Hardware
Linux berusaha untuk membedakan source code yang hardware dependent dengan yang hardware independent. Oleh karena itu, direktori arch dan include memiliki sembilan subdirektori untuk masing-masing platform yang didukung oleh Linux yaitu arm (Acorn personal computer) alpha (Compaq Alpha workstation) i386 (IBM-compatible personal computer berbasis Intel 80x86 atau Intel 80x86-compatibel micropocessor) m68k (Personal computer berbasis Motorola MC 680x0 micropocessor) mips (Workstation berbasis Silicon Graphics MIPS microprocessor) ppc (Workstation berbasis Motorola-IBM PowerPC microprocessor) sparc (Workstation berbasis Sun Microsystem SPARC microprocessor) sparc64 (Workstation berbasis Sun Microsystem 64-bit Ultra SPARC microprocessor) s390 (Mainframe IBM System/390)
Halaman 2 dari 22
3. Versi Linux
Linux membedakan antara versi yang stabil dengan versi yang sedang dalam pengembangan melalui skema penomoran versi. Setiap versi dikarakterisasi kan melalui tiga angka dipisahkan dengan titik. Dua angka pertama menunjukkan versi, satu angka terakhir menunjukkan rilis. Angka kedua yang genap menunjukkan versi yang stabil dan angka yang ganjil menunjukkan versi kernel yang dalam pengembangan. Gambar 1. Penomoran versi Linux
Versi yang stabil biasanya bertujuan untuk memperbaiki bug yang dilaporkan oleh pemakai. Algoritma dan struktur data untuk implementasi kernel tidak mengalami perubahan. Berbeda dengan versi yang stabil, dalam versi pengembangan developer dapat bereksperimen dengan berbagai macam solusi yang mungkin dapat menimbulkan perubahan besar dalam kernel.
Sistem operasi UNIX-like menyembunyikan semua detail low-level yang berkaitan dengan organisasi fisik komputer dari aplikasi yang dijalankan pemakai. Sebuah program yang ingin menggunakan sumber daya hardware harus membuat request kepada sistem operasi. Kernel memeriksa request dan berinteraksi dengan hardware atas nama aplikasi pemakai jika request tersebut dipenuhi. Mekanisme tersebut bergantung pada ketersediaan fitur hardware yang dapat membedakan mode eksekusi untuk CPU yaitu nonpriviledge mode (User Mode) untuk program user dan priviledge mode (Kernel Mode) untuk kernel.
Halaman 3 dari 22
account, melakukan tugas maintenance, dan lain sebagainya. Root user dapat mengakses setiap file dalam sistem dan dapat mengambil alih program user lainnya.
4.3. Proses
Sebuah proses dapat didefinisikan sebagai instans eksekusi program. Sistem operasi modern memungkinkan proses memiliki beberapa flow eksekusi, yaitu beberapa sekuens instruksi yang dieksekusi pada ruang alamat yang sama. Sistem multiuser harus dapat menciptakan lingkungan tempat beberapa proses dapat aktif secara konkuren dan saling bersaing untuk sumberdaya sistem. Sistem yang memungkinkan proses aktif konkuren disebut sebagai multiprogramming atau multiprocessing. Beberapa proses dapat mengeksekusi program yang sama secara konkuren sedangkan proses yang sama dapat mengeksekusi beberapa program secara sekuensial.
Halaman 4 dari 22
Komponen sistem operasi yang menentukan proses mana yang dapat dilanjutkan disebut scheduler. Beberapa sistem operasi hanya memungkinkan proses nonpreemptive yang berarti scheduler hanya diaktifkan ketika proses secara sukarela melepaskan aksesnya terhadap CPU. Namun proses untuk sistem multiuser harus preemptive yaitu sistem operasi harus mencatat jangka waktu sebuah proses mengakses CPU dan secara periodik mengaktifkan scheduler.
Halaman 5 dari 22
Tidak ada kemunduran kinerja Setelah di-link, kode objek modul setara dengan kode objek yang di-link secara statis sehingga tidak ada message passing yang diperlukan ketika fungsi sebuah modul dijalankan.
Gambar di bawah ini menunjukkan bagaimana transisi antara User Mode dan Kernel Mode. Proses 1 pada User Mode mengeluarkan system call sehingga proses beralih ke Kernel Mode dan system call terlayani. Proses 1 kemudian melanjutkan eksekusi di User Mode hingga interrupt timer terjadi dan dan scheduler diaktivasi di dalam Kernel Mode. Process switch terjadi dan proses 2 memulai eksekusinya di User Mode hingga sebuah device hardware melakukan interrupt . Akibatnya, proses 2 beralih ke Kernel Mode dan melayani interrupt yang bersangkutan.
Halaman 6 dari 22
Kernel Linux tidak hanya menangani system call. Rutin kernel dapat diaktivasi melalui beberapa cara : Sebuah proses menjalankan system call CPU yang sedang mengeksekusi program mengeluarkan signal ecxeption karena kondisi tidak normal seperti instruksi invalid. Peripheral device mengeluarkan interrupt signal ke CPU untuk memberitahukan adanya kejadian seperti attention request, perubahan status, penyelesaian operasi I/O. Tiap interrupt signal ditangani oleh program kernel yang disebut interrupt handler. Karena peripheral device berjalan asinkron dengan CPU, interrupt tidak dapat diprediksi. Sebuah kernel thread dieksekusi. Karena kernel thread berjalan pada Kernel Mode maka program yang bersangkutan sebagai bagian dari kernel walaupun ia sebenernya terenkapsulasi dalam proses.
Ketika kernel memutuskan untuk melanjutkan eksekusi proses, kernel menggunakan process descriptor yang sesuai untuk di-load ke register CPU. Karena isi dari Program Counter menunjuk ke instruksi yang mengikuti instruksi terakhir yang dieksekusi maka proses yang bersangkutan melanjutkan eksekusi dari tempat terakhir ia berhenti.
Halaman 7 dari 22
Sebuah proses yang sedang berlangsung di User Mode mengeluarkan system call dan kernel control path yang bersangkutan memverifikasi bahwa permintaan tersebut tidak dapat langsung dipenuhi. Kernel kemudian menjalankan scheduler untuk memilih proses berikutnya untuk dijalankan. Akibatnya sebuah process switch terjadi. Kernel control path pertama dibiarkan tidak selesai dan CPU melanjutkan eksekusi kernel contol path lainnya. Dalam hal ini kedua kernel control path dieksekusi untuk dua proses yang berbeda. CPU mendeteksi exception ketika dalam kernel control path (misalnya request untuk mengakses page yang tidak terdapat di RAM). Control path pertama dihentikan dan CPU menjalankan prosedur yang sesuai. Untuk contoh exception di atas, prosedur dapat berupa alokasi page baru untuk proses dan read isinya dari disk. Ketika prosedur berakhir, control path pertama dapat dilanjutkan. Dalam hal ini kedua control path dieksekusi untuk proses yang sama. Sebuah interrupt hardware terjadi ketika CPU sedang berjalan dalam kernel control path dengan interrupt enable. Kernel control path pertama dibiarkan tidak selesai dan CPU mulai memproses kernel conrol path lainnya untuk menangani interrupt. Kernel control path pertama dilanjutkan ketika interrupt handler diterminasi. Dalam hal ini kedua kernel control path berjalan dalam execution context proses yang sama. Walaupun demikian, interrupt handler tidak perlu beroperasi untuk proses tersebut.
Halaman 8 dari 22
Gambar di bawah menunjukkan beberapa contoh noninterleaved dan interleaved kernel control path. Tiga status CPU yang menjadi perhatian : Menjalankan proses dalam User Mode (User) Menjalankan exception atau system call handler (Excp) Menjalankan interrupt handler (Intr)
Halaman 9 dari 22
Hal ini tidak hanya terjadi di antara kernel control path tetapi juga pada prosesproses yang membagi data bersama. Beberapa teknik sinkronisasi telah digunakan yaitu : 5.5.1. Nonpreemptive kernel Solusi sederhana paling drastis untuk masalah sinkronisasi adalah penggunaan nonpreemptive kernel. Ketika sebuah proses dieksekusi di Kernel Mode, proses tersebut tidak dapat dihentikan sementara atau digantikan oleh proses lain. Dengan demikian, pada sistem uniprosesor semua struktur data yang tidak di-update interrupt atau exception handler aman untuk diakses oleh kernel. Sebuah proses dalam Kernel Mode dapat melepaskan CPU secara sukarela tetapi dalam hal ini proses tersebut harus memastikan bahwa semua struktur data dalam keadaan yang konsisten. Selain itu, ketika proses tersebut melanjutkan eksekusi, proses harus memeriksa ulang nilai dari struktur data yang terakhir diakses yang mungkin berubah. Nonpreemptive tidak efisien dalam sistem multiprosesor karena dua kernel control path yang berjalan pada CPU yang berbeda dapat mengakses struktur data yang sama secara konkuren. 5.5.2. Interrupt disabling Mekanisme sinkronisasi lainnya untuk sistem uniprosesor adalah dengan men-disable semua interrupt hardware sebelum memasuki critical region dan meng-enable mereka kembali tepat setelah keluar dari critical region. Mekanisme ini, walaupun sederhana, tidak optimal. Jika critical region-nya besar, interrupt tetap disable untuk jangka waktu yang lama sehingga menghentikan semua aktivitas hardware. Selain itu, dalam sistem multiprosesor mekanisme ini tidak bekerja sama sekali. Tidak ada cara untuk memastikan bahwa tidak ada CPU lain yang dapat mengakses struktur data yang sama dalam critical region yang diproteksi tersebut. 5.5.3. Semaphore Semaphore adalah mekanisme efektif yang digunakan baik pada sistem uniprosesor maupun sistem multiprosesor. Semaphore pada dasarnya adalah counter yang diasosiasikan dengan struktur data. Semaphore diperiksa oleh semua kernel thread sebelum kernel thread tersebut mencoba untuk mengakses struktur data. Setiap semaphore dapat dipandang sebagai objek yang terdiri atas Variable integer List proses yang sedang menunggu (waiting) Dua metode atomik : down() atau up()
Metode down() mengurangi nilai dari semaphore. Jika nilai yang baru kurang dari 0, metode ini menambahkan proses yang sedang berjalan ke list semaphore dan memblock proses tersebut. Metode up() menambah nilai dari semaphore dan jika nilai barunya sama dengan atau lebih dari 0, mengaktivasi kembali proses dalam semaphore list.
Halaman 10 dari
Tiap stuktur data yang diproteksi memiliki semaphorenya masing-masing yang diinisiasi dari 1. Ketika sebuah kernel control path akan mengakses struktrur data tersebut, control path mengeksekusi metode down() pada semaphore bersangkutan. Jika nilai baru semaphore tidak negatif, akses ke data dapat dilakukan. Sebaliknya jika nilai baru negatif, proses yang mengeksekusi kernel control path ditambahkan ke dalam list semaphore dan di-block. Ketika proses lain mengeksekusi metode up() pada semaphore tersebut, salah satu dari proses dalam list diperbolehkan untuk dilanjutkan. 5.5.4. Spin lock Dalam sistem multiprosesor, semaphore tidak selalu menjadi solusi terbaik untuk masalah sinkronisasi. Beberapa struktur data kernel harus dirproteksi dari akses konkuren oleh kernel control path yang berjalan pada CPU yang berbeda. Dalam hal ini, jika waktu yang dibutuhkan untuk update struktur data hanya sebentar, semaphore menjadi tidak efisien. Untuk memeriksa sebuah semaphore, kernel harus memasukkan proses ke dalam list semaphore dan menghentikannya sementara. Karena kedua operasi tersebut biayanya tinggi, membutuhkan waktu yang lama untuk menyelesaikannya, kernel control path lainnya mungkin telah melepaskan semaphore. Untuk kasus ini, sistem multiprosesor menggunakan teknik spin lock. Spin lock hampir sama dengan semaphore tetapi tidak menggunakan list proses. Ketika suatu proses menemukan lock (kunci) ditutup oleh proses lain, proses tersebut mengeksekusi loop instruksi kecil hingga lock terbuka. Akan tetapi spin lock tidak berguna dalam lingkungan uniprosesor. Ketika sebuah kernel control path mencoba mengakses sebuah struktur data yang terkunci, control path memulai loop infinit. Oleh karenanya, kernel control path yang sedang mengupdate struktur data yang diproteksi tidak memiliki kesempatan untuk melanjutkan eksekusi dan membuka lock. Akhirnya sistem mengalami hang. 5.5.5. Menghindari deadlock Proses atau kernel control path yang bersinkronisasi dengan control path lainnya dapat dengan mudah mengalami keadaaan deadlock. Deadlock terjadi ketika suatu proses p1 mengakses struktur data a dan proses p2 mengakses struktur data b, tetapi p1 menunggu b dan p2 menunggu a. Sebuah deadlock mengakibatkan berhenti secara keseluruhannya proses dan kernel conrol path yang terpengaruh. Deadlock menjadi masalah ketika jumlah tipe semaphore kernel banyak. Dalam hal ini, akan menjadi sulit untuk menentukan tidak ada deadlock yang akan terjadi untuk semua cara interleave bagi kernel control path Beberapa sistem operasi termasuk Linux menghindari masalah ini dengan menggunakan jumlah tipe semaphore yang terbatas dan melakukan request ke semaphore secara berurutan.
Halaman 11 dari
Standar POSIX mendefinisikan 20 macam signal, dua di antaranya user-defined dan dapat digunakan sebagai mekanisme primitif untuk komunikasi dan sinkronisasi antara proses dalam User Mode. Secara umum, sebuah proses dapat merespon suatu signal dengan dua cara yaitu : Mengabaikan signal Mengeksekusi secara asinkron suatu prosedur spesifik (signal handler)
Jika suatu proses tidak melakukan salah satu dari dua alternatif di atas, kernel akan melakukan default action yang bergantung pada nomor signal. Lima default action yang mungkin dilakukan adalah : Melakukan terminasi proses Menulis execution context dan isi dari ruang alamat dalam sebuah file (core dump) dan melakukan terminasi proses Mengabaikan signal Menghentikan proses sementara (suspend) Melanjutkan eksekusi proses, jika dihentikan sebelumnya
Penanganan signal kernel lebih rumit karena semantik POSIX memperbolehkan proses untuk mem-block signal untuk sementara waktu. Selain itu, beberapa signal seperti SIGKILL tidak dapat langsung ditangani oleh proses dan tidak dapat diabaikan (ignore). Kernel mengimplementasi konstruksi ini sebagai IPC resource yaitu sebuah proses yang mengambil sumber daya dengan menjalankan system call shmget(), semget(), atau msgget(). Seperti file, IPC resource harus didealokasi secara eksplisit oleh proses yang membuatnya, proses yang memilikinya, atau proses superuser. Semaphore hampir sama dengan semaphore yang dijelaskan pada bagian sebelumnya, kecuali bahwa semaphore di sini digunakan untuk proses dalam User Mode. Message queue memungkinkan proses untuk bertukar pesan dengan menggunakan system call msgsnd() dan msgget() yang secara berurutan memasukkan pesan ke dalam message queue spesifik dan mengambil pesan darinya. Shared memory menyediakan cara tercepat bagi proses untuk bertukar dan berbagi data. Sebuah proses mulai dengan mengeluarkan system call shmget() untuk membuat shared memory baru. Setelah memiliki identfier IPC resource, proses tersebut kemudian menjalankan system call shmat() yang mengembalikan alamat
Overview Kernel Linux dan Signaling 22 Halaman 12 dari
awal dari region baru di dalam ruang alamat proses. Ketika proses hendak melepas shared memory dari ruang alamatnya, proses tersebut menjalankan system call shmdt(). Implementasi shared memory tergantung pada bagaimana kernel mengimplementasi ruang alamat proses.
Halaman 13 dari
5.7.2. Process group dan login session Sistem operasi UNIX modern menggunakan istilah process group untuk merepresentasikan abstraksi job. Sebagai contoh untuk mengeksekusi perintah $ ls | sort | more Sebuah shell yang mendukung process group (misalnya bash) membuat sebuah group baru untuk ls, sort, dan more. Dengan cara ini shell berfungsi untuk ketiga proses sebagaimana mereka merupakan sebuah entitas tunggal (job). Setiap process descriptor mengandung field process ID. Setiap process group dapat mempunyai group leader yaitu proses yang PID-nya sama dengan ID process group. Sebuah proses yang baru dinisialiasasi dengan dimasukkan ke dalam process group parentnya. Kernel UNIX modern juga menggunakan login session. Login session terdiri atas semua proses yang merupakan turunan dari proses yang telah berjalan pada terminal tertentu (biasanya proses command shell yang pertama kali dibuat untuk user). Semua proses yang terdapat dalam sebuah process group harus berada dalam login session yang sama Sebuah login session dapat memiliki beberapa process group yang aktif secara bersamaan. Salah satu dari process group tersebut selalu berada di foreground yang berarti memiliki akses ke terminal. Process group yang aktif lainnya berada di background. Ketika sebuah process group background berusaha untuk mengakses terminal, process group tersebut menerima signal SIGTTIN atau SIGTTOUT. Pada banyak command shell perintah internal bg dan fg dapat digunakan untuk meletakkan proses di background atau foreground.
Halaman 14 dari
Komponen utama dari subsistem virtual memory adalah ruang alamat virtual. Referensi memori yang digunakan oleh sebuah proses berbeda dari alamat memori fisik. Ketika sebuah proses menggunakan alamat virtual, kernel dan MMU bekerja sama untuk menentukan lokasi fisik yang sebenarnya. 5.8.2. Penggunaan random access memory Semua sistem operasi UNIX membedakan dua bagian dari RAM. Beberapa megabyte digunakan untuk menyimpan image kernel (kode kernel dan struktur data kernel statis). Sisanya ditangani oleh sistem virtual memory dan digunakan dengan tiga kemungkinan : Memenuhi request kernel atas buffer, descriptor, dan struktur data kernel dinamis lainnya Memenuhi request proses atas area memori generik dan untuk file mapping. Meningkatkan kinerja disk dan perangkat buffer lainnya dengan metode cache.
Setiap request terhadap memori memiliki nilai penting, sedangkan RAM yang tersedia memiliki ukuran terbatas. Bila sebuah proses berisi algoritma untuk membebaskan memori dijalankan sedangkan memori telah penuh, perlu metode untuk menentukan page frame mana yang harus dilepaskan. Masalah lain yang timbul dalam virtual memory system adalah fragmentasi memori. Idealnya, request terhadap memori hanya gagal bila jumlah page frame yang tersedia lebih kecil daripada yang diminta. Namun terkadang kernel diharuskan untuk menggunakan memori fisik secara kontigu sehingga request terhadap memori juga dapat gagal jika ruang memori mencukupi tetapi tidak tersedia dalam satu kesatuan kontigu. 5.8.3. Kernel Memory Allocator Kernel Memory Allocator (KMA) adalah subsistem yang bertujuan untuk memenuhi request memori dari semua bagian sistem. Beberapa request dapat berasal dari subsistem kernal lain yang membutuhkan memori untuk digunakan kernel, dan beberapa request lainnya dapat berasal dari system call oleh program user untuk meminta tambahan ruang alamat bagi prosesnya. KMA yang baik harus memiliki fitur sebagai berikut : Bekerja dengan cepat, merupakan atribut terpenting karena dijalankan oleh semua subsitem kernel (termasuk interrupt handler) Meminimasi memori yang tidak digunakan Mengurangi masalah fragmentasi memori Mampu bekerja sama dengan subsistem manajemen memori lainnya untuk meminjam atau melepas page frame dari manajemen memori lain tersebut
Terdapat beberapa jenis KMA yang didasarkan pada beberapa teknik algoritma sebagai berikut : Resource map allocator Power-of-two free list McKusick-Karel allocator
Halaman 15 dari
Buddy system Mach Zone allocator Dynix allocator Solaris Slab allocator
5.8.4. Penanganan ruang alamat virtual proses Ruang alamat dari suatu proses berisi semua ruang alamat virtual yang diperbolehkan untuk diakses oleh proses. Kernel biasanya menyimpan ruang alamat virtual sebagai list memory area descriptor. Sebagai contoh, ketika proses memulai eksekusi program melalui system call exec(), kernel menentukan ruang alamat virtual kepada proses yang berisi area memori untuk : Executable code dari program Data inisialisasi dari program Data tidak terinisialisasi dari program Program stack inisialisasi (yaitu User Mode stack) Executable code dan data dari library yang di-share Heap (memori yang di-request secara dinamis oleh program)
Sistem operasi UNIX menggunakan strategi alokasi memori berupa demand paging. Dengan demand paging, sebuah proses dapat memulai eksekusi program tanpa adanya page-nya yang berada di memori fisik. Ketika program mengakses page yang tidak ada tersebut, MMU mengeluarkan exception. Exception handler kemudian menemukan memori region yang dimaksud, mengalokasi page yang masih free, dan menginisialisasikannya dengan data yang sesuai. Dengan cara yang sama, ketika proses membutuhkan memori secara dinamis menggunakan system call malloc() atau brk(), kernel hanya memperbarui ukuran region heap memory dari proses. Sebuah page frame di-assign ke sebuah proses hanya ketika proses tersebut mengeluarkan exception ketika mereferensi ke alamat memori virtual. 5.8.5. Swapping dan Caching Untuk memperbesar ukuran ruang alamat virtual yang dapat digunakan oleh proses, sistem operasi UNIX menggunakan swap area dari disk. Sistem virtual memori menganggap isi dari sebuah page frame sebagai unit dasar swapping. Ketika sebuah proses me-refer pada page yang di-swapped out, MMU mengeluarkan exception. Exception handler kemudian mengalokasi page frame baru dan menginisialisasinya dengan isi lama yang tersimpan dalam disk. Memori fisik juga digunakan sebagai cache untuk hard disk dan device block lainnya. Karena hard disk bekerja dengan lambat maka sering menjadi bottle neck dalam kinerja sistem. Untuk mengatasinya maka sistem berupaya untuk men-delay penulisan ke disk selama mungkin dengan me-load ke RAM buffer disk yang bersesuaian dengan blok yang dibaca dari disk. System call sync() melakukan sinkronisasi disk dengan menulis semua dirty buffer (semua buffer yang isinya berbeda dengan isi blok yang sesuai pada disk) ke disk. Untuk menghindari hilangnya data, sistem operasi menulis dirty buffer ke disk secara periodik.
Halaman 16 dari
Gambar di bawah mengilustrasikan antarmuka device driver dengan komponen kernel lainnya dan dengan proses. Beberapa user program akan beroperasi pada device hardware. Program tersebut melakukan request ke kernel menggunakan system call yang file-related dan file device ditemukan secara normal pada direktori /dev. Pada dasarnya, device file adalah bagian antarmuka device driver yang visible untuk user. Tiap file device me-refer pada driver device spesifik yang dijalankan kernel untuk melakukan operasi yang direquest pada komponen hardware. Gambar 4. Antarmuka Device Driver
Halaman 17 dari
Signal
1. Pengertian Signal
Signal adalah pesan singkat yang dikirimkan ke suatu proses atau suatu grup dari proses. Yang dikirim ke suatu proses biasanya hanya nomor yang mengidentifikasi suatu signal. Fungsi dari signal : Untuk memberitahukan kepada sebuah proses bahwa suatu kejadian tertentu telah terjadi Untuk memaksa suatu proses mengeksekusi signal handler Karakteristik dari signal : Bisa dikirim ke proses manapun kapanpun Signal yang dikirim ke proses yang sedang tidak berjalan, harus disimpan oleh kernel sampai proses tersebut melanjutkan eksekusinya Setiap signal hanya bisa diterima sekali saja Signal bersifat consumable resources, jadi setelah diterima signal dan deskriptornya akan dihancurkan Pada waktu tertentu hanya boleh terdapat satu pending signal untuk satu proses tertentu dengan tipe signal tertentu. Pending signal adalah signal yang telah dikirim ke suatu proses, tapi belum diterima oleh proses tersebut. Jika terjadi lebih dari satu pending signal, masing masing pending signal tidak akan dibuatkan antriannya, tapi langsung dibuang Fungsi dari Kernel terkait dengan signal : Mengingat signal mana yang di-blok oleh suatu proses Ketika berubah dari kernel mode ke user mode, mencek apakah ada signal untuk masing masing proses tiba. Menentukan apakah suatu signal dapat di-ignore. Signal dapat di-ignore jika memenuhi : o Proses tujuan tidak sedang di-trace oleh proses lain o Signal tidak di-blok oleh proses tujuan o Signal memang di-ignore oleh proses tujuan Menangani signal sesuai dengan bagaimana signal tersebut harus ditangani.
Halaman 18 dari
Unsigned long, memiliki panjang 32 bits. Karena tidak ada signal yang memiliki nomor nol, maka jumlah signal standar yang ada adalah 31 buah signal. Pada proses descriptor, untuk mengetahui signal signal yang dikirim ke suatu proses, ditambahkan bagian bagian berikut : signal : variable bertype sigset_t yang menyatakan signal yang dikirimkan ke proses. blocked : variable bertype sigset_t yang menyatakan signal yang di blok sigpending : sebuah flag yang bernilai true jika satu atau lebih signal yang tidak diblok sedang pending gsig : pointer ke signal_struct, struktur data yang menyatakan bagaimana sebuah signal di handle
Proses descriptor adalah data data yang yang berisi informasi tentang proses yang berjalan. Isinya antara lain general purpose register, floating point register, program counter, stack pointer, dan lain lain. Sedangkan signal_struct memiliki struktur data : struct signal_struct { atomic_t struct k_sigaction spinlock_t };
count menyatakan jumlah proses yang yang ikut membagi struktur data signal_struct, sementara siglock digunakan untuk menjamin akses yang eksklusif ke masing masing field signal_struct oleh suatu proses. Sedangkan action menyatakan bagaimana signal tersebut di handle. Sedangkan untuk platform intel, k_sigaction digantikan oleh struktur sigaction yang memiliki field : sa_handler : field ini menentukan tipe aksi yang akan dilakukan terhadap signal tersebut. sa_flags : flag ini menenetukan bagaimana suatu signal di-handle sa_mask : variable bertipe sigset_t ini menentukan signal mana yang harus di mask jika signal handler sedang berjalan.
Halaman 19 dari
sigaddset(set,nsig) and sigdelset(set,nsig); Fungsinya untuk menset nilai bit ke nsig dari variable bertype sigset_t menjadi 0 atau 1. sigaddsetmask(set,mask) and sigdelsetmask(set, mask) Fungsinya untuk menset nilai bit ke mask dari variable bertype sigset_t menjadi 0 atau 1. sigismember(set,nsig) Fungsinya untuk mengembalikan nilai dari bit ke nsig dari variable bertype sigset_t sigmask(nsig) mengembalikan bit index dari signal nsig signal_pending(p) Fungsinya untuk menentukan apakah signal p adalah signal yang sedang pending recalc_sigpending(t) Fungsinya untuk memeriksa apakah proses dengan proses descriptor t memiliki signal yang sedang pending dengan melihat signal dan blocked pada proses descriptornya dan menset nilai sigpending dengan benar sigandsets(d,s1,s2), sigorsets(d,s1,s2), and signandsets(d,s1,s2) Fungsinya untuk melakukan logical AND, OR, dan NAND antara variable bertype sigset_t s1 dan s2 dan menyimpan hasilnya di variable bertype sigset_t d dequeue_signal(mask, info) Fungsinya untuk memeriksa apakah proses yang sedang berjalan memiliki signal yang sedang pending, jika ya mengembalikan nomor terkecil dari signal yang pending dan melakukan update terhadap proses descriptor untuk menyatakan signal dengan nomor terkecil tersebut sudah tidak pending lagi tapi sudah menjadi signal yang aktif sekarang. mask menyatakan bit bit dari signal yang akan di blok sedangkan info digunakan untuk menyimpan signal signal yang di dequeue flush_signals(t) Fungsinya untuk menghapus semua signal yang dikirim ke proses dengan proses descriptor t
Proses transmisi dari signal dibagi menjadi dua fase : 1. Mengirim Signal Kernel mengupdate proses descriptor dari proses yang dituju dengan menambahkan bahwa sebuah signal baru telah dikirim. Untuk melakukan pengiriman signal kernel menggunakan fungsi send_sig_info(), send_sig(), force_sig_info(), and force_sig().
Halaman 20 dari
a. Fungsi send_sig_info( ) dan send_sig( ) send_sig_info( ) memiliki tiga parameter, yakni : sig yang menyatakan nomor dari signal, info yang menyatakan table bertype siginfo_t dari signal real time yang terkait atau mungkin satu dari dua nilai special yang menyatakan pengirim signal, jika 1 berarti signal dikirim oleh kernel sedangkan nilai yang lain berarti signal dikirim oleh proses user mode. siginfo_t memiliki struktur data yang harus dikirim ke proses tujuan yang akan menerima real time signal, seperti PID dan UID. Sedangkan parameter terakhir adalah t yang berupa pointer ke descriptor dari proses tujuan. Fungsi ini memulai dengan melakukan pengecekan apakah parameter sig bernilai antara 1 sampai 63. Jika ya maka dilakukan pengecekan apakah signal dikirim oleh proses user. Hal ini dilakukan dengan melihat nilai si_code pada table siginfo_t, jika bernilai 0 maka proses user. Kemudian dilakukan pengecekan apakah signal dikirim oleh user yang memiliki capability untuk mengeksekusi signal tersebut, signal adalah SIGCONT, atau proses tujuan memiliki sesi login yang sama dengan proses pengirim. send_sig() memiliki perbedaan pada parameternya dimana info digantikan oleh flag priv, yang bernilai true jika signal dikirim oleh kernel dan false jika dikirim oleh suatu proses. b. Fungsi force_sig_info( ) and force_sig( ) Fungsi force_sig_info() dan force_sig() memiliki parameter yang sama. Signal yang dikirim dengan force_sig_info() adalah signal yang sifatnya tidak bisa di-ignore ataupun diblock. Sedangkan force_sig() hanya digunakan untuk signal signal yang dikirim oleh kernel saja. 2. Menerima Signal Kernel memaksa proses yang dituju untuk bereaksi terhadap signal baru yang dikirimkan. Untuk melakukan ini kernel mengeksekusi fungsi do_signal() yang memiliki dua parameter, yakni regs yang menyatakan alamat dari stack dimana isi dari register user mode dari proses yang sedang berjalan disimpan dan oldset yang menyatakan alamat dari variable tempat fungsi harus menyimpan bit bit signal yang di blok. Fungsi ini melakukan dequeue_signal() sampai tidak ada lagi signal yang sedang pending. Nilai balik dari fungsi ini disimpan ke suatu variable local, signr, jika nilainya sudah nol berarti pending signal sudah ditangani dan do_signal() berhenti dieksekusi. Tapi jika nilainya bukan nol maka do_signal() akan terus dieksekusi dan do_signal() akan meload suatu variable ka bertype k_sigaction untuk memberitahu bagaimana suatu signal ditangani.
Halaman 21 dari
Bagaimana suatu signal ditangani tergantung isi dari variable k_sigaction tersebut. Ada tiga macam aksi yang bisa dilakukan, antara lain : Meng-ignore signal Meng-ignore signal dilakukan dengan melanjutkan eksekusi dari loop do_signal() ke signal yang sedang pending berikutnya. Mengeksekusi aksi default dari signal Aksi default yang bisa dilakukan antara lain abort, yakni proses yang sedang berjalan di-kill. Dump, yakni proses yang berjalan di-kill dan dibuat suatu core file yang berisi hal hal tentang proses pengeksekusian. File ini bisa digunakan untuk melakukan debug. Stop, yakni proses dihentikan dan continue, yakni proses dijalankan kembali. Mengeksekusi signal handler Jika signal memiliki signal handler tertentu maka do_signal() harus memaksa pengeksekusian signal handler tersebut dengan mengeksekusi fungsi handle_signal (signr, ka, &info, oldset, regs) Signal handler adalah fungsi yang didefinisikan oleh proses user mode. Jadi pengeksekusian signal handler melibatkan pengeksekusian handle_signal() di kernel dan pengeksekusian handler itu sendiri pada user mode, yang berarti signal handler harus dieksekusi dulu pada user mode.
Setiap proses descriptor memiliki field sigqueue yang menyatakan elemen pertama signal real time yang diterima dan sigqueue_tail yang meyatakan elemen terakhir dari signal real time yang diterima. Pada proses pengiriman signal dengan send_sig_info(), dilakukan pengecekan apakah signal yang dikirim adalah signal real time, jika ya maka signal akan dimasukkan ke queue dari proses tujuan. Sedangkan untuk penerimaan signal, dequeue_signal() memeriksa apakah signal yang sedang pending adalah signal real time, jika ya signal akan dikeluarkan dari queue signal real time yang diterima.
Halaman 22 dari