Кіріспе
Компьютерлік механизм
File locking is a mechanism that restricts access to a computer file, or to a region of a file, by allowing only one user or process to modify or delete it at a specific time and to prevent reading of the file while it's being modified or deleted. Systems implement locking to prevent the classic interceding update scenario, which is a typical example of a race condition, by enforcing the serialization of update processes to any given file. The following example illustrates the interceding update problem:
Process A reads a customer record from a file containing account information, including the customer's account balance and phone number. Process B now reads the same record from the same file, so it has its own copy. Process A changes the account balance in its copy of the customer record and writes the record back to the file. Process B, which still has the original stale value for the account balance in its copy of the customer record, updates the account balance and writes the customer record back to the file. Process B has now written its stale account balance value to the file, causing the changes made by process A to be lost. Most operating systems support the concept of record locking, which means that individual records within any given file may be locked, thereby increasing the number of concurrent update processes. Database maintenance uses file locking, whereby it can serialize access to the entire physical file underlying a database. Although this does prevent any other process from accessing the file, it can be more efficient than individually locking many regions in the file by removing the overhead of acquiring and releasing each lock. Poor use of file locks, like any computer lock, can result in poor performance or in deadlocks. File locking may also refer to additional security applied by a computer user either by using Windows security, NTFS permissions or by installing a third party file locking software.
Файлдарды құлыптау – компьютерлік файлға немесе файлдың бір бөлігіне кіруді шектейтін, тек бір пайдаланушыға немесе процеске оны белгілі бір уақытта өзгертуге немесе жоюға рұқсат беретін және файл өзгертіліп жатқан немесе жойылған кезде оны оқуды болдырмайтын механизм. Жүйелер кез келген файлға жаңарту процестерінің тізбектелуін қамтамасыз ету арқылы, жарыс жағдайының классикалық мысалы болып табылатын, аралық жаңарту сценарийін болдырмау үшін құлыптауды қолданады. Келесі мысал аралық жаңарту мәселесін көрсетеді: А процесі клиенттің есептік жазбасын, клиенттің шот балансы мен телефон нөмірі сияқты есептік ақпараттан оқиды. B процесі дәл сол файлдан сол жазбаны оқиды, сондықтан оның өз көшірмесі бар. А процесі клиенттік жазбаның көшірмесіндегі шот балансын өзгертеді және жазбаны файлға қайта жазады. B процесі, клиенттік жазбаның көшірмесінде шот балансының ескі мәні бар, шот балансын жаңартады және клиенттік жазбаны файлға қайта жазады. B процесі енді өзінің ескі шот балансын файлға жазды, нәтижесінде А процесі жасаған өзгерістер жоғалып кетеді. Көптеген операциялық жүйелер жазбаларды құлыптау тұжырымдамасын қолдайды, яғни кез келген файлдың жеке жазбаларын құлыптауға болады, осылайша бір уақытта жаңарту процестерінің саны артады. Деректер базасын күтіп-ұстау файлдарды құлыптауды пайдаланады, осы арқылы деректер базасының негізгі физикалық файлына кіруді тізбектей алады. Бұл басқа процестердің файлға кіруіне кедергі келтірсе де, әрбір құлыпты алу және босатуға байланысты қосымша шығындарды жою арқылы файлдың көптеген бөліктерін жеке-жеке құлыптаудан тиімдірек болуы мүмкін. Файлдарды құлыптауды дұрыс пайдаланбау, кез келген компьютерлік құлып сияқты, нашар өнімділікке немесе тоқтап қалуға әкелуі мүмкін. Файлдарды құлыптау, сонымен қатар, компьютер пайдаланушысы Windows қауіпсіздігін, NTFS рұқсаттарын немесе үшінші тараптың файлдарды құлыптау бағдарламалық жасақтамасын орнату арқылы қосымша қауіпсіздік шараларын қолдануға да қатысты болуы мүмкін.
File locking is a mechanism that restricts access to a computer file, or to a region of a file, by allowing only one user or process to modify or delete it at a specific time and to prevent reading of the file while it's being modified or deleted. Systems implement locking to prevent the classic interceding update scenario, which is a typical example of a race condition, by enforcing the serialization of update processes to any given file. The following example illustrates the interceding update problem:
Process A reads a customer record from a file containing account information, including the customer's account balance and phone number. Process B now reads the same record from the same file, so it has its own copy. Process A changes the account balance in its copy of the customer record and writes the record back to the file. Process B, which still has the original stale value for the account balance in its copy of the customer record, updates the account balance and writes the customer record back to the file. Process B has now written its stale account balance value to the file, causing the changes made by process A to be lost. Most operating systems support the concept of record locking, which means that individual records within any given file may be locked, thereby increasing the number of concurrent update processes. Database maintenance uses file locking, whereby it can serialize access to the entire physical file underlying a database. Although this does prevent any other process from accessing the file, it can be more efficient than individually locking many regions in the file by removing the overhead of acquiring and releasing each lock. Poor use of file locks, like any computer lock, can result in poor performance or in deadlocks. File locking may also refer to additional security applied by a computer user either by using Windows security, NTFS permissions or by installing a third party file locking software.
Мейнфреймдерде
IBM 1963 жылы OS/360 жүйесінде қолданылатын орталық компьютерлер үшін файлдарды құлыптауды алғаш рет енгізді, онда бұл "ексклюзивті бақылау" деп аталды.
Unix-қа ұқсас жүйелерде
Unix сияқты операциялық жүйелер (Linux және Apple-дің macOS-ы да оның ішінде) әдетте ашық файлдарды автоматты түрде құлыптамайды. Unix-тің әртүрлі нұсқаларында файлдарды құлыптау механизмдерінің бірнеше түрі бар, ал көптеген операциялық жүйелер үйлесімділік үшін бірнеше түрді қолдайды. Ең көп таралған механизм – және , олардың әрқайсысы fcntl-дің үстінде немесе fcntl-ден тәуелсіз түрде іске асырылуы мүмкін. Кейбір құлыптау түрлерін міндетті деп орнатуға болады, бірақ Unix жүйесінде файлдарды құлыптау әдетте ұсыныс сипатында болады. Яғни, өзара жұмыс істейтін процестер файлға қол жеткізуді үйлестіру үшін құлыптарды пайдалана алады, бірақ өзара жұмыс істемейтін процестер құлыптарды елемеуге және файлға кез келген тәсілмен қол жеткізуге құқылы. Басқаша айтқанда, файлдық құлыптар тек басқа құлыптаушы процестерді ғана шектейді, емес I/O операцияларын. Екі түрлі құлып ұсынылады: ортақ және эксклюзивті құлыптар. fcntl жағдайында әртүрлі құлыптар файлдың әртүрлі бөліктеріне (байт диапазондарына) немесе бүкіл файлға қолданылуы мүмкін. Ортақ құлыптарды бірнеше процесс бір уақытта ұстай алады, бірақ эксклюзивті құлыпты тек бір процесс ұстай алады және ол ортақ құлыппен бірге бола алмайды. Ортақ құлыпты алу үшін процесс ешбір процесс эксклюзивті құлыпты ұстамайынша күтуі керек. Эксклюзивті құлыпты алу үшін процесс ешбір процесс ешқандай құлыпты ұстамайынша күтуі керек. fcntl арқылы құрылған құлыптардан айырмашылығы, flock арқылы құрылған құлыптар форкталған кезде сақталады, бұл оларды серверлерді форкталғанда пайдалы етеді. Сондықтан, егер процестердің арасында туыстық қатынас болса және эксклюзивті құлып бастапқыда бір процесс ішінде құрылып, содан кейін форкталғанда көшірілсе, бір файлға бірнеше процесс эксклюзивті құлыпты ұстауы мүмкін. Ортақ құлыптар кейде «оқу құлыптары» деп, ал эксклюзивті құлыптар кейде «жазу құлыптары» деп аталады. Алайда, Unix жүйесіндегі құлыптар ұсыныс сипатында болғандықтан, бұл міндетті түрде орындалмайды. Сондықтан деректер базасында «ортақ жазулар» және «эксклюзивті жазулар» ұғымдары болуы мүмкін; мысалы, ортақ қол жеткізілім аясында өрісті орнында өзгертуге рұқсат етілуі мүмкін, ал қоқыс жинау және деректер базасын қайта жазу эксклюзивті қол жеткізілімді қажет етуі мүмкін. Файлдарға қолданылатын құлыптар нақты файлға, файл атауына емес. Бұл маңызды, өйткені Unix бірнеше атаудың бір файлға сілтеме жасауына мүмкіндік береді. Бұл міндетті емес құлыптаумен бірге бірнеше процестен файлдарға қол жеткізудің жоғары икемділігіне әкеледі. Екінші жағынан, ынтымақтастық құлыптау тәсілі басқа процестер орнатқан файлдық құлыптарды елемеу арқылы файлға жазатын процестерде проблемаларға әкелуі мүмкін. Осы себепті кейбір Unix сияқты операциялық жүйелер міндетті құлыптауды шектеулі түрде қолдайды. Мұндай жүйелерде setgid биті қосылған, бірақ топтық орындалу биті файл ашылған кезде өшірілген файл, егер негізгі файл жүйесі оны қолдаса, автоматты түрде міндетті құлыптауға жатады. Алайда, жергілікті емес NFS бөлімдері бұл битті ескермейді. Егер файл міндетті құлыптауға жатса, эксклюзивті құлыппен құлыпталған аймақтан оқуға немесе ортақ немесе эксклюзивті құлыппен құлыпталған аймаққа жазуға тырысу құлып босатылғанша тоқтатылады. Бұл стратегия алғаш рет System V жүйесінде пайда болды және бүгін Solaris, HP UX және Linux операциялық жүйелерінде көрінеді. Алайда, ол POSIX стандартына кірмейді және BSD негізіндегі FreeBSD, OpenBSD, NetBSD және Apple-дің macOS сияқты операциялық жүйелер оны қолдамайды. Linux файл жүйесін таулау үшін арнайы «o mand» параметрін қолдайды, бірақ бұл сирек қолданылады. Кейбір Unix сияқты операциялық жүйелер жұмыс істеп тұрған бағдарламаның орындалатын файлын жазу үшін ашуға тырысуды болдырмайды; бұл fcntl және flock ұсынғандардан бөлек, үшінші құлыптау түрі.
Қиындықтар
Бірден көп процесс берілген файлда эксклюзивті құлыпты ұстай алады, егер эксклюзивті құлып кейінгі бұрақта қайталанса. Бұл желілік серверлер үшін кодтауды жеңілдетеді және жарыс жағдайларын болдырмауға көмектеседі, бірақ хабарсыз адамдарды шатастыруы мүмкін. Міндетті құлыптар жүйелік `unlink` шақыруына әсер етпейді. Осылайша, кейбір бағдарламалар міндетті құлыптауды тиімді түрде айналып өтуі мүмкін. Стивенс пен Раго (2005) редактордың осылай істегенін байқады. Желілік файлдық жүйелерде, мысалы NFS-те, `flock` құлыптары қалай жұмыс істейтіні жүйеленуге байланысты. BSD жүйелерінде NFS-ге орнатылған бөлімдегі файлға ашылған файл дескрипторына жасалған `flock` шақырулары сәтті орындалмайды. Linux 2.6.12 нұсқасына дейін NFS файлдарына жасалған `flock` шақырулары тек жергілікті түрде ғана әрекет ететін. 2.6.12 және одан жоғары ядролар NFS файлдарына `flock` шақыруларын POSIX байттық диапазондағы құлыптарды пайдаланып іске асырады. Бұл құлыптар `fcntl` стиліндегі POSIX құлыптарын іске асыратын басқа NFS клиенттеріне көрінеді, бірақ оларды іске асырмағандарға көрінбейді. Құлыпты жаңарту және төмендету жаңа құлыпты қолданудан бұрын ескі құлыпты босатады. Егер бір қолданба эксклюзивті құлыпты ортақ құлыпқа төмендетсе, ал екінші қолданба эксклюзивті құлып күтіп тұрса, соңғы қолданба эксклюзивті құлыпты алып, бірінші қолданбаны құлыптай алады. Бұл құлыпты төмендету құлыптауға алып келуі мүмкін, бұл интуитивті емес болуы мүмкін. Белгілі бір процесс үшін файлмен байланысты барлық `fcntl` құлыптары, сол процесс сол файлға қатысты кез келген файл дескрипторын жапқанда алынып тасталады, тіпті егер бұл файл дескрипторы үшін құлып сұралмаған болса да. Сонымен қатар, `fcntl` құлыптары бала процесске мұрагерлік болып өтпейді. `fcntl` жабу семантикасы файлдарға қол жеткізе алатын кіші программалар кітапханаларын шақыратын қолданбалар үшін ерекше қиындық тудырады. Бұл "күңкілдердің" ешқайсысы да нақты `flock` стиліндегі құлыптарды пайдаланбайды. Unix домендік сокет арқылы басқа процесске берілген ашық файл дескрипторларындағы құлып күйін сақтау жүйеленуге байланысты.
Буферлі I/O проблемалары
Блоктаудың (күліп қалудың) бір себебі буферленген I/O буферлері пайдаланушының жергілікті жұмыс кеңістігінде, операциялық жүйенің буферлік жиынтығында емес, тағайындалғанда туындайды. `fread` және `fwrite` жиі буферленген I/O үшін қолданылады, ал файлдың бір бөлігі оқылғаннан кейін, сол бөлімді қайта оқуға тырысылса, деректер көбінесе жергілікті буферден алынады. Мәселе мынада: сол файлға қосылған басқа пайдаланушының да өз жергілікті буферлері бар, және олар үшін де осы жағдай орын алады. `fread` буферден алған деректерді `fwrite` арқылы жазу файлдан алынған деректерді жазу емес, ал басқа пайдаланушы оларды өзгертіп үлкерген болуы мүмкін. Екеуі де эксклюзивті қолжеткізуді қамтамасыз ету үшін `flock` функциясын пайдалана алады, бұл бір уақытта жазуды болдырмайды. Бірақ оқу файлдан емес, буферден орындалғандықтан, бірінші пайдаланушы өзгертіп қойған деректер екінші пайдаланушы үшін жоғалып кетуі мүмкін (жазылып үстіне). Осы мәселенің ең жақсы шешімі – `flock` функциясымен бірге буферсіз I/O (оқу және жазу) қолдану, бұл `fseek` және `ftell` орнына `lseek` функциясын пайдалануды білдіреді. Әрине, функция параметрлерін және қайтарылатын нәтижелерді сәйкестендіру қажет. Жалпы айтқанда, буферленген I/O ортақ файлдармен қолданылғанда қауіпті болып саналады.
AmigaOS-та
AmigaOS-та файлға (немесе каталогқа) құлып қою Lock функциясы арқылы жүзеге асырылады (dos.library кітапханасында). Құлып ортақ болуы мүмкін (басқа процестер файлды/каталогты оқи алады, бірақ өзгерте алмайды немесе жоя алмайды), немесе эксклюзивті, яғни құлыпты сәтті алған процесс ғана объектіге қол жеткізе алады немесе өзгерте алады. Құлып объектінің толыққанды бөлігіне қойылады, оның бір бөлігіне емес. Құлыпты UnLock функциясымен босату қажет: Unix-тен айырмашылығы, операциялық жүйе процесс аяқталғанда объектіні автоматты түрде босатпайды.
Қалқаны ашу бағдарламалық жасақтамасы
Ашытқыш – файлды қандай процесс бұғаттап отырғанын анықтауға арналған құрал. Ол процестердің тізімін және осы процесспен не істеуге болатынын (тапсырманы тоқтату, бұғаттамасын алу және т.б.) көрсетеді, сондай-ақ файлды өшіру немесе атауын өзгерту сияқты опциялар ұсынады. Оның мақсаты – бұрыс немесе ескірген файлдық бұғаттамаларды жою, олар көбінесе аномальды жағдайлардан туындайды, мысалы, құлап түскен немесе тоқтап қалған процестер, олардың салдарынан иеленуші процесс аяталғаннан кейін де файлдық бұғаттамалар сақталып қалады. Unix сияқты кейбір жүйелерде fstat және lockf сияқты құралдар файлдық бұғаттамалардың күйін процесс бойынша, файл атауы бойынша немесе екеуі бойынша тексеру үшін қолданылуы мүмкін. Windows жүйелерінде файл бұғатталған жағдайда, оны келесі қайта жүктеу кезінде жылжыту немесе жоюды жоспарлауға болады. Бұл тәсілді әдетте орнатушылар (инсталляторлар) бұғатталған жүйелік файлдарды алмастыру үшін пайдаланады.
Версияны басқару жүйелері
Версияны басқару жүйелерінде файлдарды құлыптау екі пайдаланушының бір файл нұсқасын бірдей уақытта өзгертуіне және кейін сақтағанда екінші пайдаланушының бірінші пайдаланушы өзгертілген нәрсені жойып жіберуіне жол бермеу үшін қолданылады. Бұл файлдық жүйеде құлыпталған файлдарды тек оқуға арналған ретінде белгілеу арқылы іске асырылады. Файлды өзгертуді қалайтын пайдаланушы құлыпты ашу (тексеру деп те аталады) операциясын жасайды, ал файлды сақтау (тексеру) операциясы аяқталғанға дейін немесе құлып кері қайтарылғанға дейін ешкімге файлды құлыптауға рұқсат етілмейді.