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

You Might Also Like

0 komentar