Операционни системи: Три лесни части. Част 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

Можете също да разгледате канала ми на телеграма =)

Работа на програмата

Какво се случва, когато една програма работи? Работещата програма прави едно просто нещо - изпълнява инструкции. Всяка секунда милиони и дори евентуално милиарди инструкции се извличат от процесора от RAM, на свой ред той ги декодира (например разпознава към кой тип принадлежат тези инструкции) и ги изпълнява. Това може да бъде добавяне на две числа, достъп до паметта, проверка на условие, преминаване към функция и т.н. След изпълнение на една инструкция, процесорът преминава към изпълнение на друга. И така инструкция след инструкция, те се изпълняват, докато програмата приключи.
Този пример естествено се счита за опростен - всъщност, за да ускори процесора, съвременният хардуер ви позволява да изпълнявате инструкции извън ред, да изчислявате възможни резултати, да изпълнявате инструкции едновременно и подобни трикове.

Фон Нойманов модел на изчисление

Описаната от нас опростена форма на работа е подобна на модела на фон Нойман за изчисление. Фон Нойман е един от пионерите на компютърните системи, той е и един от авторите на теорията на игрите. Докато програмата работи, се случват куп други събития, работят много други процеси и логика на трети страни, чиято основна цел е да опрости стартирането, работата и поддръжката на системата.
Има набор от софтуер, който е отговорен за улесняване на стартирането на програмите (или дори за позволяване на множество програми да работят едновременно), който позволява на програмите да споделят една и съща памет и да комуникират с различни устройства. Такъв набор от софтуер (софтуер) по същество се нарича операционна система и неговите задачи включват наблюдение дали системата работи правилно и ефективно, както и осигуряване на лекота на управление на тази система.

Операционна система

Операционната система, съкратено ОС, е набор от взаимосвързани програми, предназначени да управляват компютърните ресурси и да организират взаимодействието на потребителя с компютъра..
ОС постига своята ефективност на първо място, чрез най-важната техника – техниката виртуализация. ОС взаимодейства с физически ресурс (процесор, памет, диск и т.н.) и го трансформира в по-обща, по-мощна и по-лесна за използване форма. Следователно, за общо разбиране, можете много грубо да сравните операционната система с виртуална машина.
За да позволи на потребителите да дават команди на операционната система и по този начин да използват възможностите на виртуалната машина (като например стартиране на програма, разпределяне на памет, достъп до файл и т.н.), операционната система предоставя някакъв интерфейс, наречен API (интерфейс за програмиране на приложения) и към който можете да осъществявате повиквания (повикване). Типичната операционна система позволява извършването на стотици системни извиквания.
И накрая, тъй като виртуализацията позволява множество програми да се изпълняват (като по този начин споделят процесора) и едновременно да имат достъп до техните инструкции и данни (като по този начин споделят памет) и да имат достъп до дискове (като по този начин споделят I/O устройства). ), операционната система се нарича още мениджър на ресурси. Всеки процесор, диск и памет е ресурс на системата и по този начин една от ролите на операционната система става задачата да управлява тези ресурси, да го прави ефективно, честно или обратно, в зависимост от задачата, за която тази операционна система е проектирана.

Виртуализация на процесора

Помислете за следната програма:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Операционни системи: Три лесни части. Част 1: Въведение (превод)

Той не извършва никакви специални действия, всъщност всичко, което прави, е да извиква функция въртене(), чиято задача е да премине през проверката на времето и да се върне след изтичане на една секунда. По този начин той повтаря безкрайно низа, който потребителят е предал като аргумент.
Нека да стартираме тази програма и да й предадем знака "A" като аргумент. Резултатът не е особено интересен - системата просто изпълнява програма, която периодично извежда символа "А".
Сега нека опитаме опцията, когато много копия на една и съща програма работят, но извеждат различни букви, за да стане по-ясно. В този случай резултатът ще бъде малко по-различен. Въпреки факта, че имаме един процесор, програмата се изпълнява едновременно. Как се случва? Но се оказва, че операционната система, не без помощта на хардуерни възможности, създава илюзия. Илюзията, че системата има множество виртуални процесори, превръщайки един физически процесор в теоретично безкраен брой и по този начин позволявайки на привидно програми да работят едновременно. Тази илюзия се нарича Виртуализация на процесора.
Тази картина повдига много въпроси, например, ако няколко програми искат да работят едновременно, коя ще бъде стартирана? „Политиките“ на ОС са отговорни за този въпрос. Политиките се използват на много места в ОС и отговарят на въпроси като този и са основните механизми, които ОС прилага. Оттук и ролята на ОС като мениджър на ресурси.

Виртуализация на паметта

Сега нека да разгледаме паметта. Физическият модел на паметта в съвременните системи се представя като масив от байтове.. За да четете от паметта, трябва да посочите клетъчен адресза достъп до него. За да запишете или актуализирате данни, трябва също да посочите данните и адреса на клетката, където да ги запишете.
Достъпът до паметта е постоянен по време на изпълнение на програмата. Програмата съхранява цялата си структура от данни в паметта и осъществява достъп до нея чрез изпълнение на различни инструкции. Междувременно инструкциите също се съхраняват в паметта, така че тя също е достъпна за всяка заявка за следваща инструкция.

malloc() извикване

Помислете за следната програма, която разпределя област от паметта, използвайки повикването malloc () (https://youtu.be/jnlKRnoT1m0):

Операционни системи: Три лесни части. Част 1: Въведение (превод)

Програмата прави няколко неща. Първо, той разпределя малко памет (ред 7), след това отпечатва адреса на разпределената клетка (ред 9), записва нула в първия слот на разпределената памет. След това програмата влиза в цикъл, в който увеличава стойността, съхранена в паметта на адреса в променливата "p". Той също така отпечатва идентификатора на самия процес. ID на процеса е уникален за всеки работещ процес. След като стартирахме няколко копия, ще се натъкнем на интересен резултат: В първия случай, ако не направите нищо и просто стартирате няколко копия, тогава адресите ще бъдат различни. Но това не попада в нашата теория! Правилно, тъй като модерните дистрибуции имат рандомизация на паметта, активирана по подразбиране. Ако е деактивиран, получаваме очаквания резултат - адресите на паметта на две едновременно работещи програми ще съвпадат.

Операционни системи: Три лесни части. Част 1: Въведение (превод)

В резултат на това се оказва, че две независими програми работят със свои собствени частни адресни пространства, които от своя страна се картографират от операционната система във физическа памет. Следователно използването на адреси на паметта в рамките на една програма няма да повлияе по никакъв начин на другите и за всяка програма изглежда, че има собствена част от физическата памет, изцяло предоставена на нея. Реалността обаче е, че физическата памет е споделен ресурс, управляван от операционната система.

Последователност

Друга от важните теми в операционните системи е − последователност. Този термин се използва, когато говорим за проблеми в системата, които могат да възникнат при работа с много неща едновременно в една и съща програма. Проблеми с последователността възникват дори в самата операционна система. В предишните примери за виртуализация на паметта и процесора разбрахме, че ОС управлява много неща едновременно – стартира първия процес, след това втория и т.н. Както се оказа, това поведение може да доведе до някои проблеми. Така например съвременните многонишкови програми изпитват такива трудности.

Помислете за следната програма:

Операционни системи: Три лесни части. Част 1: Въведение (превод)

Програмата в основната функция създава две нишки, използвайки повикването pthread_create(). В този пример една нишка може да се разглежда като функция, изпълнявана в едно и също пространство на паметта заедно с други функции, като очевидно повече от една функция се изпълняват едновременно. В този пример всяка нишка стартира и изпълнява функцията worker(), което на свой ред просто увеличава променливата,.

Нека стартираме тази програма с аргумент 1000. Както може би се досещате, резултатът трябва да е 2000, защото всяка нишка увеличава променливата 1000 пъти. Всичко обаче не е толкова просто. Нека се опитаме да изпълним програмата с порядък повече повторения.

Операционни системи: Три лесни части. Част 1: Въведение (превод)

Чрез въвеждане на число, например 100000 200000, очакваме да видим резултата като числото 100000 XNUMX. Ако обаче изпълним числото XNUMX XNUMX няколко пъти, не само няма да видим правилния отговор, но и ще получим различни грешни отговори. Отговорът се крие във факта, че за увеличаване на числото са необходими три операции - извличане на числото от паметта, увеличаване и след това записване на числото обратно. Тъй като всички тези инструкции не се изпълняват атомарно (всички по едно и също време), могат да се случат странни неща като това. Този проблем се нарича в програмирането състезателно състояние. Когато неизвестни сили в неизвестен момент могат да повлияят на изпълнението на някоя от вашите операции.

Източник: www.habr.com

Купете надежден хостинг за сайтове с DDoS защита, VPS VDS сървъри 🔥 Купете надежден уеб хостинг със защита от DDoS атаки, VPS VDS сървъри | ProHoster