{"id":32158,"date":"2019-10-31T21:45:27","date_gmt":"2019-10-31T18:45:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\/"},"modified":"2019-10-31T21:45:27","modified_gmt":"2019-10-31T18:45:27","slug":"operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introduzione ai sistemi operativi<\/h1>\n<p>\nCiao, Habr! Vorrei presentarvi una serie di articoli di traduzione su una letteratura che trovo interessante \u2014 OSTEP. In questo materiale vengono esaminati in profondit\u00e0 i funzionamenti dei sistemi operativi Unix-like, in particolare \u2014 il lavoro con i processi, diversi scheduler, memoria e altri componenti simili che costituiscono un moderno sistema operativo. Potete vedere l'originale di tutti i materiali qui <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">qui<\/a><\/noindex>. Si prega di considerare che la traduzione \u00e8 stata eseguita non professionalmente (abbastanza liberamente), ma spero di aver mantenuto il significato generale.<\/p>\n<p>I lavori di laboratorio su questo argomento possono essere trovati qui:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">originale<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">originale<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">la mia adattazione personale<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAltre parti:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Parte 1: Intro<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Parte 2: Astrazione: processo<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Parte 3: Introduzione all'API dei processi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Parte 4: Introduzione allo scheduler<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nE potete anche dare un'occhiata al mio canale su <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">telegram<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Introduzione al pianificatore<\/h2>\n<p>\n<u>Il cuore del problema: Come sviluppare la politica del pianificatore<br \/>\nCome dovrebbero essere sviluppati i framework di base delle politiche del pianificatore? Quali dovrebbero essere le assunzioni chiave? Quali metriche sono importanti? Quali tecniche di base sono state utilizzate nei primi sistemi di calcolo?<\/u><\/p>\n<h3>Assunzioni sul carico di lavoro<\/h3>\n<p>\n Prima di discutere le possibili politiche, iniziamo con alcune semplificazioni sui processi avviati nel sistema, che sono complessivamente chiamati <b>carico di lavoro<\/b>. Definire il carico di lavoro come una parte critica della creazione delle politiche e pi\u00f9 conosci il carico, migliore sar\u00e0 la politica che riuscirai a scrivere.<\/p>\n<p>Faremo le seguenti assunzioni sui processi avviati nel sistema, a volte chiamati <b>jobs<\/b> (task). Quasi tutte queste assunzioni non sono realistiche, ma sono necessarie per sviluppare il pensiero.<\/p>\n<ol>\n<li> Ogni task \u00e8 in esecuzione per lo stesso intervallo di tempo,<\/li>\n<li> Tutti i task sono avviati contemporaneamente,<\/li>\n<li> Il task avviato continua fino al completamento,<\/li>\n<li> Tutti i task utilizzano solo la CPU,<\/li>\n<li> Il tempo di esecuzione di ogni task \u00e8 noto.<\/li>\n<\/ol>\n<h3>Metriche del pianificatore<\/h3>\n<p>\n Oltre ad alcune assunzioni sul carico, \u00e8 necessario anche uno strumento di confronto per le varie politiche di pianificazione: le metriche del pianificatore. Una metrica \u00e8 semplicemente una misura di qualcosa. Ci sono diverse metriche che possono essere utilizzate per confrontare i pianificatori.<\/p>\n<p>Come esempio utilizzeremo la metrica chiamata <b>tempo di turnaround<\/b> (turnaround time). Il tempo di turnaround di un task viene definito come la differenza tra il tempo di completamento del task e il tempo di arrivo del task nel sistema.<\/p>\n<p><u>Tturnaround=Tcompletion\u2212Tarrival<\/u><\/p>\n<p>Poich\u00e9 abbiamo assunto che tutti i task siano arrivati nello stesso momento, allora Ta=0 e quindi Tt=Tc. Questo valore cambier\u00e0 naturalmente quando modificheremo le assunzioni sopra menzionate.<\/p>\n<p>Un'altra metrica \u00e8 <b>fairness<\/b> (equit\u00e0). Prestazioni e equit\u00e0 sono spesso caratteristiche contrapposte nella pianificazione. Ad esempio, un pianificatore pu\u00f2 ottimizzare le prestazioni, ma a scapito del tempo di attesa di altri task, riducendo cos\u00ec l'equit\u00e0.<\/p>\n<h3>FIRST IN FIRST OUT (FIFO)<\/h3>\n<p>\n L'algoritmo pi\u00f9 semplice che possiamo implementare si chiama FIFO o <b>first come (in), first served (out)<\/b>. Questo algoritmo ha diversi vantaggi: \u00e8 molto semplice da implementare e si adatta a tutte le nostre ipotesi, svolgendo il compito piuttosto bene.<\/p>\n<p>Consideriamo un semplice esempio. Supponiamo che 3 task siano stati assegnati contemporaneamente. Ma supponiamo che il task A sia arrivato un po' prima degli altri, quindi nella lista di esecuzione apparir\u00e0 prima degli altri, proprio come B rispetto a V. Supponiamo che ognuno di essi venga eseguito per 10 secondi. Quale sar\u00e0 quindi il tempo medio di esecuzione di questi task?<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCalcolando i valori \u2014 10+20+30 e dividendo per 3, otteniamo un tempo medio di esecuzione del programma pari a 20 secondi.<br \/>\n Ora proviamo a modificare le nostre ipotesi. In particolare, l'ipotesi 1 e in questo modo non supponiamo pi\u00f9 che ogni task richieda lo stesso tempo di esecuzione. Come si comporter\u00e0 FIFO questa volta?<\/p>\n<p>Come si pu\u00f2 vedere, tempi di esecuzione differenti dei task influenzano negativamente la produttivit\u00e0 dell'algoritmo FIFO. Supponiamo che il task A venga eseguito per 100 secondi, mentre B e V continuano a richiedere 10 secondi ciascuno.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n Come si pu\u00f2 vedere dall'immagine, il tempo medio per il sistema sar\u00e0 (100+110+120)\/3=110. Questo effetto \u00e8 chiamato <b>effetto convoglio<\/b>, quando alcuni consumatori a breve termine di una risorsa si trovano in coda dietro a un consumatore pesante. \u00c8 simile a una fila al supermercato, quando davanti a te c'\u00e8 un cliente con un carrello pieno. La soluzione migliore al problema \u00e8 cercare di cambiare cassa o rilassarsi e respirare profondamente.<\/p>\n<h3>Shortest Job First<\/h3>\n<p>\n C'\u00e8 un modo per risolvere situazioni simili con processi pesanti? Certo. Un altro tipo di pianificazione si chiama<b>Shortest Job First<\/b> (SJF). Il suo algoritmo \u00e8 anch'esso piuttosto primitivo \u2014 come suggerisce il nome, le prime a essere eseguite saranno le task pi\u00f9 brevi, una dopo l'altra.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn questo esempio, il risultato dell'esecuzione degli stessi processi sar\u00e0 un miglioramento del tempo medio di turnaround dei programmi e sar\u00e0 pari a <b>50 invece di 110<\/b>, il che \u00e8 praticamente il doppio migliore.<\/p>\n<p>Pertanto, dato il presupposto che tutti i compiti arrivino contemporaneamente, l'algoritmo SJF sembra essere l'algoritmo pi\u00f9 ottimale. Tuttavia, le nostre assunzioni non sembrano ancora realistiche. Questa volta cambiamo l'assunzione 2 e consideriamo che i compiti possano arrivare in qualsiasi momento, e non tutti insieme. A quali problemi potrebbe portare questo?<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nImmaginiamo che il compito A (100s) arrivi per primo e inizi ad essere eseguito. Al momento t=10 arrivano i compiti B e C, ognuno dei quali richieder\u00e0 10 secondi. Pertanto, il tempo medio di esecuzione \u00e8 (100+(110-10)+(120-10))3 = 103. Che cosa potrebbe fare il pianificatore per migliorare la situazione?<\/p>\n<h3>Shortest Time-to-Completion First (STCF)<\/h3>\n<p>\n Per migliorare la situazione, ignoreremo l'assunzione 3 che afferma che il programma viene avviato e funziona fino al completamento. Inoltre, avremo bisogno del supporto dell'hardware e, come potreste immaginare, utilizzeremo <b>un timer<\/b> per interrompere il compito in esecuzione e <b>eseguire il cambio di contesto<\/b>. In questo modo, il pianificatore pu\u00f2 intervenire al momento dell'arrivo dei compiti B e C \u2014 interrompere l'esecuzione del compito A e avviare l'elaborazione dei compiti B e C e, al termine di questi, riprendere l'esecuzione del processo A. Questo tipo di pianificatore \u00e8 chiamato <b>STCF<\/b>o <b>Preemptive Job First<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl risultato di questo pianificatore sar\u00e0 il seguente: ((120-0)+(20-10)+(30-10)) \/ 3 = 50. Di conseguenza, questo pianificatore diventa ancora pi\u00f9 ottimale per i nostri compiti.<\/p>\n<h3>Metrica Tempo di Risposta (Response Time)<\/h3>\n<p>\n Pertanto, se conosciamo i tempi di esecuzione dei compiti e che questi compiti utilizzano solo la CPU, lo STCF sar\u00e0 la soluzione migliore. In passato, questi algoritmi funzionavano e piuttosto bene. Tuttavia, ora l'utente trascorre la maggior parte del tempo al terminale e si aspetta un'interazione interattiva produttiva. Cos\u00ec \u00e8 nata una nuova metrica \u2014 <b>tempo di risposta<\/b> (response).<\/p>\n<p>Il tempo di risposta viene calcolato come segue:<\/p>\n<p><u>Tresponse = Tfirstrun \u2212 Tarrival<\/u><\/p>\n<p>Pertanto, per l'esempio precedente, il tempo di risposta sar\u00e0 il seguente: A=0, B=0, C=10 (abg=3,33).<\/p>\n<p>E si scopre che l'algoritmo STCF non \u00e8 poi cos\u00ec buono in situazioni in cui 3 compiti arrivano contemporaneamente: deve aspettare che i compiti pi\u00f9 piccoli siano completamente completati. Cos\u00ec, l'algoritmo \u00e8 buono per la metrica del tempo di turnaround, ma scarso per la metrica dell'interattivit\u00e0. Immaginate di essere seduti a un terminale e di dover aspettare pi\u00f9 di 10 secondi per digitare simboli in un editor, perch\u00e9 un'altra attivit\u00e0 occupa il processore. Non \u00e8 affatto piacevole.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPertanto, ci troviamo di fronte a un altro problema: come possiamo costruire uno scheduler che sia sensibile ai tempi di risposta?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n Per risolvere questo problema \u00e8 stato sviluppato l'algoritmo <b>Round Robin<\/b> (RR). L'idea principale \u00e8 piuttosto semplice: invece di eseguire i compiti fino al completamento, eseguiremo un compito per un intervallo di tempo (chiamato quantum di tempo) e poi passeremo a un altro compito in coda. L'algoritmo ripete il suo lavoro fino a quando tutti i compiti non sono completati. Di conseguenza, il tempo di esecuzione del programma deve essere multiplo del tempo dopo il quale il timer interromper\u00e0 il processo. Ad esempio, se il timer interrompe il processo ogni x=10ms, la dimensione della finestra di esecuzione del processo deve essere un multiplo di 10 e pu\u00f2 essere 10, 20 o x*10.<\/p>\n<p>Consideriamo un esempio: i compiti A, B e C arrivano contemporaneamente nel sistema e ciascuno di essi desidera lavorare per 5 secondi. L'algoritmo SJF eseguir\u00e0 ciascun compito fino alla fine, prima di avviare un altro. Al contrario, l'algoritmo RR con una finestra di esecuzione di 1s eseguir\u00e0 i compiti nel seguente modo (fig. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF Again (Bad for Response Time)<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (Good For Response Time)<\/p>\n<p>Il tempo medio di risposta per l'algoritmo RR (0+1+2)\/3=1, mentre per SJF (0+5+10)\/3=5.<\/p>\n<p>\u00c8 logico supporre che la finestra di tempo sia un parametro molto importante per il RR; minore \u00e8, maggiore sar\u00e0 il tempo di risposta. Tuttavia, non si pu\u00f2 renderla eccessivamente piccola, poich\u00e9 il tempo di commutazione del contesto giocher\u00e0 anch'esso un ruolo nelle prestazioni complessive. Pertanto, la selezione del tempo di finestra di esecuzione \u00e8 determinata dall'architetto del sistema operativo e dipende dai compiti che si prevede di eseguire. La commutazione del contesto non \u00e8 l'unica operazione di servizio che richiede tempo; un programma in esecuzione deve gestire anche altre cose, come vari cache, e a ogni commutazione \u00e8 necessario salvare e ripristinare questo ambiente, il che pu\u00f2 richiedere anche molto tempo.<\/p>\n<p>Il RR \u00e8 un ottimo pianificatore se parliamo solo della metrica del tempo di risposta. Ma come si comporter\u00e0 la metrica del tempo di turnaround delle attivit\u00e0 con questo algoritmo? Consideriamo l'esempio sopra, in cui i tempi di esecuzione A, B, C = 5s e arrivano allo stesso tempo. Il compito A terminer\u00e0 alle 13, B alle 14, C alle 15s e il tempo medio di turnaround sar\u00e0 di 14s. Pertanto, il RR \u00e8 l\u2019algoritmo peggiore per la metrica del turnaround.<\/p>\n<p>Parlando pi\u00f9 in generale, qualsiasi algoritmo di tipo RR \u00e8 equo; divide il tempo di CPU equamente tra tutti i processi. E cos\u00ec, queste metriche sono costantemente in conflitto tra loro.<\/p>\n<p>Cos\u00ec, abbiamo diversi algoritmi opposti e rimangono anche alcune ipotesi: che il tempo del compito sia noto e che il compito utilizzi solo la CPU.<\/p>\n<h3>Mescolamento con I\/O<\/h3>\n<p>\n Iniziamo rimuovendo l'ipotesi 4, che il processo utilizzi solo la CPU; naturalmente non \u00e8 cos\u00ec e i processi possono accedere anche ad altre attrezzature.<\/p>\n<p>Nel momento in cui un processo richiede un'operazione di input\/output, il processo passa allo stato di blocked, in attesa di completare l'I\/O. Se l'I\/O \u00e8 diretto a un disco rigido, tale operazione pu\u00f2 occupare fino a diversi ms o pi\u00f9 a lungo, e la CPU in quel momento sar\u00e0 inattiva. Durante questo tempo, il pianificatore pu\u00f2 assegnare la CPU a un altro processo. La successiva decisione che dovr\u00e0 prendere il pianificatore \u00e8 quando il processo terminer\u00e0 il suo I\/O. Quando accade, si verifica un'interruzione e il sistema operativo passer\u00e0 il processo che ha richiesto l'I\/O allo stato di ready.<\/p>\n<p>Consideriamo un esempio con diverse attivit\u00e0. Ognuna di esse ha bisogno di 50 ms di tempo di CPU. Tuttavia, la prima richieder\u00e0 ogni 10 ms l'accesso all'I\/O (che verr\u00e0 eseguito anche ogni 10 ms). Mentre il processo B utilizza semplicemente 50 ms di CPU senza I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn questo esempio utilizzeremo il piano STCF. Come si comporter\u00e0 questo piano se avviamo un processo come A? Proceder\u00e0 in questo modo: prima terminer\u00e0 completamente il processo A e poi passer\u00e0 al processo B.<\/p>\n<p><img decoding=\"async\" alt=\"Sistemi Operativi: Tre Pezzi Facili. Parte 4: Introduzione allo Scheduler (traduzione)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'approccio tradizionale per risolvere questo problema \u00e8 interpretare ogni sottocompito di 10 ms del processo A come un'attivit\u00e0 separata. Cos\u00ec, all'inizio con l'algoritmo STJF, \u00e8 evidente la scelta tra un'attivit\u00e0 di 50 ms e una di 10 ms. Poi, quando il sottocompito A \u00e8 completato, verr\u00e0 avviato il processo B e l'I\/O. Dopo il completamento dell'I\/O, sar\u00e0 deciso di avviare nuovamente il processo A da 10 ms anzich\u00e9 il processo B. In questo modo, \u00e8 possibile realizzare una sovrapposizione, in cui la CPU \u00e8 utilizzata da un altro processo mentre il primo attende l'I\/O. Di conseguenza, il sistema viene meglio utilizzato: nel momento in cui i processi interattivi stanno aspettando l'I\/O, possono essere eseguiti altri processi sulla CPU.<\/p>\n<h3>L'oracolo non c'\u00e8 pi\u00f9.<\/h3>\n<p>\n Ora cerchiamo di liberarci dell'idea che il tempo di esecuzione di un'attivit\u00e0 sia noto. Questa \u00e8, in generale, l'ipotesi peggiore e pi\u00f9 poco realistica dell'intero elenco. Infatti, nelle normali OS medie, il sistema operativo sa generalmente molto poco sul tempo di esecuzione dei task; come possiamo quindi costruire un piano senza sapere quanto tempo impiegher\u00e0 un'attivit\u00e0? Forse potremmo utilizzare alcuni principi del RR per risolvere questo problema?<\/p>\n<h3>Risultato<\/h3>\n<p>\n Abbiamo esaminato le idee di base della pianificazione dei task e considerato due famiglie di pianificatori. La prima avvia l'attivit\u00e0 pi\u00f9 breve all'inizio, migliorando in tal modo il tempo di turnaround, mentre la seconda interrompe equamente tutte le attivit\u00e0, migliorando il tempo di risposta. Entrambi gli algoritmi hanno dei difetti dove gli altri algoritmi eccellono. Abbiamo anche visto come l'uso parallelo di CPU e I\/O possa migliorare le prestazioni, ma non abbiamo ancora risolto il problema della visione del sistema operativo. Alla prossima lezione, esamineremo un pianificatore che guarda al passato recente e cerca di prevedere il futuro. Si chiama multi-level feedback queue.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449026\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sistemi Operativi: Tre Facili Pezzi. Parte 4: Introduzione al pianificatore (traduzione) | ProHoster","description":"Introduzione ai sistemi operativi Ciao, Habr! Voglio presentarvi una serie di articoli tradotti che ritengo interessanti - OSTEP.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:45:27+00:00","article:modified_time":"2019-10-31T18:45:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32158","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 09:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:03:25","updated":"2026-01-21 09:34:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}