Үйлдлийн системүүд: Гурван хялбар хэсэг. 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-аас сая сая, бүр магадгүй хэдэн тэрбум зааврыг гаргаж авдаг бөгөөд эргээд кодыг нь тайлж (жишээ нь, эдгээр зааврууд ямар төрөлд хамаарахыг таних) бөгөөд тэдгээрийг гүйцэтгэдэг. Энэ нь хоёр тоо нэмэх, санах ойд хандах, нөхцөл шалгах, функц руу шилжих гэх мэт байж болно. Нэг тушаалыг гүйцэтгэсний дараа процессор нөгөөг нь гүйцэтгэхэд шилжинэ. Тиймээс зааврын дараа зааврыг програм дуусах хүртэл гүйцэтгэдэг.
Энэ жишээг мэдээж хялбаршуулсан гэж үздэг - үнэндээ процессорыг хурдасгахын тулд орчин үеийн техник хангамж нь зааварчилгааг ээлжээр гүйцэтгэх, боломжит үр дүнг тооцоолох, зааврыг нэгэн зэрэг гүйцэтгэх, ижил төстэй заль мэх хийх боломжийг олгодог.

Фон Нейманы тооцооллын загвар

Бидний тайлбарласан хялбаршуулсан ажлын хэлбэр нь Вон Нейманы тооцооллын загвартай төстэй юм. Фон Нейман бол компьютерийн системийн анхдагчдын нэг бөгөөд тоглоомын онолыг зохиогчдын нэг юм.. Хөтөлбөр ажиллаж байх үед бусад олон үйл явдлууд, бусад олон процессууд болон гуравдагч этгээдийн логик ажил явагддаг бөгөөд тэдгээрийн гол зорилго нь системийг эхлүүлэх, ажиллуулах, засвар үйлчилгээ хийхэд хялбар болгох явдал юм.
Программуудыг ажиллуулахад хялбар болгох (эсвэл бүр олон програмыг нэгэн зэрэг ажиллуулах) үүрэгтэй программ хангамжийн багц байдаг бөгөөд энэ нь програмуудад ижил санах ойг хуваалцах, өөр өөр төхөөрөмжтэй харилцах боломжийг олгодог. Ийм багц програм хангамжийг (програм хангамж) үндсэндээ үйлдлийн систем гэж нэрлэдэг бөгөөд түүний үүрэг даалгавар нь систем зөв, үр дүнтэй ажиллаж байгаа эсэхийг хянах, түүнчлэн энэ системийг удирдахад хялбар байдлыг хангах явдал юм.

үйлдлийн систем

Үйлдлийн систем буюу товчилсон нэрээр OS гэдэг нь компьютерийн нөөцийг удирдах, хэрэглэгчийн компьютертэй харилцах харилцааг зохион байгуулахад зориулагдсан харилцан уялдаатай програмуудын багц юм..
Үйлдлийн систем нь эхний ээлжинд хамгийн чухал техник болох техникээр үр дүнтэй байдаг виртуалчлал. Үйлдлийн систем нь физик нөөцтэй (процессор, санах ой, диск гэх мэт) харилцан үйлчилж, түүнийг илүү ерөнхий, илүү хүчирхэг, ашиглахад хялбар хэлбэр болгон хувиргадаг. Тиймээс, ерөнхий ойлголттой болохын тулд та үйлдлийн системийг виртуал машинтай харьцуулж болно.
Үйлдлийн системд команд өгөх, улмаар виртуал машины чадавхийг (програм ажиллуулах, санах ой хуваарилах, файлд хандах гэх мэт) ашиглах боломжийг хэрэглэгчдэд олгохын тулд үйлдлийн систем нь дараах интерфейсээр хангадаг. API (програмчлалын интерфейс) болон дуудлага хийх боломжтой (дуудлага). Ердийн үйлдлийн систем нь олон зуун системийн дуудлага хийх боломжийг олгодог.
Эцэст нь, виртуалчлал нь олон програмыг ажиллуулах (ингэснээр CPU-г хуваалцах), тэдгээрийн заавар, өгөгдөлд нэгэн зэрэг хандах (ингэснээр санах ойг хуваалцах), дискэнд хандах (ингэснээр I/O төхөөрөмжүүдийг хуваалцах) боломжийг олгодог тул үйлдлийн системийг бас нэрлэдэг. нөөцийн менежер. Процессор, диск, санах ой бүр нь системийн нөөц бөгөөд ингэснээр үйлдлийн системийн нэг үүрэг нь эдгээр нөөцийг удирдах, үр ашигтай, үнэнч шударгаар хийх, эсвэл эсрэгээр нь үйлдлийн систем нь ямар үүрэг даалгавар өгөхөөс шалтгаална. зохион бүтээгдсэн.

CPU-ийн виртуалчлал

Дараах програмыг авч үзье.
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Үйлдлийн системүүд: Гурван хялбар хэсэг. 1-р хэсэг: Танилцуулга (орчуулга)

Энэ нь ямар ч тусгай үйлдэл хийдэггүй, үнэндээ функцийг дууддаг эргэх(), түүний даалгавар нь цагийн шалгалтыг давж, нэг секунд өнгөрсний дараа буцах явдал юм. Тиймээс энэ нь хэрэглэгчийн аргумент болгон дамжуулсан мөрийг тодорхойгүй хугацаагаар давтдаг.
Энэ программыг ажиллуулаад "А" тэмдэгтийг аргумент болгон өгье. Үр дүн нь тийм ч сонирхолтой биш юм - систем нь "А" тэмдэгтийг үе үе харуулдаг програмыг ажиллуулдаг.
Одоо нэг програмын олон тохиолдлууд ажиллаж байгаа боловч үүнийг илүү ойлгомжтой болгохын тулд өөр өөр үсгүүдийг гаргаж байгаа сонголтыг туршиж үзье. Энэ тохиолдолд үр дүн нь арай өөр байх болно. Бид нэг процессортой хэдий ч програмыг нэгэн зэрэг гүйцэтгэдэг. Энэ нь яаж болдог вэ? Гэхдээ үйлдлийн систем нь техник хангамжийн тусламжгүйгээр хуурмаг байдлыг бий болгодог нь харагдаж байна. Энэ систем нь олон виртуал процессортой, нэг физик процессорыг онолын хувьд хязгааргүй тоо болгон хувиргаж, улмаар программуудыг нэгэн зэрэг ажиллуулах боломжийг олгодог гэсэн төөрөгдөл. Энэ хуурмаг гэж нэрлэдэг CPU-ийн виртуалчлал.
Энэ зураг олон асуултыг төрүүлдэг, жишээлбэл, хэд хэдэн програм нэгэн зэрэг ажиллахыг хүсвэл алийг нь эхлүүлэх вэ? Үйлдлийн системийн "бодлого" нь энэ асуултыг хариуцдаг. Бодлого нь OS-ийн олон газарт ашиглагддаг бөгөөд үүнтэй төстэй асуултуудад хариулдаг бөгөөд энэ нь үйлдлийн системийн хэрэгжүүлдэг үндсэн механизм юм. Тиймээс OS нь нөөцийн менежерийн үүрэг юм.

Санах ойн виртуалчлал

Одоо санах ойг харцгаая. Орчин үеийн систем дэх санах ойн физик загвар нь байт массив хэлбэрээр илэрхийлэгддэг.. Санах ойноос уншихын тулд та зааж өгөх хэрэгтэй үүрэн хаягхандахын тулд. Өгөгдөл бичих эсвэл шинэчлэхийн тулд та өгөгдөл болон түүнийг бичих нүдний хаягийг зааж өгөх ёстой.
Програмыг ажиллуулах явцад санах ойд байнга ханддаг. Програм нь бүхэл бүтэн өгөгдлийн бүтцийг санах ойд хадгалж, янз бүрийн зааварчилгааг гүйцэтгэх замаар түүнд ханддаг. Үүний зэрэгцээ заавар нь санах ойд хадгалагддаг тул дараагийн зааварчилгааны хүсэлт бүрт хандах боломжтой.

malloc() дуудна

Дуудлага ашиглан санах ойн бүсийг хуваарилдаг дараах програмыг авч үзье malloc () (https://youtu.be/jnlKRnoT1m0):

Үйлдлийн системүүд: Гурван хялбар хэсэг. 1-р хэсэг: Танилцуулга (орчуулга)

Хөтөлбөр нь хэд хэдэн зүйлийг хийдэг. Нэгдүгээрт, энэ нь зарим санах ойг хуваарилдаг (мөр 7), дараа нь хуваарилагдсан нүдний хаягийг (мөр 9) хэвлэж, хуваарилагдсан санах ойн эхний үүрэнд тэг бичдэг. Дараа нь програм нь "p" хувьсагчийн хаяг дахь санах ойд хадгалагдсан утгыг нэмэгдүүлэх гогцоонд ордог. Энэ нь мөн процессын ID-г өөрөө хэвлэдэг. Процессын ID нь ажиллаж байгаа процесс бүрийн хувьд өвөрмөц байдаг. Хэд хэдэн хуулбарыг гаргасны дараа бид сонирхолтой үр дүнд хүрэх болно: Эхний тохиолдолд, хэрэв та юу ч хийхгүй, хэд хэдэн хуулбарыг ажиллуулбал хаягууд өөр байх болно. Гэхдээ энэ нь бидний онолд хамаарахгүй! Зөв, орчин үеийн түгээлтүүд санах ойн санамсаргүй хуваарилалтыг анхдагчаар идэвхжүүлсэн байдаг. Хэрэв үүнийг идэвхгүй болгосон бол бид хүлээгдэж буй үр дүнг авах болно - нэгэн зэрэг ажиллаж байгаа хоёр програмын санах ойн хаягууд таарах болно.

Үйлдлийн системүүд: Гурван хялбар хэсэг. 1-р хэсэг: Танилцуулга (орчуулга)

Үүний үр дүнд бие даасан хоёр програм нь өөрийн хувийн хаягийн орон зайтай ажилладаг бөгөөд эдгээр нь эргээд үйлдлийн системээр физик санах ойд дүрслэгдсэн байдаг.. Иймд санах ойн хаягийг нэг программ дотор ашиглах нь бусдад ямар ч байдлаар нөлөөлөхгүй бөгөөд програм бүрд өөрийн гэсэн физик санах ойтой, түүнд бүрэн өгөгдсөн юм шиг санагддаг. Гэсэн хэдий ч бодит байдал нь физик санах ой нь үйлдлийн системээр удирддаг хуваалцсан нөөц юм.

Тогтвортой байдал

Үйлдлийн системийн өөр нэг чухал сэдэв бол - тууштай байдал. Энэ нэр томъёо нь нэг програмын хүрээнд олон зүйлтэй зэрэг ажиллахад системд гарч болох асуудлуудын талаар ярихад хэрэглэгддэг. Үйлдлийн систем дотроо ч гэсэн тууштай байдлын асуудал үүсдэг. Санах ой болон процессорын виртуалчлалын өмнөх жишээн дээр бид үйлдлийн систем нь олон зүйлийг нэгэн зэрэг удирддаг болохыг ойлгосон - энэ нь эхний процессыг эхлүүлж, дараа нь хоёр дахь гэх мэт. Энэ нь тодорхой болсон тул энэ зан үйл нь зарим асуудалд хүргэж болзошгүй юм. Жишээлбэл, орчин үеийн олон урсгалтай програмууд ийм бэрхшээлтэй тулгардаг.

Дараах програмыг авч үзье.

Үйлдлийн системүүд: Гурван хялбар хэсэг. 1-р хэсэг: Танилцуулга (орчуулга)

Үндсэн функц дэх програм нь дуудлага ашиглан хоёр хэлхээ үүсгэдэг pthread_create(). Энэ жишээн дээр thread-ыг бусад функцуудтай зэрэгцэн санах ойн нэг орон зайд ажиллаж байгаа, нэгэн зэрэг нэгээс олон функц ажиллаж байгаа функц гэж ойлгож болно. Энэ жишээнд thread бүр функцийг эхлүүлж, гүйцэтгэдэг worker() нь эргээд хувьсагчийг зүгээр л нэмэгдүүлдэг,.

1000 аргументтай энэ программыг ажиллуулъя. Таны таамаглаж байсанчлан үр дүн нь 2000 байх ёстой, учир нь thread бүр хувьсагчийг 1000 дахин нэмэгдүүлсэн. Гэсэн хэдий ч бүх зүйл тийм ч энгийн биш юм. Хөтөлбөрийг илүү олон давталтын дарааллаар ажиллуулахыг хичээцгээе.

Үйлдлийн системүүд: Гурван хялбар хэсэг. 1-р хэсэг: Танилцуулга (орчуулга)

Жишээ нь 100000 гэсэн тоог оруулснаар бид гаралтыг 200000 гэсэн тоогоор харна гэж найдаж байна. Гэхдээ бид 100000 гэсэн тоог хэд хэдэн удаа ажиллуулбал зөв хариултыг харахгүй төдийгүй өөр өөр буруу хариулт авах болно. Хариулт нь тоог нэмэгдүүлэхийн тулд гурван үйлдлийг хийх шаардлагатай - санах ойноос тоог гаргаж авах, нэмэгдүүлэх, дараа нь дугаарыг буцааж бичих. Эдгээр бүх зааврыг атомын аргаар (бүгд нэгэн зэрэг) гүйцэтгэдэггүй тул ийм хачирхалтай зүйл тохиолдож болно. Энэ асуудлыг програмчлалд гэж нэрлэдэг уралдааны нөхцөл. Үл мэдэгдэх хүч таны аливаа үйл ажиллагааны гүйцэтгэлд нөлөөлж болзошгүй үед.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх