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

Үйлдлийн системийн танилцуулга

Хөөе Хабр! Миний бодлоор OSTEP хэмээх нэгэн сонирхолтой уран зохиолын цуврал нийтлэл-орчуулгыг та бүхэнд хүргэхийг хүсч байна. Энэхүү материал нь орчин үеийн үйлдлийн системийг бүрдүүлдэг процесс, төрөл бүрийн хуваарь, санах ой болон бусад ижил төстэй бүрэлдэхүүн хэсгүүдтэй ажиллах unix-тэй төстэй үйлдлийн системүүдийн ажлыг нэлээд гүнзгий авч үздэг. Та бүх материалын эх хувийг эндээс харж болно энд. Орчуулга нь мэргэжлийн бус (нэлээн чөлөөтэй) хийгдсэн гэдгийг анхаарна уу, гэхдээ би ерөнхий утгыг хадгалсан гэдэгт найдаж байна.

Энэ сэдвээр хийсэн лабораторийн ажлыг эндээс харж болно.

Бусад хэсгүүд:

Та мөн миний сувгийг эндээс үзэж болно цахилгаан утас =)

OS нь хэрэглэгчдэд олгодог хамгийн үндсэн хийсвэр ойлголтыг авч үзье: үйл явц. Процессын тодорхойлолт нь маш энгийн - тийм юм ажиллаж байгаа програм. Програм нь өөрөө дискэн дээр байрладаг амьгүй зүйл юм - энэ нь зааварчилгаа, магадгүй зарим статик өгөгдөл ажиллуулахыг хүлээж байгаа багц юм. Эдгээр байтуудыг авч ажиллуулж, програмыг хэрэгтэй зүйл болгон хувиргадаг үйлдлийн систем юм.
Ихэнх тохиолдолд хэрэглэгчид нэгээс олон програмыг нэгэн зэрэг ажиллуулахыг хүсдэг, жишээлбэл, та зөөврийн компьютер дээрээ хөтөч, тоглоом, медиа тоглуулагч, текст засварлагч гэх мэтийг ажиллуулж болно. Үнэн хэрэгтээ ердийн систем нь хэдэн арван эсвэл хэдэн зуун процессыг нэгэн зэрэг ажиллуулж чаддаг. Энэ баримт нь системийг ашиглахад хялбар болгодог бөгөөд та CPU үнэгүй эсэх талаар санаа зовох шаардлагагүй, зөвхөн програмуудыг ажиллуулдаг.

Энэ нь асуудал үүсгэдэг: олон CPU-ийн хуурмаг байдлыг хэрхэн хангах вэ? Та зөвхөн нэг физик CPU-тэй байсан ч үйлдлийн систем нь бараг хязгааргүй тооны CPU-ийн хуурмаг байдлыг хэрхэн бий болгож чадах вэ?

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

Хийсвэрлэл: үйл явц

Үйлдлийн системээр гүйцэтгэсэн ажиллаж байгаа програмын хийсвэрлэлийг бидний нэрлэдэг зүйл юм үйл явц. Өмнө дурьдсанчлан процесс нь ямар ч агшин зуурын хугацаанд ажиллаж байгаа программ юм. Энэхүү программ нь ажиллах явцад нэвтэрдэг эсвэл нөлөөлдөг системийн янз бүрийн нөөцөөс хураангуй мэдээллийг олж авах боломжтой програм.
Процессын бүрэлдэхүүн хэсгүүдийг ойлгохын тулд та системийн төлөвийг ойлгох хэрэгтэй: програм ажиллах явцад юу уншиж, өөрчлөх боломжтой. Ямар ч үед та програмыг гүйцэтгэхэд системийн аль элементүүд чухал болохыг ойлгох хэрэгтэй.
Системийн тодорхой элементүүдийн нэг нь процессыг агуулдаг санах ой. Зааварууд нь санах ойд байрладаг. Програмын уншиж, бичиж буй өгөгдөл нь мөн санах ойд байрладаг. Тиймээс процессын хаяглаж болох санах ой (хаяг зай гэж нэрлэдэг) нь процессын нэг хэсэг юм.
Мөн системийн төлөвийн нэг хэсэг нь регистрүүд юм. Олон заавар нь регистрүүдийн утгыг өөрчлөх эсвэл тэдгээрийн утгыг уншихад чиглэгддэг тул бүртгэлүүд нь үйл явцын чухал хэсэг болдог.
Машины төлөв байдал нь зарим тусгай бүртгэлээс бүрддэг гэдгийг тэмдэглэх нь зүйтэй. Жишээлбэл, IP - заавар заагч — программыг одоо гүйцэтгэж байгаа зааврын заагч. Бас байдаг стек заагч мөн үүнтэй холбоотой хүрээ заагч, эдгээрийг удирдахад ашигладаг: функцийн параметрүүд, локал хувьсагчууд болон буцах хаягууд.
Эцэст нь, програмууд ихэвчлэн ROM (зөвхөн унших санах ой) руу ханддаг. Энэхүү "Оролт/гаралтын" мэдээлэл нь процессоор нээгдсэн файлуудын жагсаалтыг агуулсан байх ёстой.

Процессын API

Процесс хэрхэн ажилладаг талаар ойлголтоо сайжруулахын тулд ямар ч үйлдлийн системийн интерфейст оруулах ёстой системийн дуудлагын жишээг судалцгаая. Эдгээр API нь ямар ч үйлдлийн систем дээр нэг хэлбэрээр байдаг.

бий болгох (үүсгэх): OS нь танд шинэ процесс үүсгэх боломжийг олгодог зарим аргыг агуулсан байх ёстой. Терминал руу команд оруулах эсвэл дүрс дээр давхар товших замаар програмыг эхлүүлэх үед шинэ процесс үүсгэх, дараа нь заасан програмыг ажиллуулах дуудлага үйлдлийн систем рүү илгээгдэнэ.
Устгах: Процесс үүсгэх интерфэйс байдаг тул үйлдлийн систем нь процессыг хүчээр устгах боломжийг бас хангах ёстой. Ихэнх программууд ажиллаж байхдаа аяндаа өөрөө эхэлж, дуусдаг. Үгүй бол хэрэглэгч тэднийг устгахыг хүсч байгаа тул үйл явцыг зогсоох интерфэйс нь ашигтай байх болно.
түр хүлээнэ үү (хүлээж байна): Заримдаа процесс дуусахыг хүлээх нь ашигтай байдаг тул хүлээх боломжийг олгодог зарим интерфейсийг хангадаг.
Төрөл бүрийн хяналт (янз бүрийн хяналт): Алах, үйл явцыг хүлээхээс гадна өөр өөр хяналтын аргууд байдаг. Жишээлбэл, ихэнх үйлдлийн системүүд нь процессыг царцаах (тодорхой хугацаанд гүйцэтгэлийг зогсоох), дараа нь үргэлжлүүлэх (гүйцэтгэх) боломжийг олгодог.
байдал (төлөв): Процесс хэр удаан ажиллаж байгаа эсвэл одоогоор ямар төлөвт байгаа гэх мэтийн төлөвийн талаарх зарим мэдээллийг авах янз бүрийн интерфейсүүд байдаг.

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

Процесс үүсгэх: Дэлгэрэнгүй мэдээлэл

Сонирхолтой зүйлсийн нэг бол программыг яг процесс болгон хувиргах явдал юм. Ялангуяа үйлдлийн систем нь програмыг хэрхэн авч, ажиллуулдаг. Процесс яг яаж бий болсон.
Юуны өмнө үйлдлийн систем нь програмын код болон статик өгөгдлийг санах ойд (процессын хаягийн орон зайд) ачаалах ёстой. Программууд нь ихэвчлэн диск эсвэл хатуу төлөвт дискэн дээр зарим гүйцэтгэгдэх форматаар байрладаг. Тиймээс программ болон статик өгөгдлийг санах ойд ачаалах үйл явц нь үйлдлийн систем нь тэдгээр байтыг дискнээс уншиж, санах ойн хаа нэгтээ байрлуулах чадвартай байхыг шаарддаг.

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

Код болон статик өгөгдлийг үйлдлийн системийн санах ойд ачаалсны дараа процессыг эхлүүлэхийн өмнө хийх шаардлагатай хэд хэдэн зүйл байна. Стект тодорхой хэмжээний санах ой хуваарилагдах ёстой. Програмууд нь локал хувьсагч, функцын параметр, буцах хаягийн хувьд стекийг ашигладаг. Үйлдлийн систем нь энэ санах ойг хуваарилж, процесст өгдөг. Мөн стекийг зарим аргументуудаар хуваарилж болно, ялангуяа энэ нь main() функцын параметрүүдийг, жишээ нь argc болон argv массиваар дүүргэдэг.

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

Үйлдлийн систем нь эхлүүлэх даалгавруудыг, ялангуяа I/O-той холбоотой ажлуудыг гүйцэтгэх болно. Жишээлбэл, UNIX системүүд дээр процесс бүр нь стандарт оролт, гаралт, алдааны 3 нээлттэй файлын тодорхойлогчтой байдаг. Эдгээр бариулууд нь програмуудад терминалын оролтыг уншихаас гадна мэдээллийг дэлгэцэн дээр харуулах боломжийг олгодог.

Тиймээс санах ойд код болон статик өгөгдлийг ачаалах, стек үүсгэх, эхлүүлэх, оролт гаралтын ажлуудыг гүйцэтгэхтэй холбоотой бусад ажлыг гүйцэтгэх замаар үйлдлийн систем нь процессыг гүйцэтгэх үе шатыг бэлтгэдэг. Эцэст нь хэлэхэд, хамгийн сүүлчийн ажил үлдлээ: програмыг үндсэн () функц гэж нэрлэдэг нэвтрэх цэгээр нь ажиллуулах. Үндсэн () функцийг гүйцэтгэснээр үйлдлийн систем нь CPU-ийн удирдлагыг шинээр үүсгэсэн процесс руу шилжүүлдэг тул програм ажиллаж эхэлдэг.

Процессын төлөв

Одоо бид процесс гэж юу болох, түүнийг хэрхэн бүтээдэг талаар бага зэрэг ойлголттой болсон тул түүний байж болох үйл явцын төлөвүүдийг жагсаацгаая. Хамгийн энгийн хэлбэрээр процесс нь дараах төлөвүүдийн аль нэгэнд байж болно:
ажиллаж байгаа. Ажиллаж байх үед процесс процессор дээр ажилладаг. Энэ нь зааврыг гүйцэтгэж байна гэсэн үг юм.
бэлэн. Бэлэн төлөвт процесс ажиллахад бэлэн байгаа боловч ямар нэг шалтгааны улмаас үйлдлийн систем нь үүнийг заасан хугацаанд гүйцэтгэдэггүй.
түгжигдсэн. Блоклогдсон төлөвт процесс нь ямар нэгэн үйл явдал гарах хүртэл ажиллахад бэлэн байхаас сэргийлдэг зарим үйлдлүүдийг гүйцэтгэдэг. Нэг нийтлэг жишээ бол процесс IO үйлдлийг эхлүүлэх үед процессорыг өөр процесс ашиглахын тулд блоклодог.

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

Та эдгээр төлөвийг график хэлбэрээр төсөөлж болно. Зурган дээрээс харж байгаагаар үйл явцын төлөв нь OS-ийн үзэмжээр RUNNING болон READY хооронд өөрчлөгдөж болно. Процессын төлөв READY-аас АЖИЛЛАГАА болж өөрчлөгдөхөд энэ нь процессыг төлөвлөсөн гэсэн үг юм. Эсрэг чиглэлд - зохион байгуулалтаас хасагдсан. Процесс Блоклогдсон үед, жишээ нь, би IO үйлдлийг эхлүүлсэн үед үйлдлийн систем нь зарим үйл явдал тохиолдох хүртэл, жишээлбэл IO дуусах хүртэл үүнийг энэ төлөвт байлгах болно. Энэ мөчид READY төлөв рүү шилжиж, хэрэв OS үүнийг шийдсэн бол тэр даруй АЖИЛЛАЖ БАЙНА.
Эдгээр төлөвөөр хоёр процесс хэрхэн дамждаг жишээг харцгаая. Эхлэхийн тулд хоёр процесс ажиллаж байгаа бөгөөд тус бүр нь зөвхөн CPU ашиглаж байна гэж төсөөлье. Энэ тохиолдолд тэдний мужууд иймэрхүү харагдах болно.

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

Дараах жишээнд, эхний процесс хэсэг хугацаанд ажилласны дараа IO-г хүсэх ба БЛОКСОН төлөвт орж, өөр процессыг ажиллуулах боломжийг олгодог (Зураг 1.4). Үйлдлийн систем нь 0 процесс нь CPU-г ашиглахгүй байгааг хараад 1-р процессыг эхлүүлнэ. 1-р процесс ажиллаж байх үед IO дуусч, 0-ийн төлөв READY болж өөрчлөгдөнө. Эцэст нь 1-р процесс дууссан бөгөөд дууссаны дараа 0 процесс ажлаа эхлүүлж, гүйцэтгэж, дуусгана.

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

Өгөгдлийн бүтэц

Үйлдлийн систем нь өөрөө програм бөгөөд бусад програмын нэгэн адил янз бүрийн холбогдох мэдээллийг бүртгэдэг үндсэн мэдээллийн бүтэцтэй байдаг. Процесс бүрийн төлөвийг хянахын тулд үйлдлийн систем нь заримыг нь дэмжих болно үйл явцын жагсаалт READY төлөвт байгаа бүх процессууд болон одоо ажиллаж байгаа процессуудыг хянах зарим нэмэлт мэдээлэл. Мөн үйлдлийн систем нь хаагдсан процессуудыг хянах ёстой. IO дууссаны дараа үйлдлийн систем нь шаардлагатай процессыг сэрээж, ажиллуулахад бэлэн байдалд оруулах ёстой.

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

Бэлэн, хаагдсан, ажиллаж байгаа мужуудаас гадна бусад мужууд байдаг. Заримдаа, үүсгэх үед процесс INIT төлөвт байж болно. Эцэст нь хэлэхэд, процесс аль хэдийн дууссан боловч мэдээлэл нь хараахан арилаагүй байхад ЭЦСИЙН төлөвт байрлуулж болно. UNIX систем дээр энэ төлөвийг нэрлэдэг зомби үйл явц. Энэ төлөв нь эцэг эхийн процесс нь хүүхдийн буцаах кодыг мэдэхийг хүссэн тохиолдолд хэрэг болно, жишээлбэл, ихэвчлэн 0 нь амжилттай, 1 алдааг илэрхийлдэг боловч программистууд өөр өөр асуудлуудыг дохио өгөхийн тулд нэмэлт гаралтын код гаргаж болно. Эцэг эхийн үйл явц дуусах үед уг процесс дуусахыг хүлээхийн тулд wait() гэх мэт эцсийн системийн дуудлагыг хийж, зогссон процесстой холбоотой аливаа өгөгдлийг устгах боломжтой гэсэн дохиог үйлдлийн системд өгнө.

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

Лекцийн гол санаанууд:

үйл явц — үйлдлийн систем дэх ажиллаж байгаа програмын үндсэн хийсвэрлэл. Ямар ч үед процессыг төлөвөөр нь тодорхойлж болно: хаягийн орон зай дахь санах ойн агуулга, заавар заагч, стек заагч зэрэг процессорын регистрүүдийн агуулга, уншиж эсвэл бичиж байгаа нээлттэй файлууд гэх мэт IO мэдээлэл.
Процессын API Программуудын процесс руу хийж болох дуудлагуудаас бүрдэнэ. Эдгээр нь ихэвчлэн үүсгэх, устгах эсвэл бусад дуудлага юм.
● Процесс нь ажиллаж байгаа, бэлэн, блоклогдсон зэрэг олон төлөвийн аль нэгэнд байна. Хуваарь гаргах, хуваарь гаргахаас үл хамаарах зүйл, хүлээх зэрэг янз бүрийн үйл явдлууд нь процессын төлөвийг нэгээс нөгөөд шилжүүлэх боломжтой.
Процессын жагсаалт систем дэх бүх үйл явцын талаархи мэдээллийг агуулдаг. Энд байгаа оруулга бүрийг процессын хяналтын блок гэж нэрлэдэг бөгөөд энэ нь бодит байдал дээр тодорхой үйл явцын талаар шаардлагатай бүх мэдээллийг агуулсан бүтэц юм. 

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

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