Anda di halaman 1dari 24

MAKALAH

Overview Kernel Linux dan Signaling

Kharizt A. G. (13501036) I Nyoman Winardi (13501040) Angga Danimartiawan (13501080)

Departemen Teknik Informatika Institut Teknologi Bandung 27 Desember 2003

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.6. 5.7. 5.8.

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

Overview Kernel Linux


Linux adalah anggota dari keluarga sistem operasi yang UNIX-like seperti System V Release 4, 4.4BSD, Digital UNIX, AIX HP-UX, dan Solaris. Pada awalnya, Linux dikembangkan oleh Linus Torvalds pada tahun 1991 sebagai sistem operasi untuk IBM compatible personal computer dengan basis Intel 80368 mikroprosesor. Kini, Linux juga tersedia untuk berbagai arsitektur lainnya seperti Alpha, SPARC, Motorola MC680x0, Power PC, dan IBM System/390. Salah satu kelebihan yang dimiliki Linux adalah bahwa Linux bukan sistem operasi komersial. Source code-nya yang dikembangkan di bawah GNU public license terbuka untuk umum untuk dipelajari dan dikembangkan.

1. Linux versus Kernel UNIX-like lainnya


Berikut ini beberapa hal yang dimiliki Linux dibandingkan terhadap sistem UNIX-like lainnya : Linux kernel adalah monolitik, yaitu program besar dan kompleks yang dibangun atas komponen-komponen yang berbeda. Hampir semua sistem UNIX-like juga merupakan sistem monolitik. Linux mampu me-load dan unload modul (bagian dari kernel code) secara dinamis sebagaimana dalam kernel SVR4.2. Sistem UNIX-like lainnya dikompilasi dan di-link secara statis. Kernel threading. Kernel thread adalah execution context yang dapat dijadwalkan secara independen dan dapat diasosiasikan terhadap user program atau menjalankan beberapa fungsi kernel saja. Context switch antara kernel thread lebih murah biayanya daripada context switch antara proses biasa. Dukungan aplikasi multithread yaitu program yang terdiri dari beberapa execution flow independen yang berbagi application data structure. Sebuah multithread application dapat terdiri atas beberapa lightweight process (LWP) yaitu proses yang berbagi alamat memori, page memori fisik, file yang terbuka, dan lain-lain. Varian UNIX komersil lain berdasar pada kernel thread, Linux menganggap lightweight thread sebagai execution context dasar dan mengaturnya dengan system call clone(). Linux adalah kernel nonpreemptive sehingga tidak dapat meninggalkan execution flow ketika sedang berada pada priviledge mode. Hanya Solaris 2.x dan Mach 3.0 yang mengadopsi kernel preemptive. Dukungan multiprosesor. Linux mempunyai dukungan untuk SMP (Symmetric Multiprocessing) yang berarti bahwa sistem tidak hanya dapat menggunakan beberapa prosesor tetapi juga tiap prosesor dapat digunakan untuk menjalankan task manapun tanpa diskriminasi. Sistem file Linux tidak memiliki fitur yang sempurna. Namun demikian, porting sebuah sistem file lain ke Linux mudah untuk dilakukan dengan Virtual File System Technology. STREAMS. Linux tidak memiliki analog terhadap terhadap subsistem STREAMS I/O sebagaimana terdapat pada SVR4 walaupun sudah menjadi interface umum pada kernel UNIX untuk menulis device driver, terminal driver, dan network protocol.
Halaman 1 dari 22

Overview Kernel Linux dan Signaling

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)

Overview Kernel Linux dan Signaling

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.

4. Konsep Dasar Sistem Operasi


Sebuah sistem komputer memiliki kumpulan program dasar yang disebut sistem operasi. Program-program yang paling penting dalam sistem operasi tersebut disebut kernel. Kernel diload ke dalam RAM ketika system boot dan mengandung prosedur kritis yang dibutuhkan sistem untuk beroperasi. Sebuah sistem operasi harus memenuhi dua tujuan dasar : Berinteraksi dengan komponen hardware yang melayani elemen-elemen yang dapat diprogram yang terdapat pada platform hardware. Menyediakan lingkungan eksekusi kepada aplikasi yang berjalan pada komputer.

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.

Overview Kernel Linux dan Signaling

Halaman 3 dari 22

4.1. Sistem Multiuser


Sistem multiuser adalah komputer yang dapat mengeksekusi beberapa aplikasi yang dimiliki dua user atau lebih secara konkuren dan independen. Konkuren berarti aplikasi dapat aktif secara bersamaan dan saling bersaing untuk menggunakan sumber daya seperti CPU, memori, hard disk, dan lain sebagainya. Independen maksudnya adalah setiap aplikasi dapat menjalankan task-nya tanpa harus mempedulikan apa yang sedang dijalankan oleh pemakai lainnya. Sistem operasi yang multiuser harus memiliki beberapa fitur : Mekanisme authentication untuk verifikasi identitas pemakai Mekanisme proteksi terhadap program user yang mengandung bug sehingga menghindari kemungkinan mem-block aplikasi lain dalam sistem. Mekanisme proteksi terhadap program user yang dapat mengganggu atau memata-matai aktivitas user lain. Mekanisme penghitungan yang membatasi jumlah sumberdaya yang dapat dialokasi untuk masing-masing pemakai.

4.2. User dan Group


Dalam sebuah sistem multiuser, setiap user memiliki ruang privat dalam sistem, Umumnya, ia memiliki kuota dari harddisk untuk menyimpan file. Sistem operasi harus dapat memastikan bahwa ruang privat seorang user hanya dapat diakses oleh user yang bersangkutan. Sistem harus memastikan bahwa tidak ada user yang dapat mengeksploitasi aplikasi sistem untuk melanggar ruang privat user lain. Mekanisme untuk menjamin hal tersebut adalah dengan penggunaan User ID dan password yang harus dimasukkan user ketika ia login. Untuk dapat berbagi file secara selektif antar-user, setiap user adalah anggota dari sebuah group. Setiap file diasosiasikan untuk setiap groups. Setiap group memiliki hak akses yang berbeda untuk sebuah file. Sistem operasi UNIX-like memiliki user spesial yang disebut root,superuser, atau supervisor. Administrator sistem harus login sebagai root untuk dapat mengatur user

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.

Overview Kernel Linux dan Signaling

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.

4.4. Arsitektur Kernel


Sebagaimana disebutkan sebelumnya, kernel UNIX adalah monolitik : setiap layer kernel terintegrasi dalam seluruh kernel program dan berjalan pada Kernel Mode atas proses yang sedang berlangsung. Berbeda dengan monolitik, sistem operasi mikrokernel membutuhkan himpunan kecil dari fungsi-fungsi kernel yang umumnya terdiri dari primiti sinkronisasi, scheduler sederhana, dan mekanisme komunikasi antarproses. Beberapa proses sistem yang berjalan di atas microkernel mengimplementasikan fungsi layer sistem operasi lainnya seperti memory allocator, device driver, system call handler, dan lain sebagainya. Sistem operasi mikrokernel umumnya lebih lambat daripada sistem operasi monolitik karena message passing yang eksplisit antara layer yang berbeda dari sistem operasi. Namun demikian, sistem operasi mikrokernel memiliki kelebihan yaitu memaksa system developer untuk melakukan pengembangan dengan pendekatan modular. Hal ini karena setiap layer sistem operasi pada dasarnya adalah program independen yang harus berinterkasi dengan layer lainnya melalui antarmuka yang terdefinisi dengan baik. Dengan demikian, sistem operasi mikrokernel akan mudah untuk dipindahkan ke arsitektur yang berbeda karena komponen yang hardware dependent terenkapsulasi dalam kode mikrokernel. Modul adalah sebuah file objek yang kodenya dapat di-link ke (dan di-unlink dari) kernel pada saat run-time. Kode objek biasanya terdiri atas fungsi yang mengimplementasi filesystem, device driver, atau fitur layer atas kernel. Modul tidak berjalan sebagai proses spesifik sebagaiaman layer eksternal sistem operasi melainkan dieksekusi di Kernel Mode terhadap proses yang sedang berjalan sebagaimana fungsi kernel yang di-link secara statis. Bebereapa keuntungan dari penggunaan modul adalah : Pendekatan modular Karena tiap modul dapat di-link dan di-unlink saat runtime, programer sistem harus medefinisikan dengan baik antarmuka software untuk mengakses struktur data yang ditangani modul. Hal ini memudahkan dalam pengembangan modul baru. Independensi terhadap platform Walaupun tergantung pada fitur hardware yang spesifik, sebuah modul tidak bergantung pada paltform hardware tertentu. Sebagai contoh, modul disk drive untuk IBM compatible PC juga dapat bekerja dengan baik pada Compaq Alpha. Penggunaan memori utama yang efisien Sebuah modul dapat di-link pada kernel yang sedang berjalan ketika fungsinya sedang diperlukan dan di-unlink kembali ketika tidak lagi digunakan.

Overview Kernel Linux dan Signaling

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.

5. Overview Kernel Linux


Kernel Linux menyediakan lingkungan eksekusi tempat aplikasi dapat berjalan. Oleh karenanya kernel harus menyediakan layanan dan antarmuka yang bersesuaian. Aplikasi menggunakan antarmuka tersebut dan tidak berinteraksi secara langsung dengan sumberdaya hardware.

5.1. Model Proses/Kernel


Kernel UNIX standar menggunakan dua macam mode CPU yaitu Kernel Mode dan User Mode. Ketika sebuah program dieksekusi di User Mode, program tersebut tidak dapat mengakses struktur data kernel maupun program kernel. Dalam Kernel Mode hal tersebut dapat dilakukan. Sebuah program lebih banyak berlangsung pada di User Mode dan berpindah ke Kernel Mode ketika meminta layanan kernel. Bila permintaan telah dipenuhi maka kernel akan mengembalikan ke User Mode. Proses adalah entitas dinamik yang memiliki waktu hidup yang terbatas pada sistem. Task untuk membuat, menghilangkan, dan sinkronisasi antarproses didelegasikan ke kumpulan rutin pada kernel. Kernel berfungsi sebagai process manager. Model proses/kernel berasumsi bahwa proses yang membutuhkan layanan kernel menggunakan konstruksi pemrograman spesifik yang disebut system call. Setiap system call menyatakan parameter yang mengidentifikasi request proses dan mengeksekusi instuksi CPU untuk beralih dari User Mode ke Kernel Mode. Di samping proses user, sistem UNIX mengandung proses yang disebut kernel thread dengan karakteristik : Berjalan di Kernel Mode pada ruang alamat kernel Tidak berinteraksi dengan user sehingga tidak membutuhkan terminal device Dibuat ketika system startup dan tetap ada hingga system shut down

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.

Overview Kernel Linux dan Signaling

Halaman 6 dari 22

Gambar 2. Transisi antara Kernel dan User Mode

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.

5.2. Implementasi Proses


Agar kernel dapat mengatur proses-proses yang berbeda, setiap proses direpresentasikan dengan process descriptor yang mengandung informasi mengenai current state dari proses. Ketika kernel menghentikan eksekusi dari sebuah proses, kernel menyimpan isi dari register proses ke dalam process descriptor yang terdiri atas : Program Counter (PC) dan Stack Pointer (SP) General purpose register Floating point register Processor control register (Processor Status Word) berisi informasi state CPU Memory management register yang berfungsi menelusuri RAM yang diakses oleh 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.

Overview Kernel Linux dan Signaling

Halaman 7 dari 22

5.3. Kernel Reentrant


Semua kernel UNIX adalah reentrant yang berarti beberapa proses dapat berlangsung dalam Kernel Mode pada waktu yang sama. Sebuah sistem uniprosesor hanya memungkinkan satu proses yang dapat berlangsung dalam suatu waktu tetapi proses-proses tersebut dapat di-block dalam Kernel Mode untuk menunggu CPU atau penyelesaian beberapa operasi I/O. Sebagai contoh, setelah mengeluarkan perintah read kepada disk, kernel akan membiarkan disk controller untuk menangani perintah tersebut dan kernel meneruskan mengeksekusi proses lainnya. Sebuah interrupt akan menotifikasi kernel ketika device telah menyelesaikan perintah read sehingga proses sebelumnya dapat kembali dilanjutkan. Ketika suatu interrupt hardware berlangsung, reentrant kernel dapat menghentikan sementara proses yang sedang berjalan walaupun ketika proses tersebut dalam Kernel Mode. Kemampuan ini sangat penting karena dapat meningkatkan throughput dari device controller yang mengeluarkan interrupt. Ketika suatu device mengeluarkan interrupt, device tersebut menunggu jawaban dari CPU. Jika kernel dapat memberi jawaban dalam waktu singkat, device controller dapat melanjutkan task lain sementara CPU menangani interrupt tersebut. Sebuah kernel control path adalah sekuens instruksi yang dieksekusi kernel menangani system call, exception, atau interrupt. Dalam kasus yang sederhana, CPU mengeksekusi sebuah kernel control path dari awal hingga Namun demikian, CPU meninggalkan kernel control path ketika salah satu berikut terjadi : untuk paling akhir. event

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.

Overview Kernel Linux dan Signaling

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)

Gambar 3. Interleaving Kernel Control Path

5.4. Ruang Alamat Proses


Setiap proses berjalan di dalam ruang alamat privat masing-masing. Sebuah proses yang berjalan dalam User Mode merujuk pada private stack, data, dan code area. Ketika berjalan dalam Kernel Mode, proses memiliki alamat pada data kernel, code area, dan menggunakan stack yang lain. Terdapat saat-saat tertentu ketika bagian tertentu dari ruang alamat privat dapat dibagi kepada beberapa proses. Dalam beberapa hal pembagian ini diminta secara eksplisit oleh proses. Pada hal lain pembagian dilakukan secara otomatis oleh kernel untuk mengurangi penggunaan memori.

5.5. Sinkronisasi dan Critical Region


Implementasi reentrant kernel memerlukan penggunaan sinkronisasi, yaitu jika sebuah kernel control path dihentikan sementara ketika mengakses suatu struktur data kernel, tidak ada kernel control path lainnya yang diperbolehkan untuk mengakses struktur data yang sama kecuali jika telah di-reset pada state yang konsisten. Jika tidak demikian, interaksi dari kedua control path dapat merusak informasi yang telah tersimpan. Ketika hasil dari suatu komputasi tergantung pada penjadwalan dua atau lebih proses maka code-nya tidak benar. Keadaan ini disebut sebagai race condition. Pada umumnya akses yang aman terhadap variabel global dapat dilakukan dengan menggunakan operasi atomik. Walaupun demikian, kernel mempunyai struktur data yang tidak dapat diakses dengan operasi tunggal. Suatu bagian code yang harus diselesaikan oleh tiap proses yang memulainya sebelum proses lain dapat memasukinya disebut sebagai critical region.

Overview Kernel Linux dan Signaling

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.

Overview Kernel Linux dan Signaling 22

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.

Overview Kernel Linux dan Signaling 22

Halaman 11 dari

5.6. Signal dan Komunikasi Antarproses


Signal UNIX memberikan mekanisme untuk memberitahu system event kepada proses. Tiap event memiliki nomer signal-nya masing-masing yang biasanya dirujuk melalui konstanta simbolik seperti SIGTERM. Terdapat dua macam system event : Asynchronous notification Sebagai contoh, user dapat mengirimkan signal SIGTERM ke proses dengan menggunakan interupt key (CTRL+C) pada terminal. Synchronous error dan exception Sebagai contoh, kernel mengirimkan signal SIGSEGV ke proses ketika proses itu mengakses lokasi memori dengan alamat yang illegal.

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.

5.7. Manajemen Proses


UNIX membuat perbedaan yang jelas antara proses dan program yang mengeksekusinya. System call fork() dan exit () digunakan untuk membuat proses baru dan terminasi proses, sedangkan system call exec() dijalankan untuk me-load program baru. Setelah system call tersebut dieksekusi, proses melanjutkan eksekusi dengan ruang alamat baru yang berisi program yang telah di-load. Proses yang menjalankan fork() adalah parent sedangkan proses baru disebut child. Parent dan children dapat saling menemukan karena struktur data yang mendeskripsikan kedua proses mengandung pointer ke parent tepat di atasnya dan pointer ke semua childrennya. System call exit() melakukan terminasi proses. Kernel menangani system call ini dengan melepas resource yang dimiliki proses dan mengirim signal SIGCHLD ke proses parent. 5.7.1. Proses zombie System call wait() membiarkan proses untuk menunggu terminasi proses anaknya dan mengembalikan Process ID (PID) dari proses anak yang diterminasi. Saat mengeksekusi system call wait() tersebut, kernel memeriksa apakah proses anak telah diterminasi. Keadaaan proses khusus yang disebut zombie process merepresentasi proses yang diterminasi tersebut. Sebuah proses tetap berada dalam keadaan tersebut hingga proses induk memanggil system call wait() System call handler kemudian mengambil beberapa data mengenai penggunaan resource dari process descriptor field kemudian melepaskan data tersebut ketika berhasil dikumpulkan. Jika tidak terdapat proses anak yang telah diterminasi ketika wait() dijalankan, kernel menempatkan proses dalam kondisi wait() hingga sebuah proses anak diterminasi. Banyak pula kernel yang menimplementasikan system call waitpid() yang membuat sebuah proses menunggu proses anak tertentu. Jika sebuah proses induk diterminasi tanpa mengeluarkan system call wait(), informasi proses anak akan menggunakan slot memori yang seharusnya dapat digunakan untuk proses lain yang sedang berjalan. Solusi dari masalah ini adalah adanya proses sistem khusus yaitu init yang dibuat ketika inisialisasi sistem. Ketika sebuah proses diterminasi, kernel mengubah semua pointer proses anak yang masih berjalan sehingga menjadikan mereka anak dari proses init. Proses ini memonitor eksekusi dari semua anaknya dan mengeluarkan system call wait() secara rutin dengan tujuan terminasi seluruh proses zombie.

Overview Kernel Linux dan Signaling 22

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.

5.8. Manajemen Memori


Manajemen memori adalah aktivitas yang paling kompleks dalam kernel UNIX. 5.8.1. Virtual memory Virtual memori berperilaku sebagai layer logik antara request memori aplikasi dan Memory Management Unit (MMU). Virtual memory memiliki tujuan dan kelebihan : Beberapa proses dapat dieksekusi secara konkuren Aplikasi dapat tetap berjalan walaupun kebutuhan memori lebih besar daripada memori fisik yang tersedia Proses dapat menjalankan program yang hanya sebagian dari kodenya yang di-load ke memori Setiap proses diperbolehkan mengakses subset dari memori fisik yang tersedia Proses yang berbeda dapat saling berbagi suatu image memori dari library atau program Program relocatable, yaitu dapat diletakkan di mana pun pada memori fisik Programmer dapat menulis kode yang machine-independent karena mereka tidak perlu berurusan dengan organisasi memori fisik

Overview Kernel Linux dan Signaling 22

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

Overview Kernel Linux dan Signaling 22

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.

Overview Kernel Linux dan Signaling 22

Halaman 16 dari

5.9. Device Driver


Kernel berinteraksi dengan device I/O melalui device driver. Device driver disertakan dalam kernel dan terdiri atas struktur data dan fungsi yang mengontrol satu atau lebih device (harddisk, keyboard, mouse, monitor, antarmuka jaringan, device SCSI). Setiap driver berinteraksi dengan bagian kernel lainnya melalui antarmuka khusus. Pendekatan ini memiliki beberapa kelebihan : Kode yang spesifik terhadap device tertentu terenkapsulasi pada modul khusus Vendor dapat menambahkan device baru tanpa harus mengetahui source code kernel. Vendor hanya perlu mengetahui spesifikasi antarmuka Kernel berhubungan dengan semua device melalui cara yang sama dan mengakses mereka dengan antarmuka yang sama pula Memungkinkan untuk menulis device driver sebagai suatu modul yang dapat di-load secara dinamis tanpa harus reboot system. Modul juga dapat diunload secara dinamis bila tidak lagi dugunakan sehingga meminimasi ukuran kernel image yang disimpan dalam RAM

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

Overview Kernel Linux dan Signaling 22

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.

1.1. Struktur data dari signal


Struktur data yang digunakan untuk menyimpan signal yang dikirim ke suatu proses adalah sigset_t, array dari bit bit, dimana satu bit mewakili satu signal : typedef struct { unsigned long sig[2]; } sigset_t;

Overview Kernel Linux dan Signaling 22

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; action[64]; siglock;

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.

1.2. Operasi pada struktur data signal


Pada masing masing prosedur dan fungsi berlaku :
set adalah pointer ke variable bertype sigset_t nsig adalah nomor dari signal mask adalah unsigned long

Overview Kernel Linux dan Signaling 22

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().

Overview Kernel Linux dan Signaling 22

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.

Overview Kernel Linux dan Signaling 22

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.

2. Real Time Signal


Real time signal adalah signal signal yang memiliki nomor signal dari 32 sampai dengan 63. Perbedaan antara signal standar dan signal real time adalah signal real time dengan tipe yang sama bisa dibuat antriannya. Queuenya adalah sebagai berikut :
struct signal_queue { struct signal_queue *next; siginfo_t info; }; next adalah elemen berikutnya dari signal_queue.

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.

Overview Kernel Linux dan Signaling 22

Halaman 22 dari