Alasan mengapa TCP / IP soket penggunaan deskriptor file adalah bahwa, ketika antarmuka soket pertama kali dirancang dan diimplementasikan ( di BSD Unix, pada tahun 1983 ), desainer merasa bahwa koneksi jaringan adalah analog dengan file - Anda bisa read
, write
dan close
kedua , dan itu akan cocok dengan gagasan Unix "semuanya adalah file".
Implementasi tumpukan jaringan TCP / IP lainnya tidak selalu berintegrasi dengan subsistem file-I / O OS mereka, contohnya adalah MacTCP . Tetapi karena antarmuka soket BSD sangat populer, bahkan implementasi lain ini memilih untuk mereplikasi API soket dengan fungsi seperti Unix, jadi Anda mendapat "deskriptor file", hanya digunakan untuk komunikasi TCP / IP, pada sistem yang tidak sebaliknya punya deskriptor file.
Bagian lain dari pertanyaan Anda adalah mengapa ada batasan? Itu karena cara tercepat untuk mengimplementasikan tabel pencarian deskriptor file adalah dengan sebuah array. Secara historis, batas tersebut dikodekan ke dalam kernel.
Berikut kode dalam Unix rilis 7 (1979) dengan batas 20 file deskriptor file per proses:
Sebagai perbandingan, Linux secara dinamis mengalokasikan ruang untuk tabel deskriptor file suatu proses. Batas absolut default ke 8192, tetapi Anda dapat mengatur ini untuk apa pun yang Anda suka. Sistem saya mencantumkan 191072 di /proc/sys/fs/file-max
.
Meskipun tidak ada lagi batasan absolut di Linux, namun kami tidak ingin membiarkan program menjadi gila, sehingga administrator (atau pengemas distribusi) umumnya menetapkan batas sumber daya. Lihatlah /etc/security/limits.conf
, atau jalankan ulimit -n
.