У програмуванні витік ресурсів () — це особливий тип споживання ресурсів комп'ютерною програмою, за якого програма не звільняє ресурси, які вона отримала. Цей стан зазвичай є результатом помилки в програмі. Типовими витоками ресурсів є витік пам'яті та витік дескриптора, зокрема витоки дескрипторів файлів, хоча пам'ять часто розглядають окремо від інших ресурсів..
Прикладами ресурсів, доступних операційній системі в обмеженій кількості, є мережені сокети, дескриптори файлів, записи таблиці процесів та ідентифікатори процесів (PID). Витоки ресурсів часто є незначною проблемою, спричиняючи щонайбільше незначне уповільнення та усуваючись після завершення процесів. В інших випадках витоки ресурсів можуть бути серйозною проблемою, спричиняючи ресурсний голод і значне уповільнення або нестабільність системи, аварійне завершення процесу, що спричинив витік, інших процесів або навіть усієї системи.. Витоки ресурсів часто залишаються непоміченими за невеликого навантаження та короткого часу роботи, і ці проблеми проявляються лише за значного навантаження на систему або в системах, які залишаються запущеними протягом тривалого часу..
Витоки ресурсів є особливо проблемними для ресурсів, доступних у дуже малих кількостях. Витік унікального ресурсу, такого як м'ютекси, є особливо серйозним, оскільки це спричиняє негайне вичерпання ресурсів (перешкоджає отриманню цього ресурсу іншими процесами) та призводить до взаємного блокування. Навмисний витік ресурсів може використовуватися в атаці типу «відмова в обслуговуванні», наприклад у вигляді fork-бомб, і тому витоки ресурсів є вразливостями безпеки.
Причини
Витоки ресурсів зазвичай спричинені помилками програмування: отримані ресурси необхідно звільняти, але оскільки звільнення часто відбувається через значний час після отримання, а тим часом може статися багато чого (наприклад, виникнути виняток або відбутися аварійне завершення програми), звільнення легко пропустити.
Дуже поширеним прикладом є незакриття відкритих файлів, унаслідок чого відбувається витік дескриптора файлу; це також трапляється з каналами. Іншим поширеним прикладом є те, що батьківський процес не викликає wait для дочірнього процесу, унаслідок чого завершений дочірній процес залишається процесом-зомбі, спричиняючи витік запису таблиці процесів.
Запобігання та пом'якшення наслідків
Витокам ресурсів можна запобігти або їх можна усунути за допомогою керування ресурсами: методи програмування або конструкції мови можуть запобігати витокам, своєчасно звільняючи ресурси, тоді як окремий процес може повертати ресурси, які зазнали витоку. Багато витоків ресурсів усуваються шляхом повернення ресурсів операційною системою після завершення процесу та виконання ним системного виклику exit.
Таким чином, витоки ресурсів є насамперед проблемою для довготривалих процесів, оскільки ресурси, які зазнали витоку та залишаються утримуваними запущеними процесами, часто не повертаються; а також для процесів, які швидко отримують і втрачають велику кількість ресурсів.
Див. також Ресурсний голод Старіння програмного забезпечення
Примітки