Чому розетки TCP / IP вважаються "відкритими файлами"?


29

Мені потрібна допомога, яка сприймає те, що я впевнений, що це основна концепція в Linux: ліміт відкритих файлів. Зокрема, мене бентежить питання, чому відкриті сокети можуть рахувати загальну кількість "відкритих файлів" у системі.

Може хтось, будь ласка, детальніше пояснив причину? Я розумію, що це, ймовірно, стосується всього принципу "все є файлом" в Linux, але будь-які додаткові деталі будуть вдячні.

Відповіді:


34

Обмеження на "відкриті файли" насправді не лише для файлів. Це обмеження на кількість ручок ядра, якими може користуватися один процес одночасно. Історично єдине, що програми зазвичай відкривали багато файлів, тому це стало відомо як обмеження кількості відкритих файлів. Існує обмеження, яке допоможе запобігти процесам, скажімо, відкрити безліч файлів і випадково забути їх закрити, що з часом спричинить загальносистемні проблеми.

Підключення до гнізда - це також ручка ядра. Тож ті самі обмеження діють з тих же причин - це можливо, щоб процес відкривав мережеві з'єднання і забував їх закрити.

Як зазначається в коментарях, ручки ядра традиційно називають дескрипторами файлів у Unix-подібних системах.


23
"Обробляє ядро" - це термінологія Windows. Ви скоріше зверніться до "дескрипторів файлів", і саме це, як правило, називається Unix та Linux.
jlliagre

11
Ця відповідь захищає занадто багато. Розетки - це файли. Вони забезпечують доступ до потоків байтів через read/ writeінтерфейс, який є серцем того, що означає бути файлом.

4
@ WumpusQ.Wumbley, але тоді у вас є shutdown(2)системний виклик на них, але не у файлах, і ви не можете читати з сокета за допомогою cat- ось причина netcatстворена. Я б сказав, що (на щастя) сокети в ядрах, схожих на Unix, ведуть себе як файли з точки зору вводу-виводу, але подібність закінчується саме там. (Чесно кажучи, я також хотів би почутись від когось із досвідом Плану 9, оскільки я чув, що вони об'єднали ці речі далі, ніж традиційні унії).
kostix

@MikeB, ця книга повинна допомогти вам досягти швидкісного використання більшості концепцій, пов’язаних з Unix. Настійно рекомендується.
kostix

3
Ідея "все є файлом" означає, що "файл" - це абстрактний тип даних з багатьма підтипами. Більшість підтипів підтримують додаткові методи на додаток до основних матеріалів, які підтримують усі файли. розетки мають багато додаткової інформації. блокувати пристрої та звичайні файли мають пошук. каталоги дійсно дивні (писати не працює, і якщо читати працює, це не корисно). Наявність додаткових методів не означає, що ці речі не входять до загальної категорії речей, які ми називаємо "файлами".

27

Причина , чому сокетов TCP / IP дескриптори використання файлів є те , що, коли інтерфейс сокетів був першим розроблений і реалізований ( в BSD Unix, в 1983 році ), його творці вважали , що мережеве з'єднання було аналогічно файлу - ви можете read, writeі closeяк , і щоб воно добре відповідало ідеї Unix про "все - файл".

Інші реалізації мережевих стеків TCP / IP не обов'язково інтегруються з підсистемою файло -вводу-виводу їх ОС, наприклад, MacTCP . Але оскільки інтерфейс сокетів BSD був настільки популярний, навіть ці інші реалізації вирішили тиражувати API сокета з його функціями, схожими на Unix, тому ви отримали "дескриптори файлів", які використовуються лише для зв'язку TCP / IP, в системах, які не інакше мати дескриптори файлів.

Інша частина вашого питання полягає в тому, чому існує обмеження? Це тому, що найшвидший спосіб реалізувати таблицю пошуку дескрипторів файлів - це масив. Історично було обмежено обмеження в ядрі.

Ось код у випуску Unix 7 (1979) із жорстко кодованим обмеженням 20 дескрипторів файлів на процес:

Для порівняння, Linux динамічно виділяє простір для таблиці дескрипторів файлів процесу. Абсолютний ліміт за замовчуванням - 8192, але ви можете встановити це все, що завгодно. Моя система перелічує 191072 в /proc/sys/fs/file-max.

Незважаючи на те, що в Linux вже немає абсолютного ліміту, тим не менше, ми не хочемо відпускати програми з розуму, тому адміністратор (або розповсюджувач пакунків) зазвичай встановлює обмеження ресурсів. Погляньте /etc/security/limits.conf, або біжіть ulimit -n.


Одна з найкращих відповідей у ​​цій темі, дякую
user859375

6

Файли - це не просто файли на диску чи пам'яті; це потоки даних, з яких - лише два приклади.

Віддалені кінцеві точки - третій приклад, і ви взаємодієте з тими, хто використовує сокети.


2
Ласкаво просимо до U & L.SE. Мені подобається ця відповідь.
eyoung100
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.