uy - Brauzerlar
Linuxda ko'p vazifali dasturlash. Ko'p vazifali Linux dasturlash foni va ustuvor jarayonlarni boshqarish

Linux- ko'p vazifali va ko'p foydalanuvchili operatsion tizim ta'lim, biznes, individual dasturlash uchun. Linux UNIX-ga o'xshash operatsion tizimlar oilasiga kiradi.

Linux dastlab Linus Torvalds tomonidan yozilgan va keyin butun dunyo bo'ylab son-sanoqsiz odamlar tomonidan yaxshilangan. Bu kompyuterlar uchun yaratilgan birinchi kuchli operatsion tizimlardan biri bo'lgan Unix operatsion tizimining klonidir, lekin u bepul emas. Lekin uni yaratishda na Unix System Laboratories, na Unix yaratuvchisi, na Berkeley University — Berkeley Software Distribution (BSD) dasturchilari ishtirok etmadi. Eng biri qiziqarli faktlar Linux tarixidan shuni ko'rsatadiki, uni yaratishda butun dunyodagi odamlar bir vaqtning o'zida - Avstraliyadan Finlyandiyagacha - ishtirok etishgan va hozirgacha buni davom ettirmoqdalar.

Linux dastlab 386 protsessorida ishlash uchun mo'ljallangan edi. Linus Torvaldsning birinchi loyihalaridan biri jarayonlar o‘rtasida almashinishi mumkin bo‘lgan dastur bo‘lib, ulardan biri AAAA, ikkinchisi esa BBBB ni chop etadi. Bu dastur keyinchalik Linuxga aylandi. Linus OS yadrosini ishlab chiqqan va uning barqarorligi uchun mas'ul deyish to'g'riroq bo'ladi.

Linux eng mashhur Unix-ni qo'llab-quvvatlaydi dasturiy ta'minot, shu jumladan grafik tizimi X Window - va bu juda ko'p sonli dasturlar, ammo shuni ta'kidlash kerakki, Linux MUTLAK BEPUL keladi. Eng ko'p pul to'lashingiz kerak bo'lgan narsa - bu Linux tarqatilishi yozilgan o'ram va CD. Distribyutor - bu OTning o'zi + Linux uchun dasturiy ta'minot to'plami. Shuni ham ta'kidlash kerakki, bularning barchasi manba kodi bilan birga keladi va Linux ostida yozilgan har qanday dastur sizning ehtiyojlaringizga mos ravishda o'zgartirilishi mumkin. Bu, shuningdek, har qanday dasturni istalgan platformaga o'tkazish imkonini beradi - Intel PC, Macintosh. Aytgancha, yuqorida aytilganlarning barchasi bepul dasturiy ta'minot jamg'armasi, fond tufayli sodir bo'ldi bepul dasturlar, bu GNU loyihasining bir qismidir. Aynan shu maqsadlar uchun GPL - General Public License - yaratilgan bo'lib, uning asosida Linux, barcha dasturiy ta'minot kabi bepul va Linux yoki uning qismlari uchun dasturiy ta'minotdan tijorat maqsadlarida foydalanish taqiqlanadi. unix linux konfiguratsiya tizimi

Yuqoridagilardan tashqari, Linux juda kuchli va barqaror operatsion tizimdir. Uni Internetda ishlatish o'z samarasini beradi va uni buzish unchalik oson emas.

Bugungi kunda Linuxning rivojlanishi ikki tarmoqdan iborat. Birinchisi, juft versiya raqamlari (2.0, 2.2, 2.4) Linuxning yanada barqaror, ishonchli versiyasi hisoblanadi. Ikkinchisi, uning versiyalari toq raqamlar bilan raqamlangan (2.1, 2.3), yanada jasoratli va tezroq rivojlanadi va shuning uchun (afsuski) ko'proq buggy. Ammo bu ta'mga bog'liq masala.

Linuxda hech qanday ajratish yo'q C, D haydovchilari, va qurilmalar bilan aloqa qilish jarayoni juda qulay. Barcha qurilmalar o'ziga xos xususiyatlarga ega tizim fayli, barcha disklar bitta fayl tizimiga ulangan va barchasi monolit ko'rinadi, bitta. Aniq katalog tuzilmasi har qanday ma'lumotni bir zumda topish imkonini beradi. Kutubxona fayllari uchun - o'z katalogi, ishga tushirilgan fayllar uchun - o'z, sozlamalari bo'lgan fayllar uchun - o'z, qurilma fayllari uchun - o'z va hokazo.

Yadroning modulligi kompyuterni qayta yoqmasdan har qanday OS xizmatlarini ulash imkonini beradi. Bundan tashqari, siz OS yadrosining o'zini qayta tiklashingiz mumkin, chunki yadro manba kodlari har qanday tarqatishda ham mavjud.

Linux operatsion tizimi, ta'bir joiz bo'lsa, ko'p vazifali g'oyadan juda mohirona foydalanadi, ya'ni. tizimdagi har qanday jarayonlar bir vaqtning o'zida amalga oshiriladi (Windows bilan solishtiring: fayllarni floppi diskga nusxalash va hozirda musiqa tinglashga urinish har doim ham mos kelmaydi).

Biroq, hamma narsa juda oddiy emas. Linux Windows-ga qaraganda biroz murakkabroq va Windows-dan foydalangandan keyin hamma ham unga osongina o'ta olmaydi. Bir qarashda, bu juda noqulay va sozlash qiyin bo'lib tuyulishi mumkin. Ammo bu unday emas. Linux-ning asosiy jihati shundaki, siz uni o'zingiz uchun sozlashingiz, uni ushbu OT dan foydalanishdan katta mamnuniyat his qilishingiz uchun sozlashingiz mumkin.Ko'p sonli sozlamalar OTning tashqi (va ichki) ko'rinishini o'zgartirishga imkon beradi. bitta Linux tizimi siznikiga o'xshash bo'ladi Linuxda siz grafik qobiqdan foydalanishni tanlashingiz mumkin, bir nechta mavjud. ofis paketlari, server dasturlari, xavfsizlik devorlari... Shunchaki butun bir to'da turli dasturlar har qanday lazzat uchun.

1998 yilda Linux eng tez rivojlanayotgan server operatsion tizimi bo'lib, o'sha yili qabul qilish 212% ga oshdi. Bugungi kunda 20 000 000 dan ortiq Linux foydalanuvchilari mavjud. Linux ostida ikkalasi uchun mo'ljallangan ko'plab ilovalar mavjud uyda foydalanish, va to'liq ishlaydigan UNIX ish stantsiyalari va Internet serverlari uchun.

Linux endi shunchaki operatsion tizim emas. Linux tobora ko'proq kultga o'xshab bormoqda. Kult masalasida haqiqatga erishish tobora qiyinlashib bormoqda. Keling, faktlardan boshlaylik. Shunday qilib, Linux:

  • * bepul (aniqrog'i, erkin tarqatilgan) Unix kloni;
  • * haqiqiy multitasking bilan operatsion tizim;
  • * Har bir "foydalanuvchi" o'zgartirishi mumkin bo'lgan OT, chunki uning deyarli har qanday qismi uchun manba kodlarini topishingiz mumkin;
  • * ishlab chiqaruvchining xohishiga ko'ra emas, balki aynan siz xohlagan tarzda sozlangan.

Linuxga yangi boshlanuvchilarni, birinchi navbatda, uning "salqin" va zamonaviy ekanligi qiziqtiradi. Ushbu operatsion tizim oxirgi foydalanuvchi uchun haqiqatan ham mos emas degan afsona bor. Ishonchli va hackga chidamli serverni yig'ish uchun bu ko'proq yaxshi qaror, lekin uchun emas oddiy foydalanuvchi qulaylik, qulaylik talab qiladigan va hozirda ishlayotgan tizimni tushunishni va his qilishni umuman istamaydigan. Bu mutlaqo to'g'ri emas. Grafik interfeysga ega moslashtirilgan Linux tizimidan foydalanish Microsoft operatsion tizimi kabi oson va intuitivdir. Shunchaki, Linuxni sozlash juda ko'p kuch va bilim talab qiladi.

Uning yaratilishi va rivojlanishining ushbu xususiyatlari natijasida Linux juda o'ziga xos "xarakterli xususiyatlar" ga ega bo'ldi. Bir tomondan, bu odatiy UNIX tizimi, ko'p foydalanuvchili va ko'p vazifali. Boshqa tomondan, xakerlar, talabalar va umuman hamma narsani eng mayda detallarigacha o'rganishni va tushunishni yaxshi ko'radigan har qanday odamlarning odatiy tizimi mavjud. Linuxni o'rnatish va undan foydalanishning moslashuvchanligi, ehtimol, teng emas. Siz uni win95 ishlaydigan darajada ishlatishingiz mumkin - ya'ni Windows ostida uning barcha xususiyatlariga ega grafik ish stoliga ega bo'ling: piktogrammalar, vazifalar paneli, kontekst menyusi, va hokazo. Bundan tashqari, siz hech qanday farq qilmaydigan ish stolini o'rnatishingiz mumkin ko'rinish va Windows funksiyalari. (Umuman olganda, variantlar oyna menejerlari Linux ostida super-spartalik icewm dan o'ta murakkab Enlightment + Gnomegacha) shunchaki oxiri yo'q. Boshqa tomondan, Linux sizga har qanday mavjudlik darajasida uskunaga misli ko'rilmagan kirish imkonini beradi. To'g'ri, buning uchun sichqonchaning o'ng tugmachasini bosish etarli bo'lmaydi, siz SI va kompyuter arxitekturasini o'rganishingiz kerak bo'ladi. Ammo bir vaqtlar bu fikrning hidini, dasturchining ilhomini his qilgan odam, siz mashinani "qulog'ingizdan" ushlab turganingizda va u bilan tom ma'noda qodir bo'lgan hamma narsani qila oladi - bunday odam hech qachon qaytib kela olmaydi. Windowsning yumshoq panjalari.

Agar tijorat operatsion tizimidan foydalanganda foydalanuvchi tizimni oldingi versiyadagi nosozliklar va xatolarsiz olish uchun keyingi versiyaning chiqarilishini kutishga majbur bo'lsa, Linux modulliligi sizga yangi yadroni yuklab olish imkonini beradi, kamida ikki oyda bir marta yoki undan ham tez-tez chiqariladi (barqaror versiya).

"Linux nima?" Degan savolga javoblar. ko'p topishingiz mumkin. Ko'pchilik Linux faqat yadro ekanligiga ishonishadi. Lekin yadroning o'zi foydalanuvchi uchun hech qanday foyda keltirmaydi. Yadro, shubhasiz, Linux OT ning asosi bo'lsa-da, foydalanuvchi doimo amaliy dasturlar bilan ishlashi kerak. Bu dasturlar yadrodan kam emas. Shuning uchun, Linux yadro va asosiy dastur dasturlari to'plami bo'lib, odatda ushbu operatsion tizimga ega har bir kompyuterda o'rnatiladi. Yadro va amaliy dasturlarning bir butunga birlashishi tizim nomida ham aks ettirilgan: GNU/Linux. GNU odatda Unix-ga o'xshash tizim bilan birga keladigan dasturlarga o'xshash dasturlar to'plamini yaratish loyihasidir.

Linux tarafdorlarining umumiy shikoyati shundaki, ular Linuxning afzalliklari haqida gapirganda, ular Windowsning kamchiliklarini sanab o'tadilar. Ammo bu ko'pincha muqarrar, chunki hamma narsa taqqoslash orqali o'rganiladi va ko'pchilik kompyuter foydalanuvchilari endi faqat Windows bilan tanish. Xo'sh, Linux sizga nima beradi?

Asl: engil vaznli jarayonlar: Linux mavzularini ajratish
Mualliflar: Vishal Kanaujia, Chetan Giridhar
Nashr qilingan sana: 2011 yil 1 avgust
Tarjimasi: A. Panin
Tarjima nashr etilgan sana: 2012 yil 22 oktyabr

Linux ishlab chiquvchilari va kompyuter fanlari talabalari uchun mo'ljallangan ushbu maqola, yaxshiroq tushunish uchun manba kodi misollari bilan Linuxda engil jarayonlar yordamida iplar asoslari va ularni amalga oshirishni o'z ichiga oladi.

Dastur iplari ko'p vazifali dasturiy ta'minot muhitining asosiy elementidir. Dastur oqimini jarayonning bajarilish muhiti sifatida tavsiflash mumkin; shuning uchun har bir jarayon kamida bitta ipga ega. Ko'p ish zarralari jarayon uchun bir nechta parallel (ko'p protsessorli tizimlarda) va odatda sinxronlashtirilgan bajarish muhitiga ega bo'lishni o'z ichiga oladi.

Dastur iplari o'z identifikatorlariga (ip identifikatoriga) ega va ular bir-biridan mustaqil ravishda bajarilishi mumkin. Ular bir-biri bilan bitta jarayon manzil maydonini baham ko'radi va bu xususiyatdan afzallik sifatida foydalanadi, bu esa ma'lumotlar almashinuvi uchun IPC kanallarini (jarayonlararo aloqa tizimlari - umumiy xotira, quvurlar va boshqa tizimlar) ishlatmaslikka imkon beradi. Jarayonning mavzulari o'zaro ta'sir qilishi mumkin - masalan, mustaqil oqimlar global o'zgaruvchining qiymatini olishi/o'zgartirishi mumkin. Ushbu aloqa modeli yadro darajasida IPC qo'ng'iroqlari uchun ortiqcha xarajatlarni yo'q qiladi. Mavzular bitta manzil maydonida ishlaganligi sababli, ip kontekstini almashtirish tez va resurslarni talab qilmaydi.

Har bir dastur zanjiri vazifalarni rejalashtiruvchi tomonidan alohida qayta ishlanishi mumkin, shuning uchun ko'p bosqichli ilovalar ko'p protsessorli tizimlarda parallel bajarish uchun juda mos keladi. Bundan tashqari, iplarni yaratish va yo'q qilish tezdir. Fork() chaqiruvidan farqli o'laroq, ip ota-protsessning manzil maydonining nusxasini yaratmaydi; buning o'rniga, iplar manzil maydonini boshqa resurslar, jumladan, fayl tutqichlari va signal ishlov beruvchilari bilan birgalikda taqsimlaydi.

Ko'p tarmoqli dastur resurslardan optimal va iloji boricha samarali foydalanadi. Bunday dasturda dastur iplari tizimdan optimal foydalanishni hisobga olgan holda turli vazifalar bilan shug'ullanadi. Bitta ip diskdan faylni o'qiy oladi, ikkinchisi rozetkaga ma'lumot yozishi mumkin. Ikkala ip ham bir-biridan mustaqil bo'lib, tandemda ishlaydi. Ushbu model tizimdan foydalanishni optimallashtiradi va shu bilan ishlashni yaxshilaydi.

Bir nechta qiziqarli xususiyatlar

Mavzular bilan ishlashning eng mashhur xususiyati, ayniqsa, muhim segment sifatida belgilangan umumiy resurs mavjud bo'lganda, ularning sinxronizatsiyasi. Bu umumiy resursga kiradigan kod segmentidir va har qanday vaqtda bir nechta oqim tomonidan foydalanilmasligi kerak. Har bir ish zarrachasi mustaqil ravishda ishlashi mumkinligi sababli, umumiy manbaga kirish nazorat qilinmaydi, bu esa sinxronizatsiya primitivlarini, shu jumladan mutekslarni (o'zaro istisno), semaforlarni, o'qish/yozish blokirovkalarini va boshqalarni ishlatish zarurligiga olib keladi.

Ushbu primitivlar dasturchilarga umumiy manbaga kirishni boshqarish imkonini beradi. Yuqoridagilarga qo'shimcha ravishda, agar sinxronizatsiya modeli to'g'ri ishlab chiqilmagan bo'lsa, jarayonlar kabi iplar blokirovka yoki kutish holatiga kirishi mumkin. Ko'p tarmoqli ilovalarni disk raskadrovka va tahlil qilish ham juda mashaqqatli bo'lishi mumkin.

Linuxda iplar qanday amalga oshiriladi?

Linux ko'p tarmoqli ilovalarni ishlab chiqish va ulardan foydalanish imkonini beradi. Foydalanuvchi darajasida, Linuxda iplarni amalga oshirish ochiq standart POSIX (uniX uchun portativ operatsion tizim interfeysi) ga amal qiladi. Unix tizimlari), IEEE 1003 sifatida belgilangan. Foydalanuvchi darajasidagi kutubxona (Ubuntuda glibc.so) iplar uchun POSIX APIni amalga oshirishni ta'minlaydi.

Linuxda dastur iplari ikkita alohida bo'shliqda mavjud - foydalanuvchi maydoni va yadro maydoni. Foydalanuvchi maydonida iplar POSIX-mos keluvchi pthread kutubxonasi API yordamida yaratiladi. Ushbu foydalanuvchi fazosi iplari yadro fazosi iplari bilan uzviy bog'langan. Linuxda yadro bo'shliqlari "engil jarayonlar" sifatida ko'rib chiqiladi. Yengil jarayon - bu asosiy ish vaqti muhitining birligi. UNIX ning turli xil ta'mlaridan, jumladan HP-UX va SunOS kabi tizimlardan farqli o'laroq, Linuxda alohida o'tkazgich tizimi mavjud emas. Linux-dagi jarayon yoki ish zarrachasi "vazifa" sifatida qaraladi va bir xil ichki tuzilmalardan foydalanadi (struct task_structs tuzilmalari qatori).

Foydalanuvchi maydonida yaratilgan bir qator texnologik oqimlar uchun yadroda ular bilan bog'langan bir qancha engil jarayonlar mavjud. Misol bu fikrni ko'rsatadi: #include #o'z ichiga oladi #o'z ichiga oladi Int main() ( pthread_t tid = pthread_self(); int sid = syscall(SYS_gettid); printf("LWP identifikatori %dn", sid); printf("POSIX ip identifikatori %dn", tid); 0 qaytarish; )

ps yordam dasturidan foydalanib, jarayonlar, shuningdek, ushbu jarayonlarning engil jarayonlari/iplari haqida ma'lumot olishingiz mumkin: kanaujia@ubuntu:~/Desktop$ ps -fL UID PID PPID LWP C NLWP STIME TTY TIME CMD kanaujia 17281 5191 172810 Jun11 pts/ 2 00:00:02 bash kanaujia 22838 17281 22838 0 1 08:47 pts/2 00:00:00 ps -fL kanaujia 17647 14111 17647 0 06:00 klo: 2000 s

Yengil jarayonlar nima?

Yengil jarayon - bu foydalanuvchi bo'shlig'ini qo'llab-quvvatlaydigan jarayon. Har bir foydalanuvchi bo'sh joyi engil jarayon bilan uzviy bog'liqdir. Yengil jarayonni yaratish tartibi muntazam jarayonni yaratish tartibidan farq qiladi; "P" foydalanuvchi jarayoni bir xil guruh identifikatoriga ega bo'lgan bir qator engil jarayonlarga ega bo'lishi mumkin. Guruhlash yadroga resurslarni bo'lish imkonini beradi (resurslar manzil maydoni, sahifalarni o'z ichiga oladi jismoniy xotira(VM), signal ishlov beruvchilari va fayl deskriptorlari). Bu shuningdek, yadroga ushbu jarayonlar bilan ishlashda kontekstli kalitlardan qochish imkonini beradi. Resurslarni to'liq taqsimlash bu jarayonlarning engil deb nomlanishining sababidir.

Linux qanday qilib engil jarayonlarni yaratadi?

IN Linux yaratish engil jarayonlar standartlashtirilmagan clone() tizim chaqiruvi yordamida amalga oshiriladi. Bu fork() ga o'xshaydi, lekin ko'proq funksionallikka ega. Umuman olganda, fork() chaqiruvi clone() bilan chaqiruv yordamida amalga oshiriladi qo'shimcha parametrlar, jarayonlar o'rtasida taqsimlanadigan resurslarni ko'rsatadi. Clone() ga qo'ng'iroq qilish jarayonni yaratadi, bola ota-ona bilan ishlash vaqti elementlarini, jumladan xotira, fayl tutqichlari va signal ishlov beruvchilarini baham ko'radi. Pthread kutubxonasi iplarni amalga oshirish uchun clone() chaqiruvidan ham foydalanadi. Manba kodi fayliga qarang ./nptl/sysdeps/pthread/createthread.c glibc manba kodi katalogining 2.11.2 versiyasida.

O'zingizning engil jarayoningizni yaratish

Keling, clone() chaqiruvidan foydalanish misolini ko'rsatamiz. Qaramoq manba kodi quyidagi demo.c faylidan:

#o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi //stek oʻlchami 64kB #define STACK 1024*64 // Toʻgʻri chiziq bu funksiyani bajaradi int threadFunction(void* argument) ( printf("child thread entering\n"); close((int*)argument); printf( "child thread exiting\n"); return 0; ) int main() (void* stack; pid_t pid; int fd; fd = open("/dev/null", O_RDWR); if (fd)< 0) { perror("/dev/null"); exit(1); } // Резервирование памяти для стека stack = malloc(STACK); if (stack == 0) { perror("malloc: could not allocate stack"); exit(1); } printf("Creating child thread\n"); // Вызов clone() для создания дочернего потока pid = clone(&threadFunction, (char*) stack + STACK, SIGCHLD | CLONE_FS | CLONE_FILES |\ CLONE_SIGHAND | CLONE_VM, (void*)fd); if (pid == -1) { perror("clone"); exit(2); } // Ожидание завершения дочернего потока pid = waitpid(pid, 0, 0); if (pid == -1) { perror("waitpid"); exit(3); } // Попытка записи в файл закончится неудачей, так как поток // закрыл файл if (write(fd, "c", 1) < 0) { printf("Parent:\t child closed our file descriptor\n"); } // Освободить память, используемую для стека free(stack); return 0; }

Demo.c dasturi sizga pthread kutubxonasi bilan bir xil tarzda mavzularni yaratishga imkon beradi. Biroq, to'g'ridan-to'g'ri clone() chaqiruvidan foydalanish tavsiya etilmaydi, chunki noto'g'ri ishlatilsa, ishlab chiqilayotgan dastur muvaffaqiyatsiz bo'lishi mumkin. Linuxda clone() funksiyasining sintaksisi quyida keltirilgan: #include int klon (int (*fn) (void *), void *child_stack, int bayroqlari, void *arg);

Birinchi argument ip funksiyasi; u ip boshlanganda chaqiriladi. Clon() qo'ng'irog'i muvaffaqiyatli tugallangandan so'ng, fn funktsiyasi qo'ng'iroq qilish jarayoni bilan bir vaqtda ishlay boshlaydi.

Keyingi argument bola jarayonining stegi uchun xotira joyiga ko'rsatgichdir. Fork() va clone() ga qo'ng'iroq qilishdan oldingi qadam dasturchidan xotirani zahiraga qo'yishi va ko'rsatgichni bola jarayonining steki sifatida ishlatishni talab qiladi, chunki ota-ona va yordamchi jarayonlar xotira sahifalarini birgalikda ishlatishadi - bular stekni o'z ichiga oladi. Bola jarayoni asosiy jarayondan farqli funktsiyani chaqirishi mumkin, shuning uchun alohida stek talab qilinadi. Bizning dasturimizda biz ushbu xotira qismini malloc() funksiyasidan foydalangan holda to'pga zaxiralaymiz. Stack hajmi 64 KB ga o'rnatildi. X86 stek pastga qarab o'sganligi sababli, bo'lim oxiridan ajratilgan xotiradan foydalanib, shunga o'xshash xatti-harakatni simulyatsiya qilish kerak. Shuning uchun biz clone() funktsiyasiga quyidagi manzilni o'tkazamiz: (char*) stek + STACK

Keyingi bayroqlar argumenti ayniqsa muhimdir. Bu yaratilgan jarayon bilan qaysi resurslarni almashish kerakligini belgilash imkonini beradi. Bitmaskni tanladik SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_VM quyida tavsiflangan:

  • SIGCHLD: Ish tugagandan so'ng, ip SIGCHLD signalini ota-ona jarayoniga yuboradi. Ushbu parametrni o'rnatish ota-ona jarayoniga barcha mavzular tugashini kutish uchun wait() funksiyasidan foydalanish imkonini beradi.
  • CLONE_FS : Fayl tizimi ma'lumotlarini asosiy jarayon va oqim o'rtasida almashish. Ma'lumotlar ildizni o'z ichiga oladi fayl tizimi, ishchi katalog va umask qiymati.
  • CLONE_FILES: Fayl identifikatorlari jadvalini asosiy jarayon va oqim o'rtasida almashish. Jadvaldagi o'zgarishlar asosiy jarayonda va barcha mavzularda aks ettiriladi.
  • CLOSE_SIGHAND : Signal ishlov berish jadvalini ota-ona va bola jarayonlari o‘rtasida almashish. Shunga qaramay, agar asosiy jarayon yoki iplardan biri signal ishlov beruvchisini o'zgartirsa, o'zgarish boshqa jarayonlarning jadvallarida aks etadi.
  • CLONE_VM: Asosiy jarayon va oqimlar bir xil xotira maydonida ishlaydi. Ulardan biri tomonidan amalga oshirilgan barcha xotira yozish yoki xaritalash boshqa jarayonlar uchun mavjud.

Oxirgi parametr - bu funktsiyaga (threadFunction) uzatiladigan argument, bizning holatlarimizda fayl deskriptori.

Iltimos, biz ilgari e'lon qilgan engil jarayonlar demo.c bilan ishlash misoliga qarang.

Tarmoq asosiy jarayon tomonidan ochilgan faylni (/dev/null) yopadi. Asosiy jarayon va ip fayl deskriptorlari jadvalini baham ko'rganligi sababli, faylni yopish operatsiyasi asosiy jarayonga ham ta'sir qiladi va keyingi write() qo'ng'iroqlari muvaffaqiyatsizlikka olib keladi. Ota-ona jarayoni ipning tugashini kutadi (u SIGCHLD signalini olgan payt). Shundan so'ng, u zaxiralangan xotirani bo'shatadi va boshqaruvni qaytaradi.

Dasturni odatdagidek kompilyatsiya qilish va ishga tushirish; Chiqish quyidagiga o'xshash bo'lishi kerak: $gcc demo.c $./a.out Chizmali ipni yaratish. Chiqishga kiruvchi bolali ipni yaratish Ota-ona: bola $ fayl deskriptorini yopdi.

Linux samarali, sodda va kengaytiriladigan tarmoq infratuzilmasini qo'llab-quvvatlaydi. Bu dasturchilarda asosiy funktsiya sifatida clone() dan foydalanadigan o'tkazgich kutubxonalari bilan tajriba o'tkazish va rivojlantirishga qiziqish uyg'otdi.

Biz Linux yadrosida multithreading mavzusini davom ettiramiz. Oxirgi marta men uzilishlar, ularni qayta ishlash va vazifalar to'g'risida gapirgan edim va dastlab bu bitta maqola bo'lishi mo'ljallanganligi sababli, ish navbati haqidagi hikoyamda men o'quvchi ular bilan tanish bo'lgan deb hisoblagan holda topshiriqlarga murojaat qilaman.
O'tgan safargidek, men hikoyamni iloji boricha batafsil va batafsil qilishga harakat qilaman.

Seriyadagi maqolalar:

  1. Linux yadrosida multitasking: ish navbati

Ish navbati

Ish navbati- bu topshiriqlardan ko'ra murakkabroq va og'irroq ob'ektlar. Men bu erda amalga oshirishning barcha nozikliklarini tasvirlashga harakat qilmayman, lekin umid qilamanki, men eng muhim narsalarni ko'proq yoki kamroq batafsil tahlil qilaman.
Ish navbatlari, masalan, vazifalar jadvallari kabi, kechiktirilgan uzilishlarni qayta ishlash uchun xizmat qiladi (garchi ular boshqa maqsadlarda ishlatilishi mumkin bo'lsa-da), lekin ular vazifa jadvallaridan farqli o'laroq, yadro jarayoni kontekstida bajariladi; shunga ko'ra, ular atomik bo'lishi shart emas va uyqu rejimidan foydalanishi mumkin. () funktsiyasi, turli xil sinxronlash vositalari va boshqalar.

Keling, avvalo, ish navbatini qayta ishlash jarayoni qanday tashkil etilganligini tushunaylik. Rasmda bu juda taxminan va soddalashtirilgan ko'rsatilgan, hamma narsa aslida qanday sodir bo'lishi quyida batafsil tavsiflangan.

Ushbu qorong'u materiyada bir nechta mavjudotlar ishtirok etadi.
Birinchidan, ish elementi(shunchaki qisqacha ish) biz rejalashtirmoqchi boʻlgan funksiyani (masalan, uzilish ishlovchisi) tavsiflovchi tuzilma boʻlib, uni vazifalar tuzilmasi analogi sifatida koʻrish mumkin. Rejalashtirishda vazifalar foydalanuvchidan yashirin navbatlarga qo'shildi, ammo endi biz maxsus navbatdan foydalanishimiz kerak - ish navbati.
Vazifalar rejalashtiruvchi funksiyasi tomonidan racklanadi va ish navbati ishchilar deb ataladigan maxsus iplar tomonidan qayta ishlanadi.
Ishchi ning ish navbatdan asinxron bajarilishini ta'minlaydi. Garchi ular ishni aylanish tartibida chaqirsalar ham, umumiy holatda qat'iy, ketma-ket bajarish haqida gap bo'lmaydi: axir, bu erda oldindan olish, uxlash, kutish va hokazo.

Umuman olganda, ishchilar yadro iplari, ya'ni ular asosiy Linux yadrosi rejalashtiruvchisi tomonidan boshqariladi. Ammo ishchilar ishning parallel bajarilishini qo'shimcha tashkil etishni rejalashtirishga qisman aralashadilar. Bu quyida batafsilroq muhokama qilinadi.

Ish navbati mexanizmining asosiy imkoniyatlarini tavsiflash uchun men APIni o'rganishni taklif qilaman.

Navbat va uning yaratilishi haqida

alloc_workqueue(fmt, bayroqlar, max_active, args...)
fmt va args parametrlari nom va unga argumentlar uchun printf formatidir. Max_activate parametri ushbu navbatdan bitta protsessorda parallel ravishda bajarilishi mumkin bo'lgan ishlarning maksimal soni uchun javobgardir.
Navbatni quyidagi bayroqlar bilan yaratish mumkin:
  • WQ_HIGHPRI
  • WQ_UNBOUND
  • WQ_CPU_INTENSIVE
  • WQ_FREEZABLE
  • WQ_MEM_RECLAIM
Bayroqqa alohida e'tibor berilishi kerak WQ_UNBOUND. Ushbu bayroqning mavjudligiga qarab, navbatlar bog'langan va bog'lanmaganlarga bo'linadi.
Bog'langan navbatlarda Qo'shilganda, ishlar joriy protsessorga bog'lanadi, ya'ni bunday navbatlarda ishlar uni rejalashtiruvchi yadroda bajariladi. Shu nuqtai nazardan, bog'langan navbatlar topshiriqlarga o'xshaydi.
Biriktirilmagan navbatlarda ish har qanday yadroda bajarilishi mumkin.

Linux yadrosida ish navbatini amalga oshirishning muhim xususiyati - bog'langan navbatlarda mavjud bo'lgan parallel bajarishning qo'shimcha tashkil etilishi. Quyida batafsilroq yozilgan, ammo hozir aytamanki, u imkon qadar kamroq xotira ishlatadigan va protsessor bo'sh turmasligi uchun amalga oshiriladi. Bularning barchasi bitta ishda juda ko'p protsessor sikllaridan foydalanilmaydi degan taxmin bilan amalga oshiriladi.
Bu biriktirilmagan navbatlar uchun emas. Aslida, bunday navbatlar ishchilarga kontekstni taqdim etadi va ularni imkon qadar erta boshlaydi.
Shunday qilib, agar protsessor intensiv ish yuki kutilsa, biriktirilmagan navbatlardan foydalanish kerak, chunki bu holda rejalashtiruvchi bir nechta yadrolarda parallel bajarilishini nazorat qiladi.

Vazifalar bilan taqqoslaganda, ishlarga oddiy yoki yuqori bajarilish ustuvorligi berilishi mumkin. Ustuvorlik butun navbat uchun umumiydir. Odatiy bo'lib, navbat odatdagi ustuvorlikka ega va agar siz bayroqni o'rnatsangiz WQ_HIGHPRI, keyin, mos ravishda, yuqori.

Bayroq WQ_CPU_INTENSIVE faqat bog'langan navbatlar uchun mantiqiy. Ushbu bayroq parallel ijro etishni qo'shimcha tashkil etishda ishtirok etishdan bosh tortishdir. Ish protsessor vaqtini ko'p sarflashi kutilayotganda ushbu bayroqdan foydalanish kerak, bu holda mas'uliyatni rejalashtiruvchiga o'tkazish yaxshiroqdir. Bu quyida batafsilroq tavsiflanadi.

Bayroqlar WQ_FREEZABLE Va WQ_MEM_RECLAIM aniq va mavzu doirasidan tashqarida, shuning uchun biz ularga batafsil to'xtalib o'tirmaymiz.

Ba'zan o'z navbatlaringizni yaratish emas, balki umumiy navlardan foydalanish mantiqan to'g'ri keladi. Asosiylari:

  • system_wq - tez ishlash uchun bog'langan navbat
  • system_long_wq - bajarilishi uzoq vaqt talab qilinadigan ishlar uchun bog'langan navbat
  • system_unbound_wq - bog'lanmagan navbat

Ish va ularni rejalashtirish haqida

Endi ishlar bilan shug'ullanamiz. Birinchidan, ishga tushirish, deklaratsiya va tayyorlash makroslarini ko'rib chiqamiz:
DECLARE(_DELAYED)_WORK(nom, bekor (*funksiya)(struct work_struct *ish)); /* kompilyatsiya vaqtida */ INIT(_DELAYED)_WORK(_work, _func); /* bajarish paytida */ TAYYORLASH(_KECIKTIRIB)_ISH(_ish, _func); /* bajarilayotgan funksiyani o‘zgartirish uchun */
Ishlar quyidagi funktsiyalar yordamida navbatga qo'shiladi:
bool queue_work(struct workqueue_struct *wq, struct work_struct *ish); bool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, imzosiz uzoq kechikish); /* ish faqat kechikish muddati tugagandan keyingina navbatga qo'shiladi */
Bu haqida batafsilroq to'xtalib o'tishga arziydi. Garchi biz navbatni parametr sifatida belgilagan bo'lsak-da, aslida ishlar, tuyulishi mumkin bo'lganidek, ish navbatining o'zida emas, balki butunlay boshqa ob'ektda - ishchi_pool strukturasining navbat ro'yxatida joylashtiriladi. Tuzilishi ishchi_hovuz, aslida, ish navbati mexanizmini tashkil qilishda eng muhim ob'ektdir, garchi foydalanuvchi uchun u sahna ortida qolsa. Aynan ular bilan ishchilar ishlaydi va ularda barcha asosiy ma'lumotlar mavjud.

Keling, tizimda qanday hovuzlar borligini ko'rib chiqaylik.
Boshlash uchun, bog'langan navbatlar uchun hovuzlar (rasmda). Har bir protsessor uchun ikkita ishchi hovuzi statik ravishda ajratilgan: biri yuqori ustuvorlikdagi ishlar uchun, ikkinchisi normal ustuvorlik bilan ishlash uchun. Ya'ni, agar bizda to'rtta yadro bo'lsa, unda ish navbati istalgancha bo'lishi mumkinligiga qaramay, faqat sakkizta biriktirilgan hovuz bo'ladi.
Ish navbatini yaratganimizda, u har bir protsessor uchun ajratilgan xizmatga ega pool_workqueue(pwq). Har bir bunday pool_workqueue bir xil protsessorda ajratilgan va navbat turiga ustuvorlik bilan mos keladigan ishchilar puli bilan bog'langan. Ular orqali ish navbati ishchilar hovuzi bilan o'zaro ta'sir qiladi.
Ishchilar dastlab qaysi ish navbatiga tegishli ekanligini ajratmasdan, ishchilar hovuzidan ishni beg'araz bajaradilar.

Biriktirilmagan navbatlar uchun ishchi hovuzlari dinamik ravishda ajratiladi. Barcha navbatlarni o'z parametrlariga ko'ra ekvivalentlik sinflariga bo'lish mumkin va har bir bunday sinf uchun o'z ishchilar puli yaratiladi. Ularga maxsus xesh-jadval yordamida kirish mumkin, bu erda kalit parametrlar to'plamidir va qiymat mos ravishda ishchilar hovuzidir.
Aslida, bog'lanmagan navbatlar uchun hamma narsa biroz murakkabroq: agar bog'langan navbatlar uchun pwq va navbatlar har bir CPU uchun yaratilgan bo'lsa, bu erda ular har bir NUMA tugun uchun yaratilgan, ammo bu biz batafsil ko'rib chiqmaydigan qo'shimcha optimallashtirish.

Har xil kichik narsalar

Rasmni to'ldirish uchun men API-dan bir nechta funktsiyalarni ham beraman, lekin ular haqida batafsil gapirmayman:
/* Majburiy bajarish */ bool flush_work(struct work_struct *ish); bool flush_kechiktirilgan_ish(tuzilma kechiktirilgan_ish *dwork); /* Ishning bajarilishini bekor qilish */ bool cancel_work_sync(struct work_struct *ish); bool bekor qilish_kechiktirilgan_ish(tuzilma kechiktirilgan_ish *dwork); bool cancel_delayed_work_sync(tuzilma kechiktirilgan_ish *dwork); /* Navbatni o'chirish */ yo'q qilish_ishchi navbati(struct workqueue_struct *wq);

Ishchilar o'z ishlarini qanday bajarishadi

Endi biz API bilan tanishganimizdan so'ng, keling, uning qanday ishlashi va boshqarilishini batafsilroq tushunishga harakat qilaylik.
Har bir hovuzda vazifalarni bajaradigan ishchilar to'plami mavjud. Bundan tashqari, ishchilar soni mavjud vaziyatga moslashib, dinamik ravishda o'zgaradi.
Biz allaqachon bilib olganimizdek, ishchilar yadro kontekstida ishni bajaradigan iplardir. Ishchi ularni ketma-ket, u bilan bog'langan ishchilar hovuzidan oladi va ishchilar, biz allaqachon bilganimizdek, turli manba navbatlariga tegishli bo'lishi mumkin.

Ishchilar shartli ravishda uchta mantiqiy holatda bo'lishi mumkin: ular bo'sh, ishlaydigan yoki boshqaruvchi bo'lishi mumkin.
Ishchi mumkin bo'sh turish va hech narsa qilmang. Bu, masalan, barcha ishlar allaqachon bajarilayotganda. Ishchi bu holatga kirganda, u uyquga ketadi va shunga ko'ra, uyg'onmaguncha ijro etmaydi;
Agar hovuzni boshqarish talab qilinmasa va rejalashtirilgan ishlar ro'yxati bo'sh bo'lmasa, ishchi ularni bajarishni boshlaydi. Biz shartli ravishda bunday ishchilarni chaqiramiz yugurish.
Agar kerak bo'lsa, ishchi rolni o'z zimmasiga oladi menejer basseyn. Hovuzda faqat bitta boshqaruvchi bo'lishi mumkin yoki umuman ishchi bo'lmasligi mumkin. Uning vazifasi har bir hovuz uchun optimal ishchi sonini saqlab qolishdir. U buni qanday qiladi? Birinchidan, uzoq vaqt davomida ishlamay qolgan ishchilar o'chiriladi. Ikkinchidan, bir vaqtning o'zida uchta shart bajarilsa, yangi ishchilar yaratiladi:

  • hali bajarilishi kerak bo'lgan vazifalar bor (hovuzda ishlaydi)
  • bo'sh ishchilar yo'q
  • ishlaydigan ishchilar yo'q (ya'ni faol va uxlamagan)
Biroq, oxirgi shart o'z nuancelariga ega. Agar hovuz navbatlari biriktirilmagan bo'lsa, unda ishlaydigan ishchilar hisobga olinmaydi, ular uchun bu shart har doim to'g'ri. Xuddi shu narsa bog'langan vazifani bajarayotgan ishchi uchun ham amal qiladi, lekin bayroq bilan WQ_CPU_INTENSIVE, navbatlar. Bundan tashqari, navbatlar bog'langan bo'lsa, ishchilar umumiy hovuzdagi ishlar bilan ishlaganligi sababli (yuqoridagi rasmdagi har bir yadro uchun ikkitadan biri), ularning ba'zilari ishlayotgan deb hisoblanadi, ba'zilari esa yo'q. Bundan tashqari, ishni bajarishdan kelib chiqadi WQ_CPU_INTENSIVE navbatlar darhol boshlanmasligi mumkin, lekin ular o'zlari boshqa ishlarning bajarilishiga xalaqit bermaydilar. Endi bu bayroq nima uchun shunday deb nomlangani va ishning tugashi uchun uzoq vaqt kerak bo'lganda nima uchun qo'llanilishi aniq bo'lishi kerak.

Ishlaydigan ishchilarni hisobga olish to'g'ridan-to'g'ri asosiy Linux yadrosi rejalashtiruvchisidan amalga oshiriladi. Ushbu nazorat mexanizmi ish navbatining juda ko'p ishchilarni yaratishiga yo'l qo'ymaslik uchun optimal parallellik darajasini ta'minlaydi, lekin ishni juda uzoq vaqt davomida keraksiz kutishiga olib kelmaydi.

Qiziqqanlar yadrodagi ishchi funksiyasiga qarashlari mumkin, u worker_thread() deb ataladi.

Ta'riflangan barcha funktsiyalar va tuzilmalarni fayllarda batafsilroq topish mumkin include/linux/workqueue.h, kernel/workqueue.c Va yadro/workqueue_internal.h. Ish navbati bo'yicha hujjatlar ham mavjud Documentation/workqueue.txt.

Shuni ham ta'kidlash kerakki, ish navbati mexanizmi yadroda nafaqat kechiktirilgan uzilishlarni qayta ishlash uchun ishlatiladi (garchi bu juda keng tarqalgan stsenariy bo'lsa ham).

Shunday qilib, biz Linux yadrosida kechiktirilgan uzilishlarni qayta ishlash mexanizmlarini ko'rib chiqdik - ko'p vazifalarni bajarishning maxsus shakli bo'lgan vazifa va ish navbati. Siz uzilishlar, topshiriqlar va ish navbatlari haqida Jonatan Korbet, Greg Kroah-Xartman, Alessandro Rubinining "Linux qurilma drayverlari" kitobida o'qishingiz mumkin, garchi u erdagi ma'lumotlar ba'zan eskirgan bo'lsa ham.

3-son LABORATORIYA ISHI

KO'P MAZQALI DASTURLASHLINUX

1. Ishning maqsadi: Gcc kompilyatori, dasturlarni tuzatish usullari va jarayonlar bilan ishlash funktsiyalari bilan tanishing.

2. Qisqacha nazariy ma'lumotlar.

Gcc kompilyatorlarining minimal to'plami quyidagilardan iborat: - Wall (barcha xatolar va ogohlantirishlarni ko'rsatish) va - o (chiqish fayli):

gcc - Wall - yoki print_pid print_pid. c

Buyruq bajariladigan print_pid faylini yaratadi.

C standart kutubxonasi (libc, Linuxda glibc da joriy qilingan) Unix System V (keyingi o'rinlarda SysV) ning ko'p vazifali imkoniyatlaridan foydalanadi. Libc-da pid_t turi pidni o'z ichiga olishi mumkin bo'lgan butun son sifatida aniqlanadi. Joriy jarayonning pidi haqida xabar beruvchi funksiya pid_t getpid(void) prototipiga ega va unistd da pid_t bilan birga aniqlanadi. h va sys/turlari. h).

Yangi jarayon yaratish uchun fork funksiyasidan foydalaning:

pid_t vilka (bo'sh)

Uyqu va rand funksiyalaridan foydalanib, tasodifiy uzunlikdagi kechikishni kiritish orqali siz ko'p vazifalarni bajarish effektini aniqroq ko'rishingiz mumkin:

bu dasturni tasodifiy soniyalar soniga "uxlashga" olib keladi: 0 dan 3 gacha.

Funktsiyani asosiy jarayon sifatida chaqirish uchun uni tarmoqlangandan keyin chaqirish kifoya:

// agar bola jarayoni ishlayotgan bo'lsa, funktsiyani chaqiring

pid=jarayon(arg);

// jarayondan chiqish

Ko'pincha bola jarayoni sifatida boshqa dasturni ishga tushirish kerak. Buning uchun exec oilasi funktsiyalaridan foydalaning:

// agar bola jarayoni ishlayotgan bo'lsa, dasturni chaqiring


agar (execl("./file", "fayl", arg, NULL)<0) {

printf("Jarayonni boshlashda XATO\n");

else printf("jarayon boshlandi (pid=%d)\n", pid);

// jarayondan chiqish

Ko'pincha, ota-ona jarayoni kerakli vaqtda operatsiyalarni bajarish uchun o'z farzandlari bilan ma'lumot almashishi yoki hech bo'lmaganda ular bilan sinxronlashtirishi kerak. Jarayonlarni sinxronlashtirishning bir usuli bu wait va waitpid funktsiyalari:

#o'z ichiga oladi

#o'z ichiga oladi

pid_t wait(int *status) - joriy jarayonning har qanday bola jarayonlari tugamaguncha bajarilishini to'xtatib turadi.

pid_t waitpid (pid_t pid, int *status, int options) - ko'rsatilgan jarayon tugaguniga qadar joriy jarayonning bajarilishini to'xtatib turadi yoki ko'rsatilgan jarayonning bajarilishini tekshiradi.

Agar siz bola jarayoni tugagandan so'ng uning holatini va uning qaytariladigan qiymatini bilishingiz kerak bo'lsa, u holda WEXITSTATUS makrosidan foydalaning, unga bola jarayonining holatini parametr sifatida o'tkazing.

status=waitpid(pid,&status, WNOHANG);

agar (pid == holati) (

printf("PID: %d, Natija = %d\n", pid, WEXITSTATUS(holat)); )

Tugallangan jarayonlarning ustuvorliklarini o'zgartirish uchun belgilangan ustuvorlik va funktsiyalardan foydalaniladi. Ustuvorliklar -20 (eng yuqori) dan 20 (eng past) oralig'ida o'rnatiladi, normal qiymat 0. E'tibor bering, faqat superfoydalanuvchi ustuvorlikni me'yordan oshirishi mumkin!

#o'z ichiga oladi

#o'z ichiga oladi

int jarayoni (int i) (

setpriority(PRIO_PROCESS, getpid(),i);

printf("Process%d ThreadID: %d prioritet %d\n bilan ishlaydi",i, getpid(),getpriority(PRIO_PROCESS, getpid()));

qaytish(getpriority(PRIO_PROCESS, getpid()));

Jarayonni o'ldirish uchun o'ldirish funktsiyasidan foydalaning:

#o'z ichiga oladi

#o'z ichiga oladi

int kill(pid_t pid, int sig);

Agar pid > 0 bo'lsa, u signal yuboriladigan jarayonning PID ni belgilaydi. Agar pid = 0 bo'lsa, u holda signal joriy jarayon tegishli bo'lgan guruhning barcha jarayonlariga yuboriladi.

sig - signal turi. Linuxda signallarning ba'zi turlari:

SIGKILL Bu signal jarayonning darhol tugatilishiga olib keladi. Jarayon bu signalni e'tiborsiz qoldirolmaydi.

SIGTERM Bu signal jarayonni tugatish talabidir.

SIGCHLD Tizim ushbu signalni o'zining asosiy jarayonlaridan biri tugashi bilan jarayonga yuboradi. Misol:

agar (pid[i] == holati) (

printf("ThreadID: %d tugallandi %d\n holati", pid[i], WEXITSTATUS(holat));

else kill(pid[i],SIGKILL);

3. Metodik ko'rsatmalar.

3.1. Gcc kompilyator imkoniyatlari va C tili funksiyalarining tavsiflari bilan tanishish uchun man va info ko'rsatmalaridan foydalaning.

3.2. Dasturlarni disk raskadrovka qilish uchun Midnight Commander (MC) fayl menejerining o'rnatilgan muharriridan foydalanish qulay bo'lib, u turli til konstruksiyalarini rangda ajratib ko'rsatadi va kursorning fayldagi (qator, ustun) yuqori qatordagi o'rnini ko'rsatadi. ekranning.

3.3. Midnight Commander fayl menejerida klaviatura yorlig'i orqali chaqirilishi mumkin bo'lgan buyruq buferi mavjud - H, kursor strelkalari (yuqoriga va pastga) yordamida siljitish mumkin. Buferdan buyruq satriga buyruq kiritish uchun kalitdan foydalaning , buferdan buyruqni tahrirlash uchun - tugmalar<- и ->, Va .


3.4. Joriy katalog yo'lda mavjud emasligini unutmang, shuning uchun buyruq qatori dasturni "./print_pid" sifatida ishga tushirishingiz kerak. MC-da kursorni fayl ustiga olib boring va ustiga bosing .

3.5. Dasturning bajarilishi natijasini ko'rish uchun klaviatura yorliqlaridan foydalaning - O. Ular fayllarni tahrirlash rejimida ham ishlaydi.

3.6. Dasturni bajarish natijalarini jurnalga kiritish uchun chiqishni konsoldan faylga qayta yo'naltirishni qo'llash tavsiya etiladi: ./test > natija. Xabar

3.7. Yaratilgan fayllarga kirish uchun Linux serveri, ftp protokolidan foydalaning, mijoz dasturi Windows 2000 da mavjud va ichiga o'rnatilgan fayl menejeri FAR. Qayerda qayd yozuvi va parol ssh orqali ulanish bilan bir xil.

4.1. Gcc kompilyatorining imkoniyatlari va dasturlarni disk raskadrovka qilish usullari bilan tanishing.

4.2. 1-sonli laboratoriya ishi topshiriqlarining variantlari uchun yaratilgan jarayonni amalga oshiradigan dasturni yozing va disk raskadrovka qiling.

4.3. dan vazifa variantlari uchun laboratoriya ishi 1-sonli dasturni yozing va disk raskadrovka qiladi, u ota-ona jarayonini amalga oshiradi, u bolalar jarayonlari - dasturlarning holatini chaqiradi va nazorat qiladi (variantga qarab ularni tugatish yoki yo'q qilishni kutish).

4.4. 1-sonli laboratoriya ishi topshiriqlarining variantlari uchun bolalar jarayonlari holatini (variantga qarab ularning tugashini kutish yoki yo'q qilish) chaqiruvchi va nazorat qiluvchi ota-ona jarayonini amalga oshiradigan dasturni yozing va disk raskadrovka qiling.

5. Vazifalar uchun variantlar. 1-sonli laboratoriya ishidan topshiriqlar variantlariga qarang

6. Hisobotning mazmuni.

6.1. Ishning maqsadi.

6.2. Vazifa opsiyasi.

6.3. Dastur ro'yxati.

6.4. Dasturni bajarish protokollari.

7. Nazorat savollari.

7.1. Linuxda C dasturlarini kompilyatsiya qilish va ishga tushirish xususiyatlari.

7.2. Pid nima, uni operatsion tizim va dasturda qanday aniqlash mumkin?

7.3. Fork funktsiyasi - maqsad, qo'llanilishi, qaytariladigan qiymat.

7.4. Yaratilgan jarayonda funktsiyani qanday ishlatish kerak? Dastur?

7.5. Ota-onalar va bolalar jarayonlarini sinxronlashtirish usullari.

7.6. Tugallangan jarayon tugashi va u qaytaradigan qiymatini qanday aniqlash mumkin?

7.7. Jarayon ustuvorliklarini qanday boshqarish kerak?

7.8. Operatsion tizim va dasturda jarayonni qanday o'ldirish mumkin?

Shellingizda quyidagi buyruqni kiriting:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Tizimda ishlaydigan barcha jarayonlar ro'yxati ekranda ko'rsatiladi. Agar siz jarayonlar sonini hisoblamoqchi bo'lsangiz, shunday yozing:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

$ ps -e --no-headers | nl | quyruq -n 1

74 4650 pts/0 00:00:00 dumi

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Birinchi raqam - tizimda ishlaydigan jarayonlar soni. KDE foydalanuvchilari kpm dasturidan, Gnome foydalanuvchilari esa jarayonlar haqida ma'lumot olish uchun gnome-tizim-monitor dasturidan foydalanishlari mumkin. Linux foydalanuvchiga xuddi shu narsani qilishiga imkon beradigan narsa turli yo'llar bilan.

Savol tug'iladi: "jarayon nima?" Linuxdagi jarayonlar, xuddi fayllar kabi, aksiomatik tushunchalardir. Ba'zan jarayon bilan aniqlanadi ishlaydigan dastur ammo, bu har doim ham shunday emas. Faraz qilaylik, jarayon nimadir bajaradigan tizimning ishchi birligidir. Ko'p vazifalilik - bir tizimda bir vaqtning o'zida bir nechta jarayonlarning birgalikda mavjud bo'lish qobiliyati.

Linux ko'p vazifali operatsion tizimdir. Demak, undagi jarayonlar bir vaqtda ishlaydi. Tabiiyki, bu shartli formuladir. Linux yadrosi jarayonlarni doimiy ravishda almashtiradi, ya'ni vaqti-vaqti bilan ularning har biriga protsessor vaqtini beradi. Kommutatsiya juda tez sodir bo'ladi, shuning uchun bizga jarayonlar bir vaqtning o'zida ishlayotgandek tuyuladi.

Ba'zi jarayonlar daraxt tuzilishini tashkil etuvchi boshqa jarayonlarni keltirib chiqarishi mumkin. Ishlab chiqarish jarayonlari ota-onalar yoki ota-ona jarayonlari, bolalar esa bolalar yoki bolalar jarayonlari deb ataladi. Ushbu "daraxt" ning yuqori qismida tizimni yuklash jarayonida yadro tomonidan avtomatik ravishda paydo bo'ladigan init jarayoni joylashgan.

Tizimdagi har bir jarayon manfiy bo'lmagan butun sonlar juftligi bilan bog'langan: jarayon identifikatori PID (Process identifikatori) va asosiy jarayon identifikatori PPID (Ota-ona jarayon identifikatori). Har bir jarayon uchun PID noyobdir (vaqtning ma'lum bir nuqtasida) va PPID asosiy jarayonning identifikatoriga teng. Agar siz qobiqqa ps -ef buyrug'ini kiritsangiz, ularning PID va PPID qiymatlari (mos ravishda ikkinchi va uchinchi ustunlar) bo'lgan jarayonlar ro'yxati ko'rsatiladi. Ushbu buyruqning namunasi:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

UID PID PPID C STIME TTY TIME CMD

ildiz 1 0 0 17:08? 00:00:00 /sbin/init

ildiz 2 0 0 17:08? 00:00:00

ildiz 3 2 0 17:08? 00:00:00

ildiz 4 2 0 17:08? 00:00:00

ildiz 5 2 0 17:08? 00:00:00

ildiz 6 2 0 17:08? 00:00:00

ildiz 7 2 0 17:08? 00:00:00

ildiz 8 2 0 17:08? 00:00:00

ildiz 9 2 0 17:08? 00:00:00

ildiz 10 2 0 17:08? 00:00:00

ildiz 11 2 0 17:08? 00:00:00

ildiz 12 2 0 17:08? 00:00:00

ildiz 13 2 0 17:08? 00:00:00

ildiz 14 2 0 17:08? 00:00:00

ildiz 15 2 0 17:08? 00:00:00

ildiz 16 2 0 17:08? 00:00:00

ildiz 17 2 0 17:08? 00:00:00

ildiz 18 2 0 17:08? 00:00:00

ildiz 19 2 0 17:08? 00:00:00

df00 16389 16387 0 20:10 pts/1 00:00:00 /bin/bash

df00 17446 2538 0 20:26? 00:00:00

df00 18544 2932 0 20:41 pts/2 00:00:00 /bin/bash -l

df00 19010 18544 0 20:48 pts/2 00:00:00 ps -ef

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Shuni ta'kidlash kerakki, init jarayoni har doim 1 identifikatoriga va PPID 0 ga ega. Garchi haqiqatda 0 identifikatorli jarayon mavjud emas. Jarayon daraxtini ps dasturining --forest varianti yordamida ham ko'rish mumkin:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

2? 00:00:00 mavzu

3 ?00:00:00 \_ migratsiya/0

4 ?00:00:00 \_ ksoftirqd/0

5 ?00:00:00 \_ watchdog/0

6 ?00:00:00 \_ migratsiya/1

7 ?00:00:00 \_ ksoftirqd/1

8 ?00:00:00 \_ qo'riqchi/1

9 ?00:00:00 \_ voqealar/0

10 ?00:00:00 \_ voqealar/1

11 ?00:00:00 \_ cpuset

12 ?00:00:00 \_ xelper

13 ?00:00:00 \_netns

14 ?00:00:00 \_ async/mgr

15 ?00:00:00 \_ kintegrityd/0

16 ?00:00:00 \_ kintegrityd/1

18544 pts/2 00:00:00 \_ bash

16388 ?00:00:00 \_ gnome-pty-helpe

16389 pts/1 00:00:00 \_ bash

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Agar siz ps dasturini argumentlarsiz chaqirsangiz, joriy guruhga tegishli jarayonlar ro'yxati ko'rsatiladi, ya'ni joriy terminal ostida ishlaydi.

getpid() va getppid() dan foydalanish

Jarayon getpid() va getppid() tizim qo'ng'iroqlari yordamida o'zining PID va asosiy PPID ni bilib olishi mumkin.

getpid() va getppid() tizim chaqiruvlari quyidagi prototiplarga ega:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

pid_t getpid(bo'sh);

pid_t getppid(void);

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Getpid() va getppid() dan foydalanish uchun unistd.h va sys/types.h sarlavha fayllari (pid_t turi uchun) #include direktivasi yordamida dasturga kiritilishi kerak. getpid() chaqiruvi joriy jarayon identifikatorini (PID) qaytaradi va getppid() ota-ona identifikatorini (PPID) qaytaradi. pid_t - o'lchami muayyan tizimga bog'liq bo'lgan butun son turi. Ushbu turdagi qiymatlar int tipidagi oddiy butun sonlar sifatida ishlatilishi mumkin.

Keling, endi ko'rib chiqaylik oddiy dastur, bu PID va PPIDni ko'rsatadi va keyin foydalanuvchi bosguncha muzlaydi .

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

#o'z ichiga oladi

#o'z ichiga oladi

#o'z ichiga oladi

pid_t pid, ppid;

pid = getpid();

ppid = getppid();

printf("PID: %d\n", pid);

printf("PPID: %d\n", ppid);

fprintf(stderr, "Press chiqish uchun...");

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Endi ushbu dastur qanday ishlashini tekshiramiz. Buning uchun uni kompilyatsiya qilamiz va ishga tushiramiz:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

$ gcc -o getpid getpid.c

bosing chiqish uchun...

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Endi, bosmasdan , boshqa terminal oynasini oching va getpid() va getppid() tizim chaqiruvlari to'g'ri ishlashini tekshiring:

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

$ ps -ef | grep getpid

df00 19724 19702 0 20:58 pts/3 00:00:00 ./asosiy

df00 19856 18544 0 21:00 pts/2 00:00:00 grep --colour=avtomatik asosiy

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−



 


O'qing:



Yozilgan dasturlash tili Tur yoki format spetsifikatorlari yoki konversiya belgilari yoki boshqaruv belgilari

Yozilgan dasturlash tili Tur yoki format spetsifikatorlari yoki konversiya belgilari yoki boshqaruv belgilari

C++ dasturlash tili Oxirgi yangilangan: 28/08/2017 C++ dasturlash tili yuqori darajadagi kompilyatsiya...

Yangi yil bayramlarida rus pochtasi ish jadvali Yangi yil bayramlarida pochta ishi

Yangi yil bayramlarida rus pochtasi ish jadvali Yangi yil bayramlarida pochta ishi

21-asrda rus pochtasi nafaqat xatlar va posilkalarni olishga yordam beradigan universal muassasaga aylandi. Kommunal to'lovlar, pensiyalar,...

Tass: qisqartmalarni dekodlash

Tass: qisqartmalarni dekodlash

Bu atama italyancha abbreviatura va lotincha brevis - qisqacha so'zlardan keladi. Qadimgi kitoblar va qo'lyozmalarda bu qisqartirilgan ...

Sertifikat shablonlari bo'sh yuklab olish Faxriy yorliq shablonini chop etish uchun

Sertifikat shablonlari bo'sh yuklab olish Faxriy yorliq shablonini chop etish uchun

Assalomu alaykum, aziz o'quvchi! Bugun men sizga Word-da qanday qilib xat yozishni aytaman. Mening ishimda men juda ko'p sonli yozishim kerak edi ...

tasma tasviri RSS