Operatsion tizimlar: Uchta oson. 1-qism: Kirish (tarjima)

Operatsion tizimlarga kirish

Salom, Xabr! Men sizning e'tiboringizga bir qator maqolalar-tarjimalarni taqdim etmoqchiman, mening fikrimcha, qiziqarli bo'lgan adabiyot - OSTEP. Ushbu material unix-ga o'xshash operatsion tizimlarning ishini, ya'ni zamonaviy OTni tashkil etuvchi jarayonlar, turli rejalashtiruvchilar, xotira va shunga o'xshash boshqa komponentlar bilan ishlashni chuqur o'rganadi. Bu yerda barcha materiallarning asl nusxasini ko'rishingiz mumkin shu yerda. E'tibor bering, tarjima noprofessional tarzda qilingan (juda erkin), lekin men umumiy ma'noni saqlab qoldim deb umid qilaman.

Ushbu mavzu bo'yicha laboratoriya ishlarini bu erda topishingiz mumkin:
- original: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- shaxsiy moslashuvim: github.com/bykvaadm/OS/tree/master/ostep

Siz mening kanalimni ham ko'rishingiz mumkin telegram =)

Dasturning ishlashi

Dastur ishga tushganda nima bo'ladi? Ishlayotgan dastur bitta oddiy ishni bajaradi - u ko'rsatmalarni bajaradi. Har soniyada protsessor tomonidan operativ xotiradan millionlab va hatto milliardlab ko'rsatmalar olinadi, o'z navbatida u ularni dekodlaydi (masalan, bu ko'rsatmalar qaysi turga tegishli ekanligini tan oladi) va ularni bajaradi. Bu ikkita raqam qo'shish, xotiraga kirish, shartni tekshirish, funktsiyaga o'tish va hokazo bo'lishi mumkin. Bir buyruqni tugatgandan so'ng, protsessor boshqasini bajarishga o'tadi. Shunday qilib, ko'rsatmalardan keyin ko'rsatmalar, ular dastur tugaguniga qadar bajariladi.
Bu misol tabiiy ravishda soddalashtirilgan tarzda ko'rib chiqiladi - aslida protsessorni tezlashtirish uchun zamonaviy apparat sizga ko'rsatmalarni ketma-ket bajarish, mumkin bo'lgan natijalarni hisoblash, ko'rsatmalarni bir vaqtning o'zida bajarish va shunga o'xshash hiyla-nayranglarga imkon beradi.

Fon Neymanning hisoblash modeli

Biz ta'riflagan soddalashtirilgan operatsiya shakli hisoblashning Von Neyman modeliga o'xshaydi. Fon Neyman kompyuter tizimlarining kashshoflaridan biri, u ham oΚ»yin nazariyasi mualliflaridan biridir.. Dastur ishlayotganda, bir qator boshqa hodisalar ro'y beradi, boshqa ko'plab jarayonlar va uchinchi tomon mantig'i ishlamoqda, ularning asosiy maqsadi tizimni ishga tushirish, ishlatish va texnik xizmat ko'rsatishni soddalashtirishdir.
Dasturlarni ishga tushirishni osonlashtirish (yoki hatto bir vaqtning o'zida bir nechta dasturlarni ishga tushirishga ruxsat berish), dasturlarga bir xil xotirani almashish, shuningdek, turli xil qurilmalar bilan aloqa qilish uchun mas'ul bo'lgan dasturlar to'plami mavjud. Bunday dasturiy ta'minot (dasturiy ta'minot) o'z mohiyatiga ko'ra operatsion tizim deb ataladi va uning vazifalariga tizimning to'g'ri va samarali ishlashini nazorat qilish, shuningdek, ushbu tizimni boshqarish qulayligini ta'minlash kiradi.

Operatsion tizim

Operatsion tizim, qisqacha OT deb ataladi, bu kompyuter resurslarini boshqarish va foydalanuvchining kompyuter bilan o'zaro aloqasini tashkil qilish uchun mo'ljallangan o'zaro bog'langan dasturlar to'plamidir..
OT o'z samaradorligiga birinchi navbatda eng muhim texnika - texnologiya orqali erishadi virtualizatsiya. Operatsion tizim jismoniy resurs (protsessor, xotira, disk va boshqalar) bilan o'zaro aloqada bo'lib, uni umumiyroq, qobiliyatliroq va foydalanish uchun qulayroq shaklga aylantiradi. Shuning uchun, umumiy tushunish uchun siz operatsion tizimni virtual mashina bilan taqqoslashingiz mumkin.
Foydalanuvchilarga operatsion tizimga buyruqlar berish va shu tariqa virtual mashinaning imkoniyatlaridan foydalanishga ruxsat berish uchun (masalan: dasturni ishga tushirish, xotirani ajratish, faylga kirish va h.k.) operatsion tizim interfeysni taqdim etadi. API (ilova dasturlash interfeysi) va qaysi qo'ng'iroqlarni amalga oshirish mumkin. Oddiy operatsion tizim sizga yuzlab tizim qo'ng'iroqlarini amalga oshirish imkonini beradi.
Va nihoyat, virtualizatsiya bir nechta dasturlarni ishga tushirishga (shu bilan protsessorni almashish) va bir vaqtning o'zida ularning ko'rsatmalari va ma'lumotlariga kirishga (shunday qilib xotirani almashish) va disklarga kirishga (shunday qilib kiritish-chiqarish qurilmalarini almashish) imkon berganligi sababli, operatsion tizim resurs deb ham ataladi. menejer. Har bir protsessor, disk va xotira tizimning resursidir va shuning uchun operatsion tizimning rollaridan biri ushbu resurslarni boshqarish, uni samarali, adolatli bajarish yoki aksincha, operatsion tizim qaysi vazifaga bog'liq bo'lganiga qarab vazifaga aylanadi. ishlab chiqilgan.

CPU virtualizatsiyasi

Quyidagi dasturni ko'rib chiqing:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operatsion tizimlar: Uchta oson. 1-qism: Kirish (tarjima)

U hech qanday maxsus harakatlarni amalga oshirmaydi; aslida u faqat funktsiyani chaqiradi yigirmoq(), uning vazifasi vaqtni tsiklik tekshirish va bir soniya o'tgandan keyin qaytishdir. Shunday qilib, u foydalanuvchi argument sifatida uzatgan qatorni cheksiz takrorlaydi.
Keling, ushbu dasturni ishga tushiramiz va unga argument sifatida β€œA” belgisini beramiz. Natija unchalik qiziq emas - tizim shunchaki vaqti-vaqti bilan ekranda "A" belgisini ko'rsatadigan dasturni bajaradi.
Keling, bir xil dasturning ko'plab nusxalari ishga tushirilganda, lekin uni aniqroq qilish uchun turli harflar ko'rsatilgan variantni sinab ko'raylik. Bunday holda, natija biroz boshqacha bo'ladi. Bizda bitta protsessor bo'lishiga qaramay, dastur bir vaqtning o'zida ishlaydi. Bu qanday sodir bo'ladi? Ammo ma'lum bo'lishicha, operatsion tizim apparat imkoniyatlarining yordamisiz emas, balki illyuziya yaratadi. Tizimda bir nechta virtual protsessorlar mavjudligi haqidagi illyuziya, bitta jismoniy protsessorni nazariy jihatdan cheksiz raqamga aylantiradi va shu bilan dasturlarning bir vaqtning o'zida ishlashiga imkon beradi. Bu illyuziya deyiladi CPU virtualizatsiyasi.
Ushbu rasm ko'plab savollarni tug'diradi, masalan, bir vaqtning o'zida bir nechta dastur ishlamoqchi bo'lsa, qaysi biri ishga tushiriladi? OS "qoidalari" bu muammo uchun javobgardir. Siyosatlar OTning ko'p joylarida qo'llaniladi va shu kabi savollarga javob beradi, shuningdek, OS amalga oshiradigan asosiy mexanizmlardir. Resurs boshqaruvchisi sifatida OTning roli shundan kelib chiqadi.

Xotirani virtualizatsiya qilish

Endi xotiraga qaraylik. Xotiraning fizik modeli zamonaviy tizimlarda bayt massivi sifatida ifodalanadi. Xotiradan o'qish uchun siz belgilashingiz kerak hujayra manziliunga kirish uchun. Ma'lumotlarni yozish yoki yangilash uchun siz ma'lumotlarni va uni yozish uchun katakchaning manzilini ham ko'rsatishingiz kerak.
Xotiraga kirish dasturni bajarish jarayonida doimiy ravishda sodir bo'ladi. Dastur o'zining butun ma'lumotlar strukturasini xotirada saqlaydi va unga turli ko'rsatmalarni bajarish orqali kirishadi. Shu bilan birga, ko'rsatmalar ham xotirada saqlanadi, shuning uchun unga keyingi ko'rsatma uchun har bir so'rov uchun ham kirish mumkin.

malloc() chaqirilmoqda

Qo'ng'iroq yordamida xotira maydonini ajratadigan quyidagi dasturni ko'rib chiqing malloc () (https://youtu.be/jnlKRnoT1m0):

Operatsion tizimlar: Uchta oson. 1-qism: Kirish (tarjima)

Dastur bir nechta ishlarni bajaradi. Birinchidan, u biroz xotirani ajratadi (7-qator), keyin ajratilgan katakning manzilini (9-qator) chop etadi, ajratilgan xotiraning birinchi uyasiga nol yozadi. Keyinchalik, dastur "p" o'zgaruvchisidagi manzilda xotirada saqlangan qiymatni oshiradigan tsiklga kiradi. Shuningdek, u o'zining jarayon identifikatorini ko'rsatadi. Jarayon identifikatori har bir ishlaydigan jarayon uchun noyobdir. Bir nechta nusxalarni ishga tushirganimizdan so'ng, biz qiziqarli natijaga duch kelamiz: Birinchi holda, agar biz hech narsa qilmasak va shunchaki bir nechta nusxani ishga tushirsak, manzillar boshqacha bo'ladi. Ammo bu bizning nazariyamizga kirmaydi! To'g'ri, chunki zamonaviy distributorlarda sukut bo'yicha xotira randomizatsiyasi yoqilgan. Agar siz uni o'chirib qo'ysangiz, biz kutilgan natijani olamiz - bir vaqtning o'zida ishlaydigan ikkita dasturning xotira manzillari mos keladi.

Operatsion tizimlar: Uchta oson. 1-qism: Kirish (tarjima)

Natijada ikkita mustaqil dastur o'zlarining shaxsiy manzil maydonlari bilan ishlaydi, ular o'z navbatida jismoniy xotirada operatsion tizim tomonidan xaritalanadi.. Shu sababli, bitta dastur doirasida xotira manzillaridan foydalanish boshqalarga hech qanday ta'sir ko'rsatmaydi va har bir dastur butunlay o'z ixtiyorida bo'lgan o'ziga xos jismoniy xotiraga ega bo'lib tuyuladi. Biroq, haqiqat shundaki, jismoniy xotira operatsion tizim tomonidan boshqariladigan umumiy resursdir.

Muvofiqlik

Operatsion tizimlardagi yana bir muhim mavzu mustahkamlik. Bu atama bitta dastur doirasida bir vaqtning o'zida ko'p narsalar bilan ishlashda yuzaga kelishi mumkin bo'lgan tizim muammolari haqida gapirganda ishlatiladi. Muvofiqlik muammolari hatto operatsion tizimning o'zida ham paydo bo'ladi. Xotira va protsessor virtualizatsiyasi bilan oldingi misollarda biz OS bir vaqtning o'zida ko'p narsalarni boshqarishini angladik - birinchi jarayonni ishga tushiradi, keyin ikkinchi va hokazo. Ma'lum bo'lishicha, bu xatti-harakatlar ba'zi muammolarga olib kelishi mumkin. Misol uchun, zamonaviy ko'p bosqichli dasturlar bunday qiyinchiliklarga duch keladi.

Quyidagi dasturni ko'rib chiqing:

Operatsion tizimlar: Uchta oson. 1-qism: Kirish (tarjima)

Asosiy funktsiyadagi dastur qo'ng'iroq yordamida ikkita ipni yaratadi Pthread_create(). Bu misolda ipni boshqa funksiyalar yonidagi bir xil xotira maydonida ishlaydigan, bir vaqtning o'zida bir nechta funksiyalar ishlashi aniq bo'lgan funksiya sifatida ko'rib chiqish mumkin. Bu misolda har bir ish zarrachasi biror funktsiyani ishga tushiradi va bajaradi worker() ni ishlatadi, bu esa o'z navbatida o'zgaruvchini oddiygina oshiradi,.

Keling, ushbu dasturni 1000 argument bilan ishga tushiramiz. Siz taxmin qilganingizdek, natija 2000 bo'lishi kerak, chunki har bir ip o'zgaruvchini 1000 marta oshirgan. Biroq, hamma narsa juda oddiy emas. Keling, dasturni ko'proq takrorlash tartibi bilan ishga tushirishga harakat qilaylik.

Operatsion tizimlar: Uchta oson. 1-qism: Kirish (tarjima)

Raqam kiritish orqali, masalan, 100000, biz chiqishda 200000 raqamini ko'rishni kutamiz.Ammo 100000 raqamini bir necha marta ishlatsak, biz nafaqat to'g'ri javobni ko'ra olmaymiz, balki turli xil noto'g'ri javoblarni ham olamiz. Javob shundan iboratki, raqamni ko'paytirish uchta operatsiyani talab qiladi - raqamni xotiradan olish, uni oshirish va keyin raqamni qayta yozish. Ushbu ko'rsatmalarning barchasi atomik tarzda bajarilmaganligi sababli (barchasi bir vaqtning o'zida), bu kabi g'alati narsalar sodir bo'lishi mumkin. Bu muammo dasturlashda deyiladi poyga holati - poyga holati. Noma'lum bir vaqtda noma'lum kuchlar sizning har qanday operatsiyangizning bajarilishiga ta'sir qilishi mumkin.

Manba: www.habr.com

a Izoh qo'shish