Langsung ke konten

Topic archive

Linux

Ekosistem sistem operasi open-source yang dikenal karena fleksibilitas, developer tooling, serta penggunaannya yang luas pada server, platform cloud, perangkat embedded, dan workstation.

66 articles
Linux 18 Sep 2026 5 min read

pidfd_getfd Menduplikasi File Descriptor Proses Lain ke Proses Pemanggil

Nomor file descriptor hanya memiliki arti di dalam tabel descriptor suatu proses, tetapi objek kernel di balik nomor tersebut dapat dipakai bersama oleh beberapa proses. Linux pidfd_getfd() menjembatani dua ruang itu: syscall ini menerima PID file descriptor beserta nomor descriptor dari proses yang dirujuk, lalu memasang descriptor duplikat pada proses pemanggil. Descriptor baru tersebut merujuk ke open file description yang sama dengan descriptor target. Properti terakhir itu merupakan batas utama. pidfd_getfd() tidak membuka ulang pathname, menyalin byte, atau membuat posisi file yang independen. Operasi ini menduplikasi referensi kernel yang sudah ada sehingga semantik state bersama dapat memengaruhi kedua proses.

Linux 18 Sep 2026 5 min read

Notifikasi User Seccomp Mendelegasikan System Call Terpilih ke Supervisor

Filter seccomp dapat menghentikan system call terpilih sebelum dieksekusi lalu mengubahnya menjadi request pada listener file descriptor. Thread pemanggil tetap terblokir saat supervisor userspace memeriksa notifikasi dan mengembalikan hasil. Mekanisme ini membentuk batas mediasi yang lebih sempit daripada tracing setiap system call dan lebih dinamis daripada menanam seluruh keputusan langsung di classic BPF. Mekanismenya adalah SECCOMP_RET_USER_NOTIF. Filter mengembalikan action tersebut untuk operasi yang memerlukan mediasi eksternal. Filter yang dipasang dengan SECCOMP_FILTER_FLAG_NEW_LISTENER menghasilkan listener file descriptor, lalu supervisor memakai ioctl notifikasi seccomp pada descriptor tersebut.

Linux 18 Sep 2026 5 min read

mseal Mengunci Tata Letak dan Permission Mapping Memori

Sebuah proses dapat membentuk mapping memori dengan alamat, ukuran, dan protection bit tertentu, lalu mengubah mapping itu melalui operasi seperti munmap(), mprotect(), atau mremap(). Linux mseal() menambahkan transisi state satu arah: virtual memory area terpilih dapat disegel sehingga sejumlah perubahan mapping berikutnya ditolak oleh kernel. Mekanisme ini melindungi struktur mapping, bukan byte yang tersimpan di dalamnya. Mapping writable yang disegel tetap dapat ditulis melalui store biasa. Sealing membatasi operasi yang dapat menghapus mapping, memindahkannya, menggantinya, atau mengubah atribut yang tercakup oleh aturan sealing.

Linux 18 Sep 2026 6 min read

membarrier Memindahkan Biaya Pengurutan Memori ke Jalur Koordinasi yang Jarang

Full hardware memory barrier pada jalur yang sangat sering dieksekusi dapat membebankan biaya pada setiap operasi, meskipun koordinasi lintas thread hanya terjadi sesekali. Linux membarrier() menyediakan penempatan biaya yang berbeda: jalur koordinasi yang jarang dapat meminta event pengurutan pada sekumpulan thread tertentu, sementara jalur yang sering dapat cukup memakai pengurutan pada level compiler dalam desain yang sesuai. Mekanisme ini bukan pengganti umum untuk atomic, lock, atau memory model suatu bahasa pemrograman. membarrier() adalah primitive sinkronisasi khusus Linux untuk desain yang correctness-nya sudah memiliki pasangan yang presisi antara jalur yang sering dan jalur koordinasi yang jarang.

Linux 18 Sep 2026 5 min read

Flag Resolve openat2 Membatasi Traversal Path per Operasi Open

Sebuah pathname yang diberikan ke openat2() dapat ditolak walaupun pathname yang sama berhasil diresolusikan melalui openat(). Perbedaannya berasal dari open_how.resolve: Linux dapat menerapkan batas traversal ketika setiap komponen path diresolusikan untuk satu operasi open. Batas penanganan path pun berubah. File descriptor direktori dapat berfungsi lebih dari sekadar titik awal; flag resolve dapat membatasi escape, traversal symbolic link, perpindahan mount, dan lookup yang membutuhkan pekerjaan di luar state cache. Kebijakan resolusi melekat pada satu operasi openat2() memperluas model openat() dengan struct open_how yang dapat diperluas:

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.

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.

Linux 18 Sep 2026 5 min read

close_range Mengontrol Pewarisan Descriptor pada Batas exec

Sebuah proses yang bersiap memanggil execve() dapat memiliki ratusan atau ribuan file descriptor terbuka, sementara program baru hanya seharusnya mewarisi beberapa descriptor tertentu. Menutup descriptor satu per satu menimbulkan biaya pencatatan sekaligus masalah concurrency: thread lain dapat mengalokasikan descriptor ketika loop pembersihan masih berjalan. Linux close_range() memindahkan operasi tersebut ke batas tabel descriptor. Caller menentukan rentang angka inklusif dan meminta kernel menutup descriptor dalam rentang itu atau menandainya close-on-exec. Dengan CLOSE_RANGE_UNSHARE, caller dapat lebih dahulu memisahkan tabel descriptornya dari thread atau proses yang berbagi tabel tersebut.

Linux 17 Sep 2026 4 min read

Truncating File yang Dipetakan Dapat Memicu SIGBUS

Sebuah process dapat tetap memiliki rentang address mmap() yang valid setelah operasi lain mengecilkan backing file, lalu menerima SIGBUS ketika menyentuh mapped page yang berada di luar akhir file baru. Mapping-nya sendiri tidak hilang. Backing object-nya tidak lagi mencakup setiap page yang semula direferensikan oleh virtual mapping. Boundary ini mudah terlewat karena mapping lifetime dan file size adalah state yang terpisah. Menutup file descriptor awal tidak membatalkan mapping yang sudah terbentuk, dan mengecilkan file tidak bertindak seperti munmap() pada setiap process yang memetakannya.

Linux 17 Sep 2026 5 min read

TCP_NODELAY Menonaktifkan Penggabungan Nagle pada Socket

Socket TCP dapat menahan write kecil alih-alih langsung mengirimkannya ketika data sebelumnya belum menerima acknowledgment. Perilaku ini berasal dari penggabungan Nagle: aliran segmen TCP kecil dibatasi dengan membiarkan data yang masih outstanding memengaruhi pengiriman byte yang baru masuk antrean. Di Linux, pengaturan TCP_NODELAY menonaktifkan aturan penggabungan tersebut untuk socket. Write kecil menjadi memenuhi syarat untuk segera dikirim, dengan tetap tunduk pada bagian lain dari stack TCP, congestion control, flow control, keadaan antrean, dan penjadwalan perangkat.

Linux 17 Sep 2026 6 min read

SO_REUSEPORT Membagi Trafik ke Beberapa Grup Socket

SO_REUSEPORT mengubah satu endpoint lokal dari binding satu socket menjadi sebuah grup socket. Di Linux, beberapa socket TCP atau UDP dapat melakukan bind ke alamat lokal yang sama ketika semua socket yang ikut mengaktifkan opsi ini sebelum bind() dan kredensial binding memenuhi aturan reuse dari kernel. Perilaku ini berbeda dari sekadar melonggarkan pemeriksaan konflik alamat. Trafik yang masuk juga harus diarahkan ke salah satu anggota grup. Batas pemilihan ini memengaruhi arsitektur listener, isolasi antrean, restart proses, penempatan flow UDP, dan desain apa pun yang menganggap satu port selalu identik dengan satu socket.

Linux 17 Sep 2026 4 min read

SO_RCVLOWAT Menaikkan Ambang Readability pada Socket Linux

Socket Linux dengan SO_RCVLOWAT di atas satu byte dapat memiliki data dalam antrean sementara poll(), select(), atau epoll belum melaporkan readiness baca normal. Sejak Linux 2.6.28, antarmuka readiness tersebut menghormati receive low-water mark yang dikonfigurasi. Opsi ini mengubah ambang yang terkait dengan readiness penerimaan normal. Opsi ini tidak menetapkan batas pesan, tidak mencadangkan ruang receive buffer, dan tidak menjamin operasi penerimaan berikutnya mengembalikan tepat sejumlah byte sesuai nilai konfigurasi. Readability dapat memerlukan lebih dari satu byte dalam antrean Readiness penerimaan socket biasanya diamati dengan low-water mark bawaan sebesar satu byte. Pada kondisi ini, data biasa yang sudah masuk antrean cukup untuk memenuhi bagian volume data dari kondisi readable.

Linux 17 Sep 2026 4 min read

rename Mengganti Directory Entry Secara Atomik di Linux

Pemanggilan rename() yang berhasil dapat mengganti pathname tujuan yang sudah ada tanpa memperlihatkan keadaan perantara ketika nama tujuan tersebut hilang. Proses yang melakukan resolusi terhadap tujuan akan melihat directory entry lama atau penggantinya, dengan tetap tunduk pada batasan filesystem dan mount. Transisi namespace atomik tersebut lebih sempit daripada sejumlah sifat yang sering diasosiasikan dengan penggantian file. Operasi ini tidak membuat write sebelumnya menjadi durable, tidak memaksa metadata direktori ke penyimpanan stabil, dan tidak membatalkan file descriptor yang sudah merujuk ke file yang diganti.

Linux 17 Sep 2026 4 min read

O_CLOEXEC Menutup Descriptor Secara Atomik Saat exec

File descriptor yang dibuat tanpa status close-on-exec dapat ikut terbawa ke program baru selama celah konkurensi yang sangat sempit. Pada proses Linux multithread, mengatur FD_CLOEXEC lewat pemanggilan fcntl() setelah descriptor dibuat meninggalkan interval antara pembuatan descriptor dan pembaruan flag tersebut. O_CLOEXEC menghilangkan operasi dua tahap itu. Kernel membuat descriptor dengan flag close-on-exec yang sudah aktif sejak awal, sehingga thread lain tidak dapat melihat kondisi antara ketika descriptor sudah ada tetapi masih bisa diwariskan melalui execve() yang berhasil.

Linux 17 Sep 2026 5 min read

O_APPEND Menggabungkan Posisi Akhir dengan Setiap Write

O_APPEND mengubah write dari dua tindakan yang dapat dipisahkan menjadi satu operasi terpadu: Linux menempatkan open file description pada akhir file saat ini lalu melakukan write sebagai satu langkah atomik. Sifat ini penting ketika beberapa writer menulis ke regular file yang sama. Urutan lseek(fd, 0, SEEK_END) lalu write(fd, ...) tidak memiliki semantik append yang sama karena writer lain dapat mengubah file di antara kedua system call tersebut. Status append berada pada open file description O_APPEND adalah file status flag. File status flag disimpan pada open file description, bukan pada integer file descriptor itu sendiri.

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.

Linux 16 Sep 2026 4 min read

Readiness epoll Edge-Triggered Memerlukan Draining

Consumer epoll edge-triggered dapat terblokir ketika data yang belum dibaca masih tersimpan di buffer. Kegagalan ini muncul ketika sebuah event dikonsumsi, hanya sebagian input yang tersedia dibaca, lalu event loop kembali ke epoll_wait() dengan harapan menerima notifikasi lain untuk byte yang tersisa. Perilaku ini mengikuti langsung semantik EPOLLET. Notifikasi edge-triggered melaporkan perubahan readiness, bukan terus-menerus melaporkan kondisi ready. Setelah sebuah transisi readiness menghasilkan event, membiarkan file descriptor tetap ready tidak dengan sendirinya menciptakan transisi baru.

Linux 16 Sep 2026 6 min read

Linux cgroup memory.high Mengubah Kelebihan Memori Menjadi Tekanan Reclaim

Sebuah cgroup dapat tetap hidup setelah penggunaan memorinya melewati memory.high. Batas ini tidak berperilaku seperti batas alokasi keras: task di dalam cgroup akan di-throttle dan didorong ke tekanan reclaim yang berat, sementara penggunaan memori masih dapat bertahan di atas nilai yang dikonfigurasi dalam kondisi ekstrem. Perilaku tersebut membuat memory.high berbeda secara material dari memory.max. Yang pertama mengubah penggunaan berlebih menjadi biaya eksekusi dan pekerjaan reclaim. Yang kedua adalah hard limit yang dapat memicu cgroup OOM ketika reclaim tidak mampu menurunkan penggunaan secara memadai.