Кіріспе

Компьютерлік механизм

Файлдарды құлыптау – компьютерлік файлға немесе файлдың бір бөлігіне кіруді шектейтін, тек бір пайдаланушыға немесе процеске оны белгілі бір уақытта өзгертуге немесе жоюға рұқсат беретін және файл өзгертіліп жатқан немесе жойылған кезде оны оқуды болдырмайтын механизм. Жүйелер кез келген файлға жаңарту процестерінің тізбектелуін қамтамасыз ету арқылы, жарыс жағдайының классикалық мысалы болып табылатын, аралық жаңарту сценарийін болдырмау үшін құлыптауды қолданады. Келесі мысал аралық жаңарту мәселесін көрсетеді: А процесі клиенттің есептік жазбасын, клиенттің шот балансы мен телефон нөмірі сияқты есептік ақпараттан оқиды. B процесі дәл сол файлдан сол жазбаны оқиды, сондықтан оның өз көшірмесі бар. А процесі клиенттік жазбаның көшірмесіндегі шот балансын өзгертеді және жазбаны файлға қайта жазады. B процесі, клиенттік жазбаның көшірмесінде шот балансының ескі мәні бар, шот балансын жаңартады және клиенттік жазбаны файлға қайта жазады. B процесі енді өзінің ескі шот балансын файлға жазды, нәтижесінде А процесі жасаған өзгерістер жоғалып кетеді. Көптеген операциялық жүйелер жазбаларды құлыптау тұжырымдамасын қолдайды, яғни кез келген файлдың жеке жазбаларын құлыптауға болады, осылайша бір уақытта жаңарту процестерінің саны артады. Деректер базасын күтіп-ұстау файлдарды құлыптауды пайдаланады, осы арқылы деректер базасының негізгі физикалық файлына кіруді тізбектей алады. Бұл басқа процестердің файлға кіруіне кедергі келтірсе де, әрбір құлыпты алу және босатуға байланысты қосымша шығындарды жою арқылы файлдың көптеген бөліктерін жеке-жеке құлыптаудан тиімдірек болуы мүмкін. Файлдарды құлыптауды дұрыс пайдаланбау, кез келген компьютерлік құлып сияқты, нашар өнімділікке немесе тоқтап қалуға әкелуі мүмкін. Файлдарды құлыптау, сонымен қатар, компьютер пайдаланушысы Windows қауіпсіздігін, NTFS рұқсаттарын немесе үшінші тараптың файлдарды құлыптау бағдарламалық жасақтамасын орнату арқылы қосымша қауіпсіздік шараларын қолдануға да қатысты болуы мүмкін.

Мейнфреймдерде

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 жүйелерінде файл бұғатталған жағдайда, оны келесі қайта жүктеу кезінде жылжыту немесе жоюды жоспарлауға болады. Бұл тәсілді әдетте орнатушылар (инсталляторлар) бұғатталған жүйелік файлдарды алмастыру үшін пайдаланады.

Версияны басқару жүйелері

Версияны басқару жүйелерінде файлдарды құлыптау екі пайдаланушының бір файл нұсқасын бірдей уақытта өзгертуіне және кейін сақтағанда екінші пайдаланушының бірінші пайдаланушы өзгертілген нәрсені жойып жіберуіне жол бермеу үшін қолданылады. Бұл файлдық жүйеде құлыпталған файлдарды тек оқуға арналған ретінде белгілеу арқылы іске асырылады. Файлды өзгертуді қалайтын пайдаланушы құлыпты ашу (тексеру деп те аталады) операциясын жасайды, ал файлды сақтау (тексеру) операциясы аяқталғанға дейін немесе құлып кері қайтарылғанға дейін ешкімге файлды құлыптауға рұқсат етілмейді.