Input Output pada Linux
Desember 03, 2012
I/O
Linux
Salah satu tujuan OS adalah menyembunyikan kerumitan
device hardware dari sistem penggunanya. Contohnya, Sistem Berkas Virtual
menyamakan tampilan sistem berkas yang dimount tanpa memperdulikan devices
fisik yang berada di bawahnya. Bab
ini akan menjelaskan bagaimana kernel Linux mengatur device fisik di sistem.
Salah satu fitur yang mendasar adalah kernel mengabstraksi penanganan device.
Semua device hardware terlihat seperti berkas pada umumnya: mereka dapat
dibuka, ditutup, dibaca, dan ditulis menggunakan calls sistem yang sama dan
standar untuk memanipulasi berkas. Setiap device di sistem direpresentasikan
oleh sebuah file khusus device, contohnya disk IDE yang pertama di sistem
direpresentasikan dengan /dev/hda. Devices blok (disk) dan karakter dibuat
dengan perintah mknod dan untuk menjelaskan device tersebut digunakan nomor
devices besar dan kecil. Devices jaringan juga direpresentasikan dengan berkas
khusus device, tapi berkas ini dibuat oleh Linux setelah Linux menemukan dan
menginisialisasi pengontrol-pengontrol jaringan di sistem. Semua device yang
dikontrol oleh driver device yang sama memiliki nomor device besar yang umum.
Nomor devices kecil digunakan untuk membedakan antara device-device yang
berbeda dan pengontrol-pengontrol mereka, contohnya setiap partisi di disk IDE
utama punya sebuah nomor device kecil yang berbeda. Jadi, /dev/hda2, yang
merupakan partisi kedua dari disk IDE utama, punya nomor besar 3 dan nomor
kecil yaitu 2. Linux memetakan berkas khusus device yang diteruskan ke system
call (katakanlah melakukan mount ke sistem berkas device blok) pada driver si
device dengan menggunakan nomor device besar dan sejumlah tabel sistem,
contohnya tabel device karakter, chrdevs. Linux membagi devices ke tiga kelas:
devices karakter, devices blok dan devices jaringan.
Device Karakter
Gambar 7-5. CharDev. Sumber: . . .
Device
karakter, device paling sederhana dari Linux, diakses sebagai berkas. Aplikasi
menggunakan system calls standar untuk membukanya, membacanya dan
menulisnya dan menutupnya persis seolah devices adalah berkas. Memang benar,
meski pun devices ini merupakan modem yang sedang digunakan oleh PPP daemon
untuk menghubungkan sistem Linux ke jaringan. Saat sebuah device karakter diinisialisasi,
driver devicenya mendaftarkan sang device pada kernel Linux dengan menambahkan sebuah
entry ke vektor chrdevs dari struk data device_struct. Pengenal utama devicenya
digunakan sebagai indeks ke vektor ini. Pengenal utama untuk suatu device tidak
pernah berubah. Setiap entry di vektor chrdevs, sebuah struk data
device_struct, mengandung dua elemen: sebuah penunjuk nama dari driver devices
yang terdaftar dan sebuah penunjuk ke operasi-operasi berkas seperti buka,
baca, tulis, dan tutup. Isi dari /proc/devices untuk devices karakter diambil
dari vektor chrdevs. Saat sebuah berkas khusus karakter yang merepresentasikan
sebuah devices karakter (contohnya/dev/cua0) dibuka, kernelnya harus mengatur
beberapa hal sehingga routine operasi berkas yang benar dari driver devices
karakter akan terpanggil. Seperti sebuah berkas atau direktori pada umumnya,
setiap berkas khusus device direpresentasikan dengan sebuah inode VFS. Inode
VFS untuk sebuah berkas khusus karakter tersebut, sebenarnya untuk semua berkas
yang berada dibawahnya, contohnya EXT2. Hal ini terlihat dari informasi di
berkas yang sebenarnya ketika nama berkas khusus device dilihat. Setiap inode
VFS memiliki keterkaitan dengan seperangkat operasi berkas dan operasi-operasi
ini berbeda tergantung pada objek sistem berkas yang direpresentasikan oleh
inode tersebut. Kapan pun sebuah VFS yang merepsentasikan berkas khusus
karakter dibuat, operasi-operasi berkasnya diset ke operasi device karakter
default. VFS inode memiliki hanya satu operasi berkas, yaitu operasi membuka
berkas. Saat berkas khusus karakter dibuka oleh sebuah aplikasi, operasi buka
berkas yang umum atau generik menggunakan pengenal utama dari device tersebut.
Pengenal ini digunakan sebagai index ke vektor chrdevs untuk memperoleh blok
operasi berkas untuk device tertentu ini. Ia juga membangun struk data berkas
yang menjelaskan berkas khusus karakter ini, yang membuat penunjuk operasi
berkas menunjuk ke driver device itu. Setelah itu semua aplikasi dari
operasi-operasi berkas aplikasi akan dipetakan untuk memanggil perangkat devices
karakter dari operasi berkas itu.
Device Blok
Device ini pun diakses
seperti berkas. Mekanisme untuk menyediakan perangkat operasi berkas yang benar
bagi berkas khusus blok yang terbuka sama seperti devices karakter. Linux
memelihara operasi dari perangkat device blok yang terdaftar sebagai vektor
blkdevs. Vektor ini, seperti halnya vektor chrdevs, diindeks dengan menggunakan
nomor device besar dari sang device. Entrynya juga merupakan struk data
device_struct. Tidak seperti devices karakter, ada sejumlah kelas yang dimiliki
device blok. Device-device SCSI adalah salah satu kelasnya dan device IDE
adalah kelas lainnya. Kelaslah yang mendaftarkan dirinya sendiri pada kernel
Linux dan menyediakan operasi berkas kepada kernel. Driver-driver device untuk
sebuah kelas device blok menyediakan interface khusus kelas kepada kelas tersebut.
Jadi, contohnya, sebuah driver device SCSI harus menyediakan interface untuk
subsistem SCSI agar dapat menyediakan operasi berkas bagi devices ini ke
kernel. Setiap driver device blok harus menyediakan sebuah interface ke cache
buffernya, demikian pula interface operasi umum berkas. Setiap driver device blok mengisi entrynya di
vektor blk_dev dari struk data blk_dev_struct. Indeksnya ke vektor ini,
lagi-lagi, nomor utama devicenya. Struk data blk_dev_struct mengandung alamat
routine permintaan dan sebuah penunjuk ke sekumpulan struk data request,yang
masing-masingnya merepresentasikan sebuah request dari cache buffernya untuk
driver untuk membaca atau menulis atau menulis satu blok data.
Gambar 7-6.
Buffer. Sumber: . . .
Setiap kali cache buffer ingin membaca dari, atau pun
menuliskan satu blok data ke device terdaftar, ia menambahkan
struk data request kedalam blk_dev_struct nya. Gambar di atas ini menunjukkan
bahwa setiap request memiliki pointer (penunjuk) ke satu atau lebih
struk data buffer_head. Masing-masingnya merupakan suatu request untuk membaca
atau menulis sebuah blok data. Struk buffer_head tersebut dikunci (oleh cache
buffer) dan mungkin ada suatu proses yang menunggu buffer ini selesai di
operasi blok tersebut. Setiap struk request dialokasikan dari suatu daftar yang
statik, yaitu daftar all_request. Jika proses tersebut sedang dimasukkan sebuah
ke list request yang kosong, fungsi request dari drivernya akan dipanggil agar
memulai proses antrian request. Jika tidak driver tersebut hanya akan memproses
setiap request di daftar request. Sekali driver device telah menyelesaikan
sebuah request, ia harus membuang setiap stuk buffer_request dari struk
requestnya, kemudian mencapnya up to date dan membuka kuncinya.
Pembukaan kunci buffer_head akan membangunkan proses apa pun yang tidur akibat
menunggu operasi blok selesai. Contoh dari kasus ini misalnya dimana sebuah
nama berkas sedang ditangani dan sistem berkas EXT2 harus membaca blok data
yang mengandung entry direktori EXT2 berikutnya dari device blok yang menyimpan
sistem berkas tersebut. Proses ini tidur di buffer_head yang akan mengandung
entri direktorinya sampai driver devicenya membangunkannya. Struk data request
tersebut ditandai bebas sehingga ia dapat digunakan di request blok lainnya.
Device Jaringan
Device jaringan merupakan sebuah entity yang
mengirimkan dan menerima paket-paket data. Biasanya ia merupakan device fisik
seperti kartu ethernet. Beberapa devices jaringan bagaimana pun hanyalah software,
seperti device loopback yang digunakan untuk mengirimkan data ke Anda. Setiap
device direpresentasikan dengan struk data device. Driver device jaringan
mendaftarkan device-device yang ia kontrol pada Linux selama inisialisasi
jaringan yaitu saat kernel melakukan booting. Struk data device tersebut berisi
informasi mengenai device dan alamat fungsi-fungsi yang memungkinkan bermacam-macam
protokol jaringan menggunakan layanan dari device tersebut. Fungsi-fungsi ini kebanyakan
terkait dengan mentransmisikan data dengan menggunakan device jaringan. Device
tersebut menggunakan mekanisme pendukung jaringan standar untuk melewatkan data
yang diterima sampai ke lapisan protokol yang semestinya. Semua data jaringan
atau paket yang ditransmisikan dan diterima, direpresentasikan dengan
struk-struk data sk_buff. Struk-struk data yang bersifat fleksibel ini memungkinkan
header-header protokol jaringan menjadi mudah ditambahkan dan dibuang. Bagian
ini hanya memfokuskan pada struk data device serta bagaimana jaringan ditemukan
dan diinsialisasi. Struk data device ini mengandung informasi tentang device
jaringan.
Nama
Berbeda
dengan device karakter dan blok yang menggunakan berkas khusus device yang
dibuat dengan perintah mknod, berkas khusus device terlihat sekilas seperti
device jaringan sistem yang ditemukan dan diinsialisasi. Nama mereka standar,
yaitu setiap nama merepsentasikan jenis device masing-masing. Device multiple
dari jenis yang sama dinomori lebih besar dari 0. Oleh sebab itu device-device
ethernet dikenal sebagai /dev/eth0, /dev/eth1, /dev/eth2 dan seterusnya.
Beberapa
device jaringan yang umum adalah
• /dev/ethN Device ethernet
• /dev/slN Device SLIP
• /dev/pppN Device PPP
• /dev/lo Device Loopback
Informasi Bus
Berikut ini adalah informasi yang driver device
butuhkan untuk mengontrol devicenya. Nomor irq merupakan interrupt yang
digunakan oleh device ini. Alamat basisnya adalah alamat dari segala register status
dan control dari device yang ada di memori I/O. Channel DMA adalah nomor DMA
yang device jaringan ini gunakan. Semua
informasi ini diset pada waktu booting, yaitu saat device ini diinisialisasi.
Flags
Interface
Hal-hal
berikut ini akan menjelaskan karakteristik dan kemampuan dari device jaringan:
• IFF_UP Interface bangkit dan berjalan,
• IFF_BROADCAST Alamat broadcast di device adalah sah
• IFF_DEBUG
Penghilangan error dinyalakan
• IFF_LOOPBACK Merupakan device loopback
• IFF_POINTTOPOINT Merupakan link point to point
(SLIP dan PPP)
•
IFF_NOTRAILERS Tidak ada pengangkut jaringan
•
IFF_RUNNING Sumberdaya yang dialokasikan
•
IFF_NOARP Tidak mendukung protokol ARP
•
IFF_PROMISC Device di mode penerimaan acak, ia akan menerima semua paket tanpa
memperdulikan
kemana paket-paket ini dialamatkan
• IFF_ALLMULTI Menerima seluruh frame multicast IP
• IFF_MULTICAST Dapat menerima frame multicast IP
Informasi Protokol
Setiap device menjelaskan bagaimana ia digunakan oleh
lapisan protokol jaringan.
MTU
Ukuran paket terbesar yang jaringan dapat kirim,
tidak termasuk header lapisan link yang ia perlu tambahkan.
Keluarga
Keluarga ini menandakan bahwa keluarga protokol yang
dapat didukung oleh device tersebut. Keluarga
untuk seluruh device jaringan Linux adalah AF_INET,
keluarga alamat internet.
Jenis
Jenis menjelaskan media di mana device jaringan
terpasang. Ada banyak jenis media yang didukung oleh device jaringan Linux.
Termasuk diantaranya adalah Ethernet, X.25, Token Ring, Slip, PPP dan Apple Localtalk.
Alamat
Struk data device tersebut memiliki sejumlah alamat
yang relevan bagi device jaringan ini, termasuk alamat-alamat IP-nya.
Antrian Paket
Merupakan antrian paket-paket sk_buff yang antri
menunggu untuk dikirmkan lewat device jaringan ini.
Fungsi Pendukung
Setiap device menyediakan seperangkat routine standar
yang lapisan-lapisan protokol sebut sebagai bagian dari interface mereka ke
lapisan link device ini. Hal ini termasuk pembuatannya dan routine-routine
pengirim frame dan routine-routine penambah header standar dan pengumpul
statistik. Statistik ini bisa dilihat dengan memakai perintah ifconfig.
Komunikasi Antar Proses
Untuk
mengatur kegiatan proses mereka perlu saling berkomunikasi. Linux mendukung
berbagai mekanisme komunikasi antar proses (KAP). Sinyal dan pemipaan merupakan
dua di antaranya, tapi linux juga mendukung system sistem ke lima mekanisme
KAP.
- Sinyal
Sinyal
merupakan salah satu metode KAP tertua sistem Unix. Sinyal digunakan untuk
memberitahukan
kejadian
yang asinkronus pada satu atau lebih proses. misalnya sinyal yang dihasilkan
oleh keyboard saat ditekan oleh pemakai. Sinyal juga dapat dihasilkan oleh
kondisi yang menyatakan error, misalnya saat suatu proses mencoba mengakses
lokasi yang tidak pernah ada di dalam memori utama. Sinyal pun digunakan oleh
shells untuk memberitahu perintah kontrol kerja kepada proses child.
Beberapa
Sinyal di Linux
Ada satu
perangkat sinyal terdefinisi yang bisa digenerate oleh kernel atau oleh proses
lain di dalam sistem, tentunya setelah proses tersebut punya hak untuk
melakukannya. Anda dapat melihat daftar dari
seperangkat
sinyal sistem dengan menggunakan perintah kill (kill -l). Di dalam box Linux
Intel, perintah kill tersebut menghasilkan keluaran sebagai berikut:
1) SIGHUP
2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP
6) SIGIOT 7) SIGBUS 8) SIGFPE
9) SIGKILL
10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13)
SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18)
SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22)
SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26)
SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR
Jumlah sinyal tersebut berbeda untuk sebuah kotak
Linux AXP Alpha.
Bagaimana
Suatu Sinyal Disikapi
Proses
dapat memilih untuk mengabaikan kebanyakan sinyal yang digenerate dengan dua pengecualian:
baik sinyal SIGSTOP, yang menyebabkan suatu proses menghentikan pekerjaannya,
mau pun sinyal SIGKILL, yang menyebabkan suatu proses berhenti, tidak dapat
diabaikan. Selain itu, suatu proses dapat memilih bagaimana cara ia mengatasi
bermacam-macam sinyal. Proses dapat menghalangi sinyal tersebut dan, bila tidak
menghalanginya, proses itu dapat memilih antara mengatasinya sendiri atau membiarkan
kernel mengatasinya. Bila kernel mengatasi sinyal tersebut maka sejumlah
tindakan default akan dilakukan untuk mengatasi sinyal ini. Misalnya, tindakan
default saat sebuah proses menerima sinyal SIGPE (exception floating point)
adalah dengan core dump kemudian keluar. Sinyal tidak punya prioritas-prioritas
yang terkait. Bila dua sinyal dihasilkan untuk suatu proses pada waktu yang
sama, maka keduanya dapat diberikan ke proses tersebut atau ditangani dengan
urutan tertentu. Selain itu, tidak ada mekanisme untuk mengatasi sinyal yang
sama dan banyak sekaligus. Tidak ada cara bahwa suatu proses dapat
memberitahukan apakah ia menerima 1 atau 42 sinyal SIGCONT.
Penerapan
Sinyal
Linux
menerapkan sinyal dengan menggunakan informasi yang disimpan dalam task_struct
untuk proses tersebut. Jumlah sinyal yang didukung terbatas pada ukuran word
prosesornya. Proses dengan ukuran word 32 bit dapat memiliki 32 sinyal
sementara prosesor 64 bit seperti Alpha AXP dapat memiliki sampai 64 sinyal.
Sinyal-sinyal yang tertunda saat ini disimpan dalam field sinyal dengan sebuah
mask dari sinyal-sinyal terblokir yang disimpan di blocked. Dengan pengecualian
SIGTOP dan SIGKILL, semua sinyal dapat diblokir. Bila sinyal yang diblokir
digenerate, maka sinyal itu akan tetap tertahan sampai ia tidak diblokir lagi. Linux
juga menyimpan informasi tentang bagaimana setiap proses menangani
sinyal-sinyal yang mungkin terjadi. Informasi ini disimpan dalam suatu array
stuktur data sigaction yang ditunjuk oleh task_struct untuk setiap proses. Di
antara hal-hal yang lain, informasi ini mengandung baik alamat routin yang
nantinya menangani sinyal atau flag, yang memberitahu Linux bahwa proses
tersebut ingin mengabaikan sinyal ini atau membiarkan kernel menanganinya.
Proses tersebut memodifikasi penanganan default sinyal dengan membuat system
call ,dan call ini mengubah sigaction untuk sinyal yang sesuai dan juga mask
daripada blocked. Tidak semua proses di dalam sistem dapat mengirimkan sinyal
ke proses lainnya. Kernel dapat melakukannya demikian pula super users.
Proses-proses biasa hanya dapat mengirim sinyal pada proses-proses yang
memiliki uid dan gid yang sama atau pun pada kelompok proses yang sama. Sinyal digenerate
dengan mengatur bit yang sesuai di dalam field signal task_struct. Jika proses
tersebut belum memblokir sinyal dan sedang menunggu (namun dapat diinterrupt di
status Interruptible), maka ia akan dibangunkan dengan mengubah statusnya ke
Running dan memastikan bahwa proses ini berada pada antrian run. Dengan cara
itu scheduler akan menganggapnya sebagai suatu yang akan running pada jadwal
sistem berikutnya. Jika penanganan default diperlukan, maka Linux dapat
mengoptimalkan penganganan sinyal tersebut. Sebagai contoh, jika sinyal
SIGWINCH (fokus yang berubah dari jendela X) dan penangan default sedang
digunakan, maka tidak ada yang perlu dilakukan. Sinyal-sinyal tidak diberikan
ke proses segera saat mereka digenerate. Sinyal-sinyal ini harus menunggu sampai
proses tersebut berjalan kembali. Setiap kali sebuah proses keluar dari suatu
system calls, field signals dan blocked dicek dan bila ada sinyal-sinyal apa
pun yang tidak terblokir, sekarang sinyal-sinyal ini dapat disampaikan.
Kelihatannya cara ini bukanlah cara yang dapat diandalkan, namun setiap proses di
dalam sistem pasti membuat system calls, sebagai contoh, untuk menulis suatu
karakter ke terminal sepanjang waktu. Proses dapat memilih untuk menunggu
sinyal bila ia mau, kemudian dapat disuspend di status Interruptible sampai
sinyal itu datang. Kode pemrosesan sinyal Linux melihat pada struktur sigaction
untuk setiap sinyal yang saat ini belum diblokir. Jika sebuah penangan sinyal
diset ke tindakan default, maka kernel akan mengatasinya. Penangan default sinyal
SIGSTOP akan mengubah status proses saat ini ke status Stopped dan selanjutnya
menjalankan scheduler untuk memilih sebuah proses baru untuk berjalan. Tindakan
default untuk sinyal SIGFPE akan core dump proses dan menyebabkannya keluar.
Cara lainnya, proses tersebut dapat menentukan handler sinyalnya sendiri.
Penangan ini merupakan suatu routine yang akan dipanggil kapan pun sinyal digenerate
dan struktur sigactionnya menyimpan alamat routine ini. Kernel tersebut harus
memanggil routine penangan sinyal proses tersebut dan bagaimana ini terjadi
adalah kekhususan masing-masing prosesor tetapi intinya semua CPU harus
berhasil mengatasi kenyataan bahwa proses saat ini sedang berjalan di mode
kernel dan mengembalikan proses yang tadi memanggil kernel atau system routine
di mode user. Masalah ini terpecahkan dengan memanipulasi stack dan register
daripada proses tersebut. Program counter dari proses diset ke alamat
sinyalnya, yang menangani routine, dan parameter-parameter ke routine
dimasukkan ke frame callnya atau dilewatkan di register. Ketika proses tersebut
menerima operasi, proses ini terlihat seolah-olah routine penangan sinyalnya
dipanggil secara normal. Linux bersifat POSIX compatible dan oleh karena itu
prosesnya dapat menentukan sinyal-sinyal mana yang diblokir saat routine
tertentu penangan sinyal dipanggil. Hal ini berarti mengubah mask blocked tersebut
selama pemanggilan penangan sinyal proses-proses tersebut. mask blocked harus
dikembalikan ke nilai aslinya ketika routine penangan routine tersebut telah
selesai. Oleh karena itu Linux menambahkan suatu call pada sebuah routine
perapih yang akan mengembalikan mask asli daripada blocked ke dalam stack call
dari proses yang disinyal. Linux juga mengoptimalkan kasus di mana beberapa
routine penangan sinyal perlu dipanggil dengan stacking routine-routine ini
sehingga setiap saat sebuah routine penangan ada, routine penangan berikutnya
dipanggil sampai routine perapih dipanggil.
- Pipa
Semua
shells Linux yang biasa, membolehkan redirection. Sebagai contoh
$ ls | pr
| lpr
memipakan
output dari perintah ls, yang melist file yang ada di dalam direktori, sampai
standar input dari perintah pr yang mempaginasi file tersebut. Pada akhirnya
standard output dari perintah pr dipipakan ke standar input dari perintah lpr
yang mencetak hasil-hasilnya ke printer default. Pipa-pipa berikutnya adalah
unidirectional byte streams yang menghubungkan standard output dari suatu
proses ke standar input dari proses lainnya. Proses tidak peduli terhadap
redirection ini dan berperilaku seolah-olah ia berjalan normal saja. Adalah
shell yang membangun pipa-pipa yang bersifat sementara ini di antara dua proses
tersebut.
Gambar 7-7.
Pipa. Sumber: . . .
- Penerapan
Di Linux, suatu pipa diterapkan dengan menggunakan
dua struktur data file yang keduanya menunjuk ke inode VFS sementara yang sama
yang ia sendiri menunjuk pada halaman fisik di dalam memori. Gambar di atas
menunjukkan bahwa setiap struktur data file mengandung pointer ke vektor-vektor
routine operasi file yang berbeda; satu untuk menulis ke pipa, satu lagi untuk
membaca dari pipa. Hal tersebut menyembunyikan perbedaan-perbedaan yang
mendasar dari system calls umum yang membaca dan menulis file biasa. Saat
proses menulis tersebut menulis ke pipa, byte-byte dikopi ke halaman data
bersama dan ketika proses membaca membaca dari pipa, byte-byte dikopi dari
halaman data bersama. Linux harus mensinkronisasikan akses ke pipa tersebut.
Linux harus memastikan bahwa pembaca dan penulis pipa berada pada jalur dan
untuk melakukannya Linux menggukan kunci, antrian wait dan sinyal.
- Cara Menulis Data
Saat penulis ingin menulis ke pipa, ia menggunakan
fungsi-fungsi pustaka penulisan yang standar. Semuanya ini melewatkan
pendeskripsi file yang diindeks ke perangkat proses dari sturktur data file, masing-masing
merepresentasikan file yang sedang terbuka atau pun, dalam kasus ini, pipa yang
terbuka. routine penulis itu menggunakan informasi yang ada di dalam inode VFS
yang merepresentasikan pipa untui mengatur permintaan menulis. Bila ada cukup
ruangan untuk menulis semua bytes kedalam pipa dan, sepanjang pipa tidak
dikunci oleh pembacanya, Linux menguncinya untuk si penulis dan mengkopikan
bytes tersebut dari ruang alamat proses itu ke halaman data bersama. Bila pipa
itu dikunci oleh pembaca atau bila tidak ada cukup ruang bagi data maka proses
sekarang disuruh tidur di antrian tunggu inode pipa itu dan scheduller
dipanggil sehingga proses lainnya dapat berjalan. Proses yang tidur ini
interruptible, sehingga ia masih dapat menerima sinyal dan dapat dibangunkan
oleh pembaca ketika ruangan telah cukup untuk ditulisi data atau pun ketika
pipa sudah tidak dikunci. Setelah data ditulis, inode VFS dari pipa dibuka
kuncinya dan semua pembaca yang menunggu di antrian tunggu inode akan
dibangunkan oleh mereka sendiri.
- Cara Membaca Data
Membaca data dari pipa sangat mirip dengan menulis. Proses
boleh membaca dengan tidak melakukan pemblokiran (tergantung pada mode di mana
proses tersebut membuka file atau pipa) dan, dalam kasus ini, bila tidak ada
data untuk dibaca atau bila pipa dikunci, pesan kesalahan akan dikembalikan.
Artinya, proses tersebut dapat terus berjalan. Cara lainnya adalah dengan
menunggu di antrian tunggu inode pipa sampai proses menulis sudah selesai. Saat
kedua proses sudah selesai berurusan dengan pipa, inode pipa tersebut dibuang
bersama halaman data bersama.
- FIFO
Linux pun
mendukung pipa bernama, yang dikenal dengan FIFO karena prinsip kerjanya FIFO.
Data yang pertama kali ditulis ke pipa adalah data pertama yang dibaca. Tidak
seperti pipa, FIFO bukan merupakan objek yang bersifat sementara, ia adalah
entity di sistem file dan bisa dibuat dengan perintah mkfifo. Proses-proses bebas menggunakan FIFO
selama mereka punya hak akses ke sana. Cara FIFO dibuka sedikit berbeda dengan
pipa. Sebuah pipa (dua struktur data filenya, inode VFSnya dan halaman data
bersama) dibuat sekaligus sementara FIFO sudah ada dan dibuka dan ditutup oleh
penggunanya. Linux harus menangani pembaca-pembaca yang membuka FIFO sebelum
penulis-penulis membukanya dan juga penulis-penulis yang membacanya sebelum
penulis-penulis sudah menulisnya. Selain itu, FIFO ditangani dengan cara yang
hampir sama dengan pipa dan FIFO menggunakan struktur data dan operasi yang
sama
0 komentar