Операциялық жүйелер: үш оңай бөлік. 2-бөлім: Абстракция: процесс (аударма)

Операциялық жүйелермен таныстыру

Эй Хабр! Мен сіздердің назарларыңызға менің ойымша, бір қызықты әдебиеттің аудармалары – OSTEP мақалалар топтамасын ұсынғым келеді. Бұл материалда UNIX тәрізді операциялық жүйелердің жұмысы, атап айтқанда, қазіргі ОЖ құрайтын процестермен, әртүрлі жоспарлаушылармен, жадпен және басқа ұқсас компоненттермен жұмыс өте терең қарастырылады. Мұнда сіз барлық материалдардың түпнұсқасын көре аласыз осында. Аударма кәсіби емес (өте еркін) жасалғанын ескеріңіз, бірақ мен жалпы мағынаны сақтап қалдым деп үміттенемін.

Осы тақырып бойынша зертханалық жұмысты мына жерден табуға болады:

Басқа бөліктер:

Сондай-ақ менің арнамды мына жерден көре аласыз жеделхаттар =)

ОЖ пайдаланушыларға беретін ең іргелі абстракцияны қарастырайық: процесс. Процестің анықтамасы өте қарапайым - бұл іске қосылған бағдарлама. Бағдарламаның өзі дискіде орналасқан жансыз нәрсе - бұл нұсқаулар жиынтығы және іске қосылуды күтіп тұрған кейбір статикалық деректер. Бұл байттарды алып, оларды іске қосып, бағдарламаны пайдалы нәрсеге айналдыратын ОЖ.
Көбінесе пайдаланушылар бір уақытта бірнеше бағдарламаны іске қосқысы келеді, мысалы, ноутбукта браузерді, ойынды, медиа ойнатқышты, мәтіндік редакторды және т.б. Шындығында, әдеттегі жүйе бір уақытта ондаған немесе жүздеген процестерді орындай алады. Бұл факт жүйені пайдалануды жеңілдетеді, сіз ешқашан процессордың бос екендігі туралы алаңдамайсыз, сіз жай ғана бағдарламаларды іске қосасыз.

Бұл мәселені тудырады: көптеген процессорлардың иллюзиясын қалай қамтамасыз ету керек? Сізде тек бір физикалық процессор болса да, операциялық жүйе процессорлардың шексіз санының елесін қалай жасай алады?

ОЖ бұл иллюзияны процессорды виртуалдандыру арқылы жасайды. Бір процесті бастап, содан кейін оны тоқтату, басқа процесті бастау және т.б. арқылы ОЖ көптеген виртуалды процессорлар бар деген иллюзияны сақтай алады, ал шын мәнінде бір немесе бірнеше физикалық процессорлар болады. Бұл техника деп аталады CPU ресурстарын уақыт бойынша бөлу. Бұл әдіс пайдаланушыларға қалағанынша қатар жүретін процестерді орындауға мүмкіндік береді. Бұл шешімнің құны өнімділік болып табылады - өйткені егер процессорды бірнеше процестер бөліссе, әрбір процесс баяу өңделеді.
Орталық процессорды виртуалдандыруды жүзеге асыру үшін, әсіресе оны жақсы орындау үшін ОЖ төмен және жоғары деңгейлі қолдауды қажет етеді. Төмен деңгейлі қолдау деп аталады механизмдер функцияның қажетті бөлігін жүзеге асыратын төмен деңгейлі әдістер немесе протоколдар. Мұндай функционалдылықтың мысалы ретінде ОЖ бір бағдарламаны тоқтатып, процессордағы басқа бағдарламаны іске қосу мүмкіндігін беретін контекстік коммутацияны келтіруге болады. Бұл уақытты бөлу барлық заманауи операциялық жүйелерде жүзеге асырылады.
Осы механизмдердің үстіне ОЖ-ға «саясат» түріндегі кейбір логика кіреді. саясат операциялық жүйе үшін шешім қабылдаудың белгілі бір алгоритмі болып табылады. Мұндай саясаттар, мысалы, қай бағдарламаны бірінші (пәрмендер тізімінен) іске қосу керектігін шешеді. Мәселен, бұл мәселе деп аталатын саясатпен шешіледі жоспарлаушы (жоспарлау саясаты) и при выборе решения будет руководствоваться такими данными как: история запуска (какая программа была запущена дольше всех за последнюю минут), какую нагрузку осуществляет данный процесс (какие типы программ были запущены), метрики производительности (оптимизирована ли система для интерактивного взаимодействия или для пропускной способности ) тағыда басқа.

Абстракция: процесс

Операциялық жүйемен орындалатын жұмыс істеп тұрған бағдарламаның абстракциясын біз деп атаймыз процесс. Жоғарыда айтылғандай, процесс - бұл кез келген лезде уақыт кезеңінде жұмыс істейтін бағдарлама. Бұл бағдарлама оны орындау кезінде қол жеткізетін немесе әсер ететін әртүрлі жүйелік ресурстардан жиынтық ақпаратты алуға болатын бағдарлама.
Процестің құрамдас бөліктерін түсіну үшін жүйенің күйлерін түсіну керек: оның жұмысы кезінде бағдарлама нені оқи алады немесе өзгерте алады. Кез келген уақытта бағдарламаны орындау үшін жүйенің қандай элементтері маңызды екенін түсіну керек.
Жүйенің айқын элементтерінің бірі процеске кіретінін білдіреді есте сақтау. Нұсқаулар жадта орналасқан. Бағдарлама оқитын немесе жазатын мәліметтер де жадта орналасады. Осылайша, процесс адрестей алатын жады (мекенжай кеңістігі деп аталады) процестің бөлігі болып табылады.
Сондай-ақ жүйе күйінің бөлігі регистрлер болып табылады. Көптеген нұсқаулар регистрлердің мәнін өзгертуге немесе олардың мәнін оқуға бағытталған, осылайша регистрлер де процесс жұмысының маңызды бөлігіне айналады.
Айта кету керек, машина күйі де кейбір арнайы регистрлерден қалыптасады. Мысалы, IP – нұсқау көрсеткіші — программаның қазіргі уақытта орындалып жатқан нұсқауының көрсеткіші. Тағы да бар стек көрсеткіші және соған байланысты жақтау көрсеткіші, басқару үшін пайдаланылады: функция параметрлері, жергілікті айнымалылар және қайтарылатын мекенжайлар.
Соңында, бағдарламалар жиі ROM-ға (тек оқуға арналған жад) қол жеткізеді. Бұл «Енгізу/шығару» (енгізу/шығару) ақпараты қазіргі уақытта процесс арқылы ашылған файлдардың тізімін қамтуы керек.

Процесс API

Процесс қалай жұмыс істейтінін түсінуді жақсарту үшін кез келген операциялық жүйе интерфейсіне қосылуы керек жүйелік қоңыраулардың мысалдарын зерттейік. Бұл API интерфейстері кез келген ОЖ-да бір немесе басқа түрде қол жетімді.

жасау (жасау): ОЖ жаңа процестерді жасауға мүмкіндік беретін кейбір әдісті қамтуы керек. Терминалға пәрменді енгізгенде немесе белгішені екі рет басу арқылы қолданбаны іске қосқанда, жаңа процесті жасау үшін ОЖ-ға қоңырау жіберіледі, содан кейін көрсетілген бағдарламаны іске қосады.
Жою: Процесті құруға арналған интерфейс бар болғандықтан, ОЖ сонымен қатар процесті мәжбүрлеп жою мүмкіндігін қамтамасыз етуі керек. Көптеген бағдарламалар іске қосылғанда өздігінен басталып, өздігінен аяқталады. Әйтпесе, пайдаланушы оларды өлтіруді қалайды және осылайша процесті тоқтату үшін интерфейс пайдалы болар еді.
күту (күту): Кейде процестің аяқталуын күту пайдалы, сондықтан күту мүмкіндігін қамтамасыз ететін кейбір интерфейстер қамтамасыз етіледі.
Әртүрлі басқару (әртүрлі бақылау): Өлту және процесті күтуден басқа, басқа да әртүрлі бақылау әдістері бар. Мысалы, операциялық жүйелердің көпшілігі процесті тоқтату мүмкіндігін береді (белгілі бір кезеңге оның орындалуын тоқтатады), содан кейін оны жалғастырады (орындауды жалғастыру)
мәртебе (күй): процестің күйі туралы кейбір ақпаратты алу үшін әртүрлі интерфейстер бар, мысалы, оның қанша уақыт жұмыс істеп тұрғаны немесе қазіргі уақытта қандай күйде екендігі.

Операциялық жүйелер: үш оңай бөлік. 2-бөлім: Абстракция: процесс (аударма)

Процесті құру: мәліметтер

Қызықты нәрселердің бірі - бағдарламалардың процестерге қалай түрленетіні. Әсіресе операциялық жүйе бағдарламаны қалай қабылдап, іске қосады. Процесс қалай дәл құрылған.
Ең алдымен ОЖ бағдарлама кодын және статикалық деректерді жадқа (процесс адрестік кеңістігіне) жүктеуі керек. Бағдарламалар әдетте қандай да бір орындалатын пішімде дискіде немесе қатты күйдегі дискіде орналасады. Осылайша, бағдарламаны және статикалық деректерді жадқа жүктеу процесі ОЖ дискіден сол байттарды оқу және оларды жадтың бір жеріне орналастыру мүмкіндігін талап етеді.

Алғашқы операциялық жүйелерде жүктеу процесі ынтамен орындалды, яғни бағдарлама іске қосылғанға дейін бүкіл код жадқа жүктелді. Заманауи операциялық жүйелер мұны жалқаулықпен жасайды, яғни код бөліктерін немесе мәліметтерді бағдарлама оны орындау кезінде талап еткенде ғана жүктейді.

Код пен статикалық деректер ОЖ жадына жүктелгеннен кейін, процесс іске қосылмас бұрын тағы бірнеше әрекеттерді орындау қажет. Стек үшін жадтың белгілі бір көлемі бөлінуі керек. Бағдарламалар жергілікті айнымалылар, функция параметрлері және қайтарылатын мекенжайлар үшін стек пайдаланады. ОЖ бұл жадты бөледі және оны процеске береді. Стек кейбір аргументтермен де бөлінуі мүмкін, атап айтқанда ол main() функциясының параметрлерін толтырады, мысалы argc және argv массивімен.

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

Операциялық жүйе инициализациялау тапсырмаларын да орындайды, әсіресе енгізу/шығарумен байланысты. Мысалы, UNIX жүйелерінде әрбір процесте стандартты енгізу, шығару және қате үшін 3 ашық файл дескрипторы болады. Бұл тұтқалар бағдарламаларға терминалдан кірісті оқуға, сондай-ақ ақпаратты экранда көрсетуге мүмкіндік береді.

Осылайша, жадқа кодты және статикалық деректерді жүктеу, стекті құру және инициализациялау және енгізу/шығару тапсырмаларын орындауға байланысты басқа жұмыстарды орындау арқылы ОЖ процесті орындау кезеңін дайындайды. Соңында, бір соңғы тапсырма қалды: бағдарламаны негізгі() функциясы деп аталатын кіру нүктесі арқылы іске қосу. Негізгі() функциясын орындау арқылы ОЖ процессорды басқаруды жаңадан құрылған процеске береді, осылайша бағдарлама орындала бастайды.

Процесс күйі

Енді бізде процесс деген не және оның қалай жасалатыны туралы біраз түсінік болған соң, оның болуы мүмкін процесс күйлерін тізіп көрейік. Ең қарапайым түрде процесс мына күйлердің бірінде болуы мүмкін:
Жүгіру. Іске қосу кезінде процесс процессорда орындалады. Бұл нұсқаулар орындалып жатқанын білдіреді.
дайын. Дайын күйде процесс іске қосылуға дайын, бірақ қандай да бір себептермен ОЖ оны белгіленген уақытта орындамайды.
Блокталған. Бұғатталған күйде процесс қандай да бір оқиға орын алғанша оның орындауға дайын болуына кедергі келтіретін кейбір әрекеттерді орындайды. Жалпы мысалдардың бірі процесс IO әрекетін бастағанда, ол басқа процесс процессорды пайдалана алатындай блокталады.

Операциялық жүйелер: үш оңай бөлік. 2-бөлім: Абстракция: процесс (аударма)

Сіз бұл күйлерді график түрінде елестете аласыз. Суретте көріп отырғанымыздай, процесс күйі ОЖ қалауы бойынша ОРЫНДАУ және ДАЙЫН арасында өзгеруі мүмкін. Процестің күйі ДАЙЫН күйден ОРЫНДАУ күйіне өзгергенде, бұл процестің жоспарланғанын білдіреді. Қарама-қарсы бағытта - макеттен жойылады. Процесс БҰҚАУЛЫҒАН кезде, мысалы, мен IO операциясын бастаймын, ОЖ оны қандай да бір оқиға орын алғанша, мысалы, IO аяқталғанша осы күйде сақтайды. осы сәтте ДАЙЫН күйге және егер ОЖ шешсе, бірден ОРЫНДАУ күйіне көшу.
Осы күйлер арқылы екі процестің қалай жүретінін мысалға келтірейік. Алдымен, екі процесс жұмыс істеп тұрғанын және әрқайсысы тек процессорды пайдаланып жатқанын елестетейік. Бұл жағдайда олардың күйлері келесідей болады.

Операциялық жүйелер: үш оңай бөлік. 2-бөлім: Абстракция: процесс (аударма)

Келесі мысалда, бірінші процесс, біраз уақыттан кейін іске қосылғаннан кейін, IO-ны сұрайды және басқа процесті іске қосуға мүмкіндік беретін BLOCKED күйіне кіреді (1.4-сурет). ОЖ 0 процесінің орталық процессорды пайдаланбағанын көреді және 1-процесті бастайды. 1-процесс орындалып жатқанда, IO аяқталады және 0 процесінің күйі ДАЙЫН болып өзгереді. Соңында, 1-процесс аяқталды және аяқталғаннан кейін 0-процесс жұмысын бастайды, орындайды және аяқтайды.

Операциялық жүйелер: үш оңай бөлік. 2-бөлім: Абстракция: процесс (аударма)

Деректер құрылымы

ОЖ өзі бағдарлама болып табылады және кез келген басқа бағдарламалар сияқты оның әртүрлі сәйкес ақпарат бөліктерін қадағалайтын кейбір негізгі деректер құрылымдары бар. Әрбір процестің күйін бақылау үшін ОЖ кейбіреулерін қолдайды процесс тізімі ДАЙЫН күйдегі барлық процестер үшін және ағымдағы орындалып жатқан процестерді бақылау үшін кейбір қосымша ақпарат. Сондай-ақ, ОЖ блокталған процестерді бақылауы керек. IO аяқталғаннан кейін ОЖ қажетті процесті оятып, оны іске қосуға дайын күйге қоюы керек.

Мысалы, ОЖ процессор регистрлерінің күйін сақтауы керек. Процесс тоқтаған кезде регистрлердің күйі процестің адрестік кеңістігінде сақталады, ал оның жұмысы жалғасуда регистрлердің мәндері қалпына келтіріледі және осылайша осы процестің орындалуын жалғастырады.

Дайын, бұғатталған, жұмыс істеп тұрған күйлерден басқа, басқа да күйлер бар. Кейде, құру кезінде процесс INIT күйінде болуы мүмкін. Ақырында, процесс аяқталып қойған, бірақ оның ақпараты әлі тазартылмаған кезде, оны ҚҰТҚЫС күйіне қоюға болады. UNIX жүйелерінде бұл күй деп аталады зомби процесі. Бұл күй ата-аналық процесс баланың қайтару кодын білгісі келетін жағдайлар үшін пайдалы, мысалы, әдетте 0 сәтті және 1 қатені білдіреді, бірақ бағдарламашылар әртүрлі мәселелерді сигнал беру үшін қосымша шығыс кодтарын бере алады. Ата-аналық процесс аяқталғанда, ол еншілес процестің аяқталуын күту үшін wait() сияқты соңғы жүйелік қоңырауды жасайды және операциялық жүйеге тоқтатылған процеске қатысты кез келген деректерді өшіре алатыны туралы сигнал береді.

Операциялық жүйелер: үш оңай бөлік. 2-бөлім: Абстракция: процесс (аударма)

Дәрістің негізгі түйіндері:

процесс — ОЖ-да орындалатын программаның негізгі абстракциясы. Кез келген уақытта процесті оның күйі бойынша сипаттауға болады: оның мекенжай кеңістігіндегі жад мазмұны, нұсқаулық көрсеткіші мен стек көрсеткішін қоса, процессор регистрлерінің мазмұны және оқылатын немесе жазылатын ашық файлдар сияқты IO ақпараты.
Процесс API бағдарламалар процестерге жасай алатын қоңыраулардан тұрады. Әдетте бұл жасау, жою немесе басқа қоңыраулар.
● Процесс көптеген күйлердің бірінде, соның ішінде іске қосылған, дайын, блокталған. Жоспарлау, жоспарлаудан ерекше жағдайлар немесе күту сияқты әртүрлі оқиғалар процестің күйін бірінен екіншісіне өзгерте алады.
Процесс тізімі жүйедегі барлық процестер туралы ақпаратты қамтиды. Ондағы әрбір жазба процесті басқару блогы деп аталады, ол шын мәнінде белгілі бір процесс туралы барлық қажетті ақпаратты қамтитын құрылым болып табылады. 

Ақпарат көзі: www.habr.com

пікір қалдыру