Langsung ke konten

Arsip

Event Loop

19 artikel
Linux 19 Sep 2026 4 min read

timerfd Membaca Jumlah Expiration Periodik

Timer periodik dapat mencapai expiration beberapa kali sebelum event loop yang sibuk kembali mendapat waktu CPU. Linux timerfd tidak mereduksi keterlambatan itu menjadi notifikasi “timer aktif” semata. read() yang berhasil mengembalikan counter unsigned 64-bit berisi jumlah expiration yang terakumulasi sejak timer diaktifkan atau sejak read sebelumnya yang berhasil. Counter tersebut mengubah semantik penanganan timer yang terlambat. Readiness menyatakan setidaknya satu expiration sedang tertunda; nilai yang dibaca dari descriptor menyatakan berapa banyak periode yang telah berlalu.

Linux 19 Sep 2026 4 min read

signalfd Mengubah Sinyal Linux Menjadi Event File Descriptor

Sinyal POSIX konvensional dapat menginterupsi thread pada hampir semua batas instruksi lalu memindahkan kontrol ke signal handler. Alur kontrol asinkron tersebut membatasi operasi yang aman di dalam handler dan menambah kerumitan pada program yang control plane utamanya sudah berjalan melalui epoll, poll, atau select. Linux signalfd() menyediakan antarmuka pengiriman yang berbeda. Proses memblokir sinyal tertentu melalui signal mask biasa, membuat signalfd untuk himpunan tersebut, lalu menerima sinyal pending dengan membaca record signalfd_siginfo terstruktur dari descriptor. Pada antarmuka kernel, objek tersebut tetap berupa sinyal; hanya proses konsumsinya yang dipindahkan ke I/O file descriptor biasa.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

timerfd Mengubah Ekspirasi Timer Menjadi Readiness Descriptor

Sebuah timerfd menjadi readable setelah timernya mengalami ekspirasi. Notifikasi ini bukan pemanggilan signal handler dan bukan pesan byte stream. Linux mencatat ekspirasi yang pending pada objek timer lalu mengekspos status tersebut melalui file descriptor, sehingga timer dapat berada pada batas readiness yang sama dengan socket, pipe, dan descriptor lain. Interface ini lebih dari sekadar penggantian mekanisme notifikasi. Pilihan clock menetapkan domain waktu, flag arming menetapkan apakah deadline bersifat relatif atau absolut, dan setiap read yang berhasil melaporkan jumlah ekspirasi yang terakumulasi sejak read sukses sebelumnya atau konfigurasi ulang timer.

Linux 18 Sep 2026 4 min read

timerfd Menghitung Ekspirasi melalui I/O Descriptor

timerfd periodik tidak memerlukan satu wakeup userspace untuk setiap ekspirasi timer. Jika beberapa ekspirasi terjadi sebelum descriptor dibaca, Linux mengakumulasikannya dan mengembalikan jumlahnya dalam satu integer 8 byte. Perilaku ini menempatkan state timer dalam model readiness yang sama dengan socket, pipe, dan descriptor lain. Event loop yang terlambat juga memperoleh informasi eksplisit tentang periode yang terlewat, alih-alih beberapa ekspirasi dilebur menjadi satu notifikasi. State ekspirasi menjadi data descriptor yang dapat dibaca timerfd_create() membuat objek timer dan mengembalikan file descriptor yang merujuk kepadanya. Clock yang dipilih menentukan basis waktu timer. Pilihan umum mencakup CLOCK_MONOTONIC, CLOCK_REALTIME, dan CLOCK_BOOTTIME.

Rekayasa Perangkat Lunak 18 Sep 2026 4 min read

eventfd Mengubah Status Counter Menjadi Readiness Descriptor

Descriptor eventfd menjadi readable saat counter yang dipelihara kernel bernilai lebih besar dari nol. Sebuah write tidak memasukkan pesan dengan panjang variabel ke antrean. Operasi itu menambahkan nilai unsigned 64-bit ke counter, sehingga status notifikasi yang terakumulasi tampil sebagai readiness file descriptor biasa. Batas ini berguna ketika thread atau fasilitas kernel perlu membangunkan event loop tanpa membentuk protokol byte stream. Status yang dibawa descriptor sengaja sempit: sebuah counter, kondisi readiness, dan dua pilihan semantik konsumsi.

Linux 18 Sep 2026 4 min read

eventfd Mengagregasi Notifikasi dalam Counter Kernel

Sebuah eventfd dapat menyerap beberapa write notifikasi sebelum userspace melayani descriptor. Kernel menyimpan write tersebut dalam counter 64-bit, sehingga readiness merepresentasikan state counter yang tertunda, bukan antrean dengan satu record untuk setiap notifikasi. Perbedaan ini penting di event loop. Producer dapat menambah nilai saat consumer sedang sibuk, lalu read berikutnya dapat melebur state yang terakumulasi menjadi satu hasil. Dengan EFD_SEMAPHORE, objek yang sama menyediakan aturan konsumsi berbeda tanpa mengubah model readiness-nya.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

timerfd Menghitung Ekspirasi melalui Read Descriptor

timerfd periodik dapat mengalami beberapa ekspirasi sebelum user space membacanya. read() sukses berikutnya tidak hanya melaporkan tick terbaru: operasi itu mengembalikan nilai unsigned 64-bit yang berisi jumlah ekspirasi sejak read sukses sebelumnya, atau sejak timer dikonfigurasi jika belum ada read yang selesai. Perilaku ini menjadikan timer sebagai objek event loop tanpa mengubah setiap ekspirasi menjadi signal. Descriptor menjadi readable ketika sedikitnya satu ekspirasi tertunda, dan descriptor yang sama dapat dipantau oleh poll(), select(), atau epoll() bersama socket, pipe, dan sumber event berbasis descriptor lainnya.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

signalfd Mengubah Sinyal Pending Menjadi Record yang Dapat Dibaca

Sinyal yang masuk ke mask signalfd dapat membuat file descriptor menjadi readable alih-alih menjalankan handler asinkron, selama sinyal tersebut diblokir dari delivery biasa. read() yang berhasil kemudian mengonsumsi status sinyal pending dan mengembalikan satu atau beberapa record signalfd_siginfo. Perubahan ini mengganti antarmuka penerimaan untuk sinyal terpilih, tetapi tidak mengganti semantik signal Linux. Signal mask, delivery yang diarahkan ke process atau thread, penggabungan standard signal, serta status khusus SIGKILL dan SIGSTOP tetap menentukan batas perilaku descriptor.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

signalfd Mengonsumsi Signal yang Diblokir melalui Read Descriptor

Sebuah signalfd di Linux menjadi readable ketika signal yang dipilih oleh mask miliknya berstatus pending bagi konteks pembaca. read() yang berhasil tidak sekadar mengamati status tersebut: operasi itu mengonsumsi kemunculan signal yang dikembalikan dan menghapusnya dari status pending. Perilaku ini memberi signal jalur konsumsi berbasis descriptor. Mekanisme tersebut tidak mengubah subsistem signal menjadi byte stream, dan tidak menggantikan signal mask yang mengendalikan delivery biasa. Mask descriptor memilih signal pending yang memenuhi syarat signalfd() mengaitkan sebuah signal set dengan file descriptor. Ketika argumen pertama bernilai -1, Linux membuat objek signalfd baru. Jika descriptor signalfd yang sudah ada diberikan, mask pada objek tersebut diganti.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

Read pada Linux timerfd Melaporkan Akumulasi Expiration

timerfd periodik pada Linux dapat mengalami beberapa expiration sebelum event loop membacanya. read() berikutnya yang berhasil tidak mengembalikan satu record untuk setiap wakeup. Operasi itu mengembalikan satu uint64_t dalam byte order host yang berisi jumlah expiration yang terakumulasi sejak timer terakhir di-arm atau sejak read berhasil sebelumnya. Count tersebut menjadikan readiness timerfd sebagai notifikasi bahwa status timer dapat dikonsumsi, bukan pemetaan satu-ke-satu antara wakeup scheduler dan periode timer. Read mengonsumsi count expiration yang terakumulasi timerfd yang dibuat dengan timerfd_create() merepresentasikan satu timer kernel melalui file descriptor. timerfd_settime() menetapkan expiration awal pada it_value dan, untuk timer periodik, it_interval yang bukan nol.

Rekayasa Perangkat Lunak 17 Sep 2026 4 min read

pidfd Menjaga Identitas Proses Tetap Stabil Saat PID Dipakai Ulang

PID numerik Linux dapat dipakai ulang setelah prosesnya berakhir. Sebaliknya, PID file descriptor merujuk ke task tertentu, sehingga operasi berikutnya melalui descriptor tersebut tidak diam-diam beralih ke proses lain yang kemudian memperoleh PID numerik yang sama. Sifat ini mengubah identitas proses dari lookup yang diulang pada setiap operasi menjadi referensi yang dipertahankan kernel dengan semantik descriptor. Perbedaannya relevan untuk pengiriman signal, pemantauan exit, dan event loop yang menyimpan handle proses selama pekerjaan asinkron berlangsung.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux timerfd Membuat Periode Terlewat Terlihat sebagai Hitungan Expiration

Linux timerfd periodik dapat mengalami beberapa expiration sebelum event loop kembali berjalan. read() berhasil berikutnya tidak sekadar melaporkan bahwa timer telah aktif; operasi itu mengembalikan hitungan unsigned 64-bit untuk expiration yang terakumulasi sejak read berhasil sebelumnya atau sejak timer terakhir dikonfigurasi. Dispatch yang tertunda dengan demikian terlihat sebagai hitungan, bukan rangkaian record timer yang diantrekan. Kontrak tersebut memisahkan jadwal timer dari eksekusi consumer. Sebuah proses dapat kehilangan jatah CPU untuk sementara, event loop dapat menghabiskan waktu pada descriptor lain, atau beberapa periode dapat berlalu sebelum timerfd dikonsumsi. Kernel melacak expiration, sedangkan kode aplikasi menentukan arti beberapa expiration bagi pekerjaan yang terkait dengannya.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux signalfd Mengubah Sinyal Pending Menjadi Status Readable

Proses Linux dapat memblokir sinyal tertentu lalu menerimanya dengan membaca file descriptor alih-alih menjalankan handler asinkron. signalfd() membuat sinyal pending tersebut terlihat melalui antarmuka readiness yang sama dengan socket, pipe, dan descriptor lain, termasuk poll() dan epoll. Konversi ini bukan pengganti signal masking. Descriptor memiliki himpunan sinyal sendiri, sementara setiap thread tetap memiliki signal mask yang mengendalikan delivery biasa. Desain yang konsisten bergantung pada keselarasan kedua status tersebut. Descriptor mengamati sinyal pending dari himpunan tertentu signalfd baru dibuat dengan sebuah himpunan sinyal:

Rekayasa Perangkat Lunak 17 Sep 2026 6 min read

Linux eventfd Menggabungkan State Counter dengan Readiness Descriptor

Objek eventfd menggabungkan counter unsigned 64-bit yang dikelola kernel dengan readiness file descriptor. Sebuah write menambahkan nilai ke counter ketika penambahan itu diizinkan; sebuah read mengonsumsi state counter. Karena objek yang sama dapat dipakai oleh poll(), select(), dan epoll(), transisi counter juga dapat menjadi notifikasi event loop tanpa byte stream atau lapisan framing pesan. Antarmuka ringkas ini memiliki semantik yang tegas. Read default menguras nilai saat ini menjadi nol, read dengan EFD_SEMAPHORE mengonsumsi satu unit, write dapat blocking saat counter mendekati batas, dan readiness menunjukkan operasi yang dapat berjalan, bukan jumlah event logis yang dipetakan aplikasi ke counter.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Linux eventfd Membuat Status Counter Dapat Dipantau

Linux eventfd dapat menggabungkan banyak notifikasi ke dalam satu counter yang dikelola kernel sambil tetap dapat digunakan dengan poll(), select(), dan epoll. Writer menambahkan nilai unsigned 64-bit ke counter; readiness menyatakan apakah status tersebut dapat dikonsumsi. Interface ini membawa status aritmetika, bukan byte stream atau antrean pesan individual. Perbedaan tersebut penting pada batas proses dan thread. Sebuah wakeup menyatakan bahwa counter bukan nol. Wakeup itu tidak mempertahankan jumlah operasi write, identitas writer, atau urutan di antara sumber notifikasi yang terpisah.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

EPOLLET Melaporkan Transisi Readiness, Bukan Pengosongan Buffer

Dengan EPOLLET, sebuah file descriptor dapat tetap memiliki data yang belum dibaca setelah event readiness-nya sudah dikonsumsi. Pemanggilan epoll_wait() berikutnya tidak wajib melaporkan descriptor itu lagi hanya karena state readable sebelumnya masih bertahan. Perilaku ini merupakan batas utama edge-triggered epoll: notifikasi mengikuti perubahan readiness, sedangkan objek I/O di bawahnya mempertahankan state sendiri secara terpisah. Readiness dan pengiriman event merupakan state terpisah Sebuah epoll instance memiliki interest list dan ready list. Registrasi melalui epoll_ctl() menentukan open file description yang dipantau dan kelas event yang relevan. epoll_wait() mengembalikan entry yang sudah mencapai ready list.

Rekayasa Perangkat Lunak 17 Sep 2026 8 min read

Edge Triggering epoll Mengubah Readiness Menjadi Kewajiban untuk Menguras

Registrasi epoll edge-triggered dapat berhenti menghasilkan notifikasi sementara byte yang belum dibaca masih tersisa di socket atau pipe. Descriptor tetap dapat digunakan untuk I/O, tetapi event loop sudah mengonsumsi notifikasi yang terkait dengan transisi readiness. Jika handler hanya membaca sebagian data yang tersedia lalu kembali ke epoll_wait(), tidak ada keharusan muncul transisi baru, sehingga byte yang tertunda dapat dibiarkan tanpa diproses tanpa batas. Perilaku ini membuat EPOLLET lebih dari sekadar preferensi notifikasi. Ia mengubah kontrak antara ready list kernel dan application state. Loop level-triggered dapat terus menerima descriptor selama kondisi I/O yang diminta tetap benar. Loop edge-triggered harus mempertahankan cukup local state untuk memperlakukan event yang diterima sebagai kewajiban menguras I/O nonblocking yang saat itu tersedia, biasanya sampai operasi mengembalikan EAGAIN.

Rekayasa Perangkat Lunak 17 Sep 2026 5 min read

Counter eventfd Menggabungkan Notifikasi Sebelum Read

Sebuah eventfd Linux dapat menerima beberapa write sebelum consumer berjalan, tetapi descriptor tersebut tidak menyimpan setiap write sebagai pesan terpisah. Setiap write yang diterima menambahkan nilai unsigned 64-bit ke counter yang dikelola kernel. Tanpa EFD_SEMAPHORE, satu read yang berhasil mengembalikan nilai counter saat itu lalu meresetnya menjadi nol. Perilaku tersebut membuat eventfd menjadi primitive notifikasi berbasis counter, bukan message queue. Readiness menyatakan bahwa counter tidak nol; readiness tidak mempertahankan jumlah operasi write, urutan, atau boundary setiap write.

Rekayasa Perangkat Lunak 17 Sep 2026 3 min read

Cookie Rename inotify Mengorelasikan Event Move Tanpa Membuatnya Atomik

Sebuah rename() di Linux yang diamati melalui inotify dapat menghasilkan dua record dengan cookie nonzero yang sama: IN_MOVED_FROM untuk directory entry lama dan IN_MOVED_TO untuk entry baru. Cookie tersebut mengorelasikan kedua record, tetapi tidak mengubahnya menjadi satu item queue yang atomik. Batas ini penting bagi perangkat lunak yang memelihara indeks pathname, menyinkronkan state direktori, atau mengubah notifikasi filesystem menjadi record perubahan tingkat lebih tinggi. Rename merupakan satu operasi filesystem, sedangkan representasinya di inotify dapat berupa pasangan dengan properti pengelompokan delivery yang lebih lemah.