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

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

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

Осы тақырып бойынша зертханалық жұмысты мына жерден табуға болады:
- түпнұсқа: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- түпнұсқа: github.com/remzi-arpacidusseau/ostep-code
- менің жеке бейімделуім: github.com/bykvaadm/OS/tree/master/ostep

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

Бағдарлама жұмысы

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

Фон Нейманның есептеу моделі

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

Операциялық жүйе

Операциялық жүйе қысқартылған түрде ОЖ - бұл компьютер ресурстарын басқаруға және пайдаланушының компьютермен әрекеттесуін ұйымдастыруға арналған өзара байланысты бағдарламалар жиынтығы..
ОЖ өз тиімділігіне бірінші кезекте ең маңызды техника – техника арқылы жетеді виртуалдандыру. ОЖ физикалық ресурспен (процессор, жад, диск және т.б.) өзара әрекеттеседі және оны неғұрлым жалпы, күштірек және пайдалану оңайырақ түрге айналдырады. Сондықтан, жалпы түсіну үшін амалдық жүйені виртуалды машинамен өте шамамен салыстыруға болады.
Пайдаланушыларға операциялық жүйеге пәрмендер беруге және осылайша виртуалды машинаның мүмкіндіктерін пайдалануға мүмкіндік беру үшін (мысалы, бағдарламаны іске қосу, жадты бөлу, файлға қол жеткізу және т.б.) операциялық жүйе деп аталатын кейбір интерфейсті қамтамасыз етеді. API (қолданбалы бағдарламалау интерфейсі) және сіз оған қоңырау шала аласыз (қоңырау). Әдеттегі операциялық жүйе жүздеген жүйелік қоңырауларды жасауға мүмкіндік береді.
Ақырында, виртуализация бірнеше бағдарламаларды іске қосуға (осылайша орталық процессорды ортақ пайдалануға) және бір уақытта олардың нұсқаулары мен деректеріне қол жеткізуге (осылайша жадты ортақ пайдалануға) және дискілерге қол жеткізуге (осылайша енгізу/шығару құрылғыларын ортақ пайдалануға) мүмкіндік беретіндіктен, операциялық жүйе де деп аталады. ресурстар менеджері. Әрбір процессор, диск және жад жүйенің ресурсы болып табылады, сондықтан операциялық жүйенің рөлдерінің бірі осы операциялық жүйенің міндетіне байланысты осы ресурстарды басқару, оны тиімді, адал немесе керісінше орындау міндетіне айналады. жобаланған.

CPU виртуализациясы

Келесі бағдарламаны қарастырыңыз:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

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

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

Жадты виртуалдандыру

Енді естелікке назар аударайық. Қазіргі жүйелердегі жадтың физикалық моделі байттар массиві ретінде ұсынылған.. Жадтан оқу үшін көрсету керек ұяшық мекенжайыоған қол жеткізу. Деректерді жазу немесе жаңарту үшін деректерді және оны жазуға болатын ұяшықтың мекенжайын көрсету керек.
Бағдарламаның орындалу барысында жадқа үнемі қол жеткізіледі. Бағдарлама өзінің барлық деректер құрылымын жадта сақтайды және оған әртүрлі нұсқауларды орындау арқылы қол жеткізеді. Нұсқаулар сонымен қатар жадта сақталады, сондықтан оған келесі нұсқаудың әрбір сұрауы үшін қол жеткізуге болады.

malloc() қоңырауы

Қоңырау арқылы жад аймағын бөлетін келесі бағдарламаны қарастырайық malloc () (https://youtu.be/jnlKRnoT1m0):

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

Бағдарлама бірнеше нәрсені жасайды. Алдымен ол біраз жадты бөледі (7-жол), содан кейін бөлінген ұяшықтың адресін басып шығарады (9-жол), бөлінген жадтың бірінші ұясына нөл жазады. Әрі қарай, бағдарлама «p» айнымалысының мекенжайында жадта сақталған мәнді арттыратын циклге кіреді. Ол сондай-ақ процестің идентификаторын басып шығарады. Процесс идентификаторы әрбір іске қосылған процесс үшін бірегей болып табылады. Бірнеше көшірмелерді іске қосқаннан кейін біз қызықты нәтижеге тап боламыз: Бірінші жағдайда, егер сіз ештеңе жасамасаңыз және жай ғана бірнеше көшірмелерді орындасаңыз, онда мекенжайлар әртүрлі болады. Бірақ бұл біздің теориямызға жатпайды! Дұрыс, өйткені заманауи дистрибутивтерде жадтың рандомизациясы әдепкі бойынша қосылған. Егер ол өшірілсе, біз күтілетін нәтижені аламыз - бір уақытта жұмыс істейтін екі бағдарламаның жад мекенжайлары сәйкес келеді.

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

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

Жүйелілік

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

Келесі бағдарламаны қарастырыңыз:

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

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

Бұл бағдарламаны 1000 аргументі арқылы іске қосайық. Сіз болжағандай, нәтиже 2000 болуы керек, себебі әрбір ағын айнымалыны 1000 есе арттырды. Дегенмен, бәрі соншалықты қарапайым емес. Бағдарламаны көбірек қайталау ретімен іске қосуға тырысайық.

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

Санды енгізу арқылы, мысалы, 100000, біз шығысты 200000 саны ретінде көреміз деп күтеміз. Алайда, егер біз 100000 санын бірнеше рет орындасақ, біз дұрыс жауапты көріп қана қоймай, әртүрлі қате жауаптар аламыз. Жауап мынада: санды көбейту үшін үш операция қажет - санды жадтан шығару, көбейту, содан кейін нөмірді қайта жазу. Бұл нұсқаулардың барлығы атомдық түрде орындалмағандықтан (бәрі бір уақытта), мұндай оғаш нәрселер болуы мүмкін. Бұл мәселе бағдарламалауда деп аталады жарыс жағдайы. Белгісіз сәтте белгісіз күштер кез келген операцияның орындалуына әсер етуі мүмкін.

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

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