Langsung ke konten

Arsip

I/O

26 artikel
Teknologi 23 Sep 2026 5 min read

Posted Write PCIe Memisahkan Transmisi dari Observasi Perangkat

PCI Express tidak memperlakukan setiap request sebagai perjalanan pulang-pergi. Memory Write Request biasanya merupakan transaksi posted: requester mengirim transaction layer packet yang membawa data write, tetapi completer tidak mengembalikan Completion TLP untuk request tersebut. Mekanisme ini mengurangi traffic completion pada jalur ber-volume tinggi, sekaligus membuat ordering dan sinkronisasi eksplisit menjadi penting saat software memerlukan bukti bahwa write sudah mencapai batas tertentu. Perbedaan ini sangat relevan pada device driver. Penulisan register perangkat yang dipetakan ke memori dapat membuat instruksi store CPU selesai sebelum perangkat target bertindak atas nilai baru. Di antara core dan endpoint terdapat aturan ordering CPU, host bridge, antrean transaksi PCIe, switch, dan buffering pada sisi perangkat.

Teknologi 23 Sep 2026 6 min read

Mode Readiness epoll Mengubah Cara Event Loop Menguras File Descriptor

epoll di Linux memungkinkan satu thread menunggu perubahan readiness pada banyak file descriptor tanpa memindai seluruh descriptor pada setiap iterasi. Interface ini umum dipakai pada server jaringan, proxy, runtime, dan program lain yang mempertahankan banyak socket aktif. Mode registrasinya berpengaruh langsung pada pola kerja event loop. Operasi level-triggered terus melaporkan descriptor selama kondisi terkait masih ready. Operasi edge-triggered melaporkan transisi readiness dan mengharuskan aplikasi mengonsumsi pekerjaan yang tersedia sampai descriptor akan memblokir.

Linux 23 Sep 2026 4 min read

EPOLLEXCLUSIVE Membatasi Wakeup Antar-instance epoll

EPOLLEXCLUSIVE Membatasi Wakeup Antar-instance epoll EPOLLEXCLUSIVE mengubah distribusi event ketika beberapa instance epoll mendaftarkan file description target yang sama. Tanpa flag ini, sebuah event readiness dapat membangunkan waiter yang terkait dengan setiap instance epoll yang berminat. Dengan registrasi eksklusif, Linux dapat membatasi fan-out tersebut dan mengurangi wakeup yang redundan. Flag ini tidak membuat delivery menjadi single-consumer, tidak menetapkan kepemilikan target, dan tidak menggantikan koordinasi pada level aplikasi. Kontraknya lebih sempit: di antara instance epoll yang mendaftarkan target dengan EPOLLEXCLUSIVE, satu atau lebih instance menerima event untuk sebuah wakeup, bukan mewajibkan semuanya menerima event tersebut.

Teknologi 22 Sep 2026 4 min read

Registered Buffer io_uring Menahan Halaman Memori untuk I/O Berulang

Linux io_uring dapat mengirim I/O asynchronous dengan buffer user biasa, tetapi operasi berulang masih dapat membuat kernel harus mencari dan menahan halaman user yang relevan pada setiap request. Registered buffer memindahkan sebagian pekerjaan itu ke fase setup yang eksplisit. Aplikasi mendaftarkan satu atau beberapa region memori ke ring. Kernel mencatat region tersebut dan mempertahankan halaman backing dalam keadaan pinned selama registrasi masih aktif. Request berikutnya dapat merujuk region terdaftar melalui indeks, bukan menyerahkan buffer arbitrer yang harus disiapkan dari awal.

Teknologi 22 Sep 2026 7 min read

Phase Tag Completion Queue NVMe Menandai Entri yang Digunakan Ulang

Completion Queue NVMe adalah array melingkar berukuran tetap di memori host. Controller menulis entri completion ketika command selesai, sedangkan software host mengonsumsi entri tersebut dan memajukan head queue. Pada akhirnya, kedua sisi kembali ke slot yang masih menyimpan data dari putaran ring sebelumnya. Penggunaan ulang memori menimbulkan ambiguitas kecil tetapi penting. Sebuah slot dapat berisi completion entry yang formatnya valid walaupun controller belum menulis completion baru ke posisi itu. Mengosongkan setiap entri yang sudah dikonsumsi akan menambah traffic memori dan tetap memerlukan koordinasi yang tepat antara host dan controller.

Teknologi 19 Sep 2026 4 min read

Streaming DMA Memindahkan Kepemilikan Buffer antara CPU dan Perangkat

Streaming DMA Memindahkan Kepemilikan Buffer antara CPU dan Perangkat Sebuah DMA buffer dapat menjadi memori yang valid bagi CPU dan perangkat, tetapi tetap memerlukan serah-terima yang ketat di antara keduanya. Streaming DMA mapping di Linux menyatakan serah-terima tersebut. Mapping API menyediakan alamat DMA yang terlihat oleh perangkat sekaligus memberi DMA layer titik untuk menjalankan cache maintenance, translasi alamat, atau bounce buffering yang spesifik terhadap arsitektur. Perilaku ini paling terlihat pada sistem yang DMA perangkatnya tidak otomatis koheren dengan cache CPU. Namun, aturan kepemilikan tetap menjadi bagian dari DMA API portabel, termasuk pada mesin yang tidak memerlukan operasi cache tambahan.

Teknologi 19 Sep 2026 6 min read

State Link PCIe ASPM Menukar Daya Idle dengan Latensi Keluar

Link PCI Express tidak perlu mempertahankan setiap blok transmitter dan receiver dalam kondisi aktif penuh saat tidak ada paket yang bergerak. Active State Power Management, atau ASPM, memungkinkan link memasuki state berdaya lebih rendah selama periode idle dan kembali ke L0 ketika traffic muncul lagi. Mekanisme ini berada di bawah I/O aplikasi. Software dapat menjalankan operasi storage, network, atau perangkat yang sama tanpa bergantung pada state link saat itu, tetapi transaksi pertama setelah periode idle dapat menerima delay tambahan ketika link kembali ke operasi aktif.

Teknologi 19 Sep 2026 6 min read

PCIe Posted Write Memisahkan Penyelesaian CPU dari Visibilitas Perangkat

PCIe Posted Write Memisahkan Penyelesaian CPU dari Visibilitas Perangkat Sebuah MMIO store dapat selesai dari sudut pandang CPU ketika write terkait masih bergerak melalui jalur I/O. PCI dan PCIe memory write umumnya bersifat posted: requester tidak menunggu completion response untuk setiap write. Bridge dan logika interconnect dapat menerima transaction lalu membiarkan CPU melanjutkan eksekusi sebelum endpoint mengonsumsinya. Perilaku ini berguna untuk throughput, tetapi menciptakan boundary yang tidak dapat diperlakukan driver seperti memori cache biasa. Program order pada CPU, ordering yang diberikan accessor MMIO, dan bukti bahwa perangkat telah menerima write merupakan properti yang saling berkaitan, tetapi tidak dapat saling menggantikan.

Teknologi 19 Sep 2026 6 min read

MSI-X Memungkinkan Queue Perangkat Menargetkan Jalur Interrupt CPU Terpisah

MSI-X Memungkinkan Queue Perangkat Menargetkan Jalur Interrupt CPU Terpisah Perangkat PCIe multiqueue dapat memindahkan data melalui banyak queue secara bersamaan, tetapi satu jalur interrupt akan mengumpulkan penanganan completion kembali ke satu sinyal. MSI-X menghilangkan pemusatan tersebut dari interface interrupt perangkat. Setiap entry MSI-X yang dialokasikan mewakili message-signaled interrupt yang dapat dikonfigurasi secara independen, sehingga driver dapat mengaitkan queue atau kelas event yang berbeda dengan Linux IRQ dan kebijakan CPU affinity yang berbeda.

Teknologi 19 Sep 2026 6 min read

Masking Per-Vector MSI-X Memisahkan Kontrol Interrupt Antar-Queue Perangkat

Masking Per-Vector MSI-X Memisahkan Kontrol Interrupt Antar-Queue Perangkat PCI function yang memakai MSI-X dapat mengekspos beberapa interrupt vector dengan state delivery yang dikontrol secara independen. Software dapat melakukan mask pada satu entry tabel MSI-X sementara entry lain yang aktif tetap dapat mengirim interrupt. Properti ini penting pada perangkat multi-queue karena kontrol interrupt dapat mengikuti pembagian kerja I/O, alih-alih menempatkan semua sumber notifikasi di balik satu state interrupt untuk seluruh perangkat.

Teknologi 19 Sep 2026 6 min read

Invalidasi IOTLB IOMMU Menentukan Saat Remapping DMA Berlaku

Invalidasi IOTLB IOMMU Menentukan Saat Remapping DMA Berlaku Mengubah entry pada page table IOMMU tidak selalu mengubah translasi yang dipakai oleh request DMA berikutnya. IOMMU dapat menyimpan translasi alamat di I/O translation lookaside buffer, yang umum disebut IOTLB. Software harus menginvalidasi state cache yang terdampak ketika sebuah mapping dihapus atau diganti, lalu mengikuti semantik completion yang diwajibkan IOMMU sebelum menganggap translasi lama benar-benar berhenti digunakan. Batas ini menyerupai pemeliharaan page table CPU, tetapi berada pada address space DMA. Page table merupakan state memori yang menjadi sumber translasi; IOTLB merupakan state hardware yang berasal darinya. Mengubah salah satunya tidak otomatis membuktikan bahwa yang lain telah berhenti melayani translasi sebelumnya.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

EPOLLET Menjadikan Readiness sebagai Kontrak Transisi State

Descriptor yang didaftarkan dengan EPOLLET dapat tetap readable setelah sebuah event dikirim tanpa muncul lagi pada epoll_wait() berikutnya. Kernel melaporkan transisi readiness; kernel tidak menjanjikan pengulangan notifikasi yang sama hanya karena masih ada data yang belum dibaca. Perbedaan ini menjadikan edge-triggered epoll sebagai kontrak transisi state antara kernel dan event loop. Konsekuensinya bersifat struktural. Handler tidak dapat memperlakukan satu event sebagai izin untuk satu read() lalu langsung kembali ke wait loop. Pada edge-triggered monitoring, handler harus memperhitungkan seluruh state I/O yang segera tersedia sebelum bergantung pada transisi berikutnya.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

epoll Edge-Triggered Memerlukan Drain Readiness hingga EAGAIN

Dengan EPOLLET, event loop dapat menerima satu notifikasi, membaca hanya sebagian data yang tersedia, lalu menunggu tanpa batas meskipun masih ada byte yang belum dibaca di buffer socket. Descriptor tetap ready, tetapi tidak ada transisi readiness baru yang memicu edge berikutnya. Perilaku tersebut membuat epoll edge-triggered menjadi kontrak antara semantik notifikasi dan I/O nonblocking. Event menyatakan bahwa readiness berubah; event bukan janji bahwa kernel akan terus mengulang notifikasi yang sama sampai aplikasi menyelesaikan pekerjaannya.

Rekayasa Perangkat Lunak 18 Sep 2026 6 min read

Linux splice Menjadikan Kapasitas Pipe Bagian dari Semantik Transfer Data

Linux splice() dapat memindahkan byte antar-file descriptor tanpa mengalirkan byte tersebut melalui buffer user space, tetapi interface ini bukan primitive penyalinan generik dari sembarang descriptor ke descriptor lain. Sedikitnya satu endpoint harus berupa pipe. Syarat tersebut membuat state pipe menjadi bagian dari kontrak transfer: kapasitas, data yang dapat dibaca, keberadaan writer, mode blocking, dan progres parsial dapat memengaruhi jalur data yang tampak sederhana. Batas yang relevan bukan sekadar “salinan kernel versus salinan user.” splice() mengubah bentuk ownership dan flow control. Kode aplikasi tidak lagi memiliki array byte perantara, tetapi tetap memiliki control loop yang menghitung byte yang sudah dipindahkan, menangani readiness, dan mempertahankan semantik offset.

Rekayasa Perangkat Lunak 18 Sep 2026 7 min read

Linux copy_file_range Memisahkan Semantik Penyalinan dari Pergerakan Data

copy_file_range() meminta Linux menyalin byte di antara regular file tanpa mengharuskan aplikasi memindahkan byte tersebut melalui buffer user space. Pemanggilan ini mendefinisikan operasi rentang byte, tetapi tidak menentukan mekanisme transfer fisiknya. Filesystem dapat melakukan pergerakan data biasa, memakai mekanisme sharing copy-on-write seperti reflink, atau memakai jalur akselerasi lain yang didukung sambil mempertahankan isi file yang terlihat sesuai operasi tersebut. Pemisahan itu merupakan batas utama API. Aplikasi menentukan rentang sumber dan tujuan lalu mengamati jumlah byte yang dikembalikan. Kernel dan filesystem tetap memiliki keleluasaan untuk memilih mekanisme yang merealisasikan salinan.

Linux 18 Sep 2026 4 min read

EPOLLEXCLUSIVE Membatasi Wakeup pada epoll Instance yang Bersaing

Satu socket yang ready dapat membangunkan beberapa thread ketika setiap thread menunggu pada epoll instance berbeda yang memantau socket tersebut. Linux menyediakan EPOLLEXCLUSIVE untuk mempersempit fan-out wakeup itu: di antara epoll instance yang mendaftarkan target dengan flag tersebut, sebuah readiness event membangunkan satu atau lebih instance, bukan semuanya. Batas semantiknya sengaja lebih lemah daripada “tepat satu waiter.” EPOLLEXCLUSIVE mengubah seleksi notifikasi antar-epoll instance. Flag ini tidak memindahkan kepemilikan file descriptor, tidak menserialkan seluruh I/O, dan tidak menjamin hanya satu thread yang dapat melihat pekerjaan yang berguna.

Rekayasa Perangkat Lunak 18 Sep 2026 5 min read

EPOLLEXCLUSIVE Membatasi Wakeup di Antara Instance epoll yang Bersaing

EPOLLEXCLUSIVE mengubah waiter epoll mana yang dibangunkan saat beberapa instance epoll memantau target yang sama. Tanpa flag ini, sebuah readiness event dapat dikirim ke setiap instance epoll yang terpasang. Dengan registrasi eksklusif, Linux dapat membangunkan subset yang lebih kecil sehingga scheduling redundan berkurang pada konfigurasi yang jika tidak demikian dapat memicu thundering herd. Flag ini mengubah distribusi wakeup. Ia tidak memberikan kepemilikan permanen atas target descriptor, tidak menserialisasi I/O, dan tidak menjamin tepat satu thread aplikasi mengonsumsi setiap unit pekerjaan.

Teknologi 17 Sep 2026 5 min read

Write Combining Menggabungkan Store Berdekatan Sebelum Trafik Memori

Beberapa area memori jauh lebih sering ditulis daripada dibaca. Frame buffer, aperture perangkat, dan area output streaming adalah contoh umum. Mengirim setiap store CPU kecil sebagai transaksi memori terpisah dapat membuang bandwidth bus dan menambah overhead transaksi. Write combining memberi prosesor tempat sementara untuk mengumpulkan store yang kompatibel. Beberapa penulisan ke alamat yang berdekatan dapat digabung menjadi transaksi yang lebih besar sebelum meninggalkan CPU. Teknik ini menguntungkan throughput tulis berkelanjutan, tetapi juga mengubah asumsi waktu dan ordering yang aman bagi software.

Rekayasa Perangkat Lunak 17 Sep 2026 7 min read

Shared Ring io_uring Menjadikan Memory Ordering Bagian dari ABI

Queue io_uring adalah shared memory yang diubah oleh dua domain eksekusi independen. User space menyiapkan submission entry dan memajukan metadata queue; kernel mengonsumsi submission tersebut lalu memublikasikan completion entry. Layout ring menghilangkan satu batas copy, tetapi pada saat yang sama membuat visibilitas memori menjadi bagian dari kontrak interface. Assignment biasa pada level source ke tail queue tidak cukup sebagai model publikasi yang portabel. Data entry harus terlihat lebih dulu sebelum nilai tail yang membuat entry tersebut boleh dikonsumsi. Di sisi completion, user space harus mengamati publikasi completion dari kernel sebelum membaca field di completion tersebut. Relasi ordering ini adalah bagian dari correctness, bukan sekadar detail optimasi.

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux splice Menjadikan Pipe sebagai Batas Transfer Data Kernel

splice() dapat memindahkan byte antara dua file descriptor tanpa terlebih dahulu menyalin payload ke buffer userspace, tetapi antarmukanya mengharuskan setidaknya satu endpoint berupa pipe. Syarat ini menjadikan pipe lebih dari sekadar transport perantara. Pipe adalah batas buffer yang terlihat oleh kernel, tempat semantik offset, blocking, kapasitas, dan partial progress operasi tersebut dibentuk. Hal ini berbeda dari read() yang diikuti write(). Pada urutan tersebut, userspace memiliki array byte perantara dan dapat memeriksa atau mengubahnya. Dengan splice(), payload dapat tetap berada di storage yang dikelola kernel sementara proses mengoordinasikan perpindahan antar-endpoint.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux io_uring Memisahkan Submission dari Kepemilikan Completion

Linux io_uring Memisahkan Submission dari Kepemilikan Completion Sebuah request io_uring dapat tetap in flight setelah aplikasi selesai membentuk submission queue entry. Kondisi ini menciptakan batas lifetime yang tidak ada pada call sinkron sederhana: metadata request dapat menjadi stabil saat submission, sedangkan memori yang menjadi payload I/O masih dapat diakses sampai operasi selesai. Completion queue karena itu bukan sekadar kanal hasil. Untuk banyak operasi, completion menandai titik ketika state operasi milik aplikasi dapat di-reclaim atau digunakan kembali.

Rekayasa Perangkat Lunak 17 Sep 2026 7 min read

Linux copy_file_range Memisahkan Semantik Penyalinan dari Implementasi Transfer

Linux copy_file_range Memisahkan Semantik Penyalinan dari Implementasi Transfer Pemanggilan copy_file_range() yang berhasil melaporkan jumlah byte, bukan janji mengenai jalur fisik yang ditempuh byte tersebut. Linux dapat memenuhi permintaan melalui akselerasi spesifik filesystem, jalur transfer di dalam kernel, atau implementasi lain yang diizinkan interface filesystem aktif. Aplikasi memperoleh operasi penyalinan range dengan semantik offset dan nilai balik yang terdefinisi; aplikasi tidak memperoleh jaminan bahwa blok storage diduplikasi secara fisik. Batas ini penting pada replikasi file, staging backup, pengisian cache, dan pemindahan object lokal. Kode yang memperlakukan pemanggilan ini hanya sebagai versi lebih cepat dari loop read() dan write() dapat melewatkan properti yang tampak pada batas API: short copy sah, sparse hole dapat berubah menjadi data teralokasi, dukungan lintas filesystem bersifat kondisional, dan implementasi filesystem dapat memanfaatkan sharing copy-on-write.

Linux 17 Sep 2026 4 min read

File Descriptor yang Diduplikasi Berbagi Satu Open File Description

Dua nomor file descriptor dapat mengubah file offset yang sama. Di Linux, hal ini terjadi ketika kedua descriptor merujuk pada satu open file description, seperti setelah dup() atau pada descriptor yang diwariskan setelah fork(). Perbedaan ini penting karena file descriptor adalah integer yang terlihat oleh process, sedangkan open file description adalah objek kernel yang menyimpan state untuk satu instance file yang dibuka. Menganggap kedua lapisan ini sama dapat menyebabkan interferensi offset, perubahan status flag yang melintasi batas descriptor, dan perilaku mengejutkan setelah process dibuat.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja

Edge Triggering Linux epoll Melaporkan Transisi Readiness, Bukan Unit Kerja Dengan EPOLLET, sebuah interest epoll tidak berperilaku seperti antrean yang berisi satu event untuk setiap byte, paket, koneksi, atau pesan aplikasi. Mekanisme ini melaporkan perubahan status readiness. Setelah sebuah file descriptor berada dalam status ready, pekerjaan tambahan dapat terakumulasi tanpa menghasilkan edge lain yang dapat diandalkan aplikasi. Handler karena itu perlu mengonsumsi pekerjaan yang tersedia sampai operasi nonblocking melaporkan bahwa progres berikutnya akan memblokir.