În timp, reduce timpul de răspuns aplicare în Linux

Ce suntem noi?

Lucrul pe un computer, suntem în mod constant se confruntă cu diferite tipuri de întârzieri. Încercați ambele Campiglio de bază, pentru a asculta muzică, descărca filme de pe net, prin introducerea în OpenOffice.org. Sunt sigur că mai devreme sau mai târziu se va confrunta cu faptul că, în Writer semne vor apărea după câteva secunde după ce apăsați un buton de pe tastatură, iar jucătorul va balbismul în mod constant. Cum este posibil pentru a reduce timpul de răspuns al aplicațiilor Linux - sistemul de operare al diviziunii timpului. în cazul în care toate procesele sunt egale (bine, aproape)? La urma urmei, a fost dezvoltat cu un accent pe optimizarea performanței sistemului în ansamblul său, și pe o perioadă limitată de timp asigurând aplicații de răspuns
se pune problema.

Noi folosim mijloacele la îndemână

După cum se știe, sistemul de viață vine de la procesele care joacă un rol-cheie în orice sistem de operare. de bază de cauciuc nu este, și în ciuda frecvenței gigahertzi exorbitanta pe unitatea de timp se poate executa instrucțiuni de doar un singur proces (cuanta de timp se numește utilizarea procesorului), și poate fi foarte multe procese în sistem ei înșiși. Deci, pentru a reduce întârzierile, numărul de procese trebuie să fie reduse la minimum. Pentru a face acest lucru, trebuie nu numai să eliminați toate programele inutile și dezactivați toate demonii neutilizate, dar, de asemenea, pentru a reconstrui kernel-ul, lăsând numai o funcționalitate cu adevărat necesar.

Pentru a aloca resurse pentru culturale și nimeni nu în același timp, să nu lipsească, în orice sistem are propriul său subsistem de control al procesului. Acesta funcționează pe principiul „fiecăruia după puterea lui, fiecăruia după faptele lui“. Procedeul poate fi utilizat în două moduri: modul de bază (modul nucleu) și în modul de utilizator (modul de utilizare), în cazul în care se execută instrucțiuni simple, fără a necesita „sistem“ de date speciale. Dar când sunt necesare astfel de servicii, procesul intră în modul de kernel, deși instrucțiunile vor continua să fie efectuate în numele procesului. Toate acestea se face în mod intenționat, pentru a proteja spațiul de operare de bază al procesului de utilizator. Alte procedee de preparare, fie
de lansare, de așteptare pentru programatorul le alege sau se află în modul sleep (adormit), așteptând o indisponibil în momentul în care resursa de timp. Cu simplu al acestuia din urmă. Atunci când un semnal de dispozitiv controlat, procesul se declară TASK_RUNNING și este gata de lansare în coada de așteptare. În cazul în care are cea mai mare prioritate, kernel-ul trece la punerea sa în aplicare.

Dar există un alt zakovyrka. În asigurarea procesului de resurse de sistem se produce așa-numitul comutator de context (schimbare de context), păstrând imaginea procesului curent (care, întâmplător, este de asemenea necesar pentru ceva timp, astfel latenta, chiar și în cazul ideal, nu va fi zero). Deci, comutatorul de context, atunci când un proces este în mod kernel poate duce la prăbușirea întregului sistem. Prin urmare, un proces de înaltă prioritate va trebui să aștepte cu răbdare pentru momentul trecerii în modul de sarcină, și poate avea loc în două cazuri: lucrarea este făcută sau resursă necesară nu este disponibilă. Asta este, este necesar să se reducă la minimum numărul de nucleare pentru a oferi timpi de răspuns mai rapid
sarcini. Dar pentru o astfel de decizie de a plăti stabilitatea generală și „greutatea“ de cod. Microkernel este, de altfel, a vândut mult mai bine - există un set minim de bază de modulare altceva atârna ca un pom de Crăciun, care oferă versatilitate și vă permite să proiecteze sistemul pentru sarcini specifice.

În ceea ce privește procesele de planificare, este legat de prioritate. Planificatorul selectează pur și simplu următorul proces cu cea mai mare prioritate. În acest caz, procesul de prioritate mai mică rulează la un moment dat, poate îndeplini chiar și nu pe deplin cuantumul acesteia până la sfârșit. Fiecare proces are două tipuri de prioritate: relative (P-> frumos, nivelurile de prioritate implicit la 100), instalate la cerere pornire și curentul pe baza căruia are loc programarea. Valoarea prioritatea actuală nu este fixă, ci dinamic calculat și depinde de frumos. Valoarea setată de către utilizator, poate fi cuprinsă în intervalul -20-19, aplicarea cu
o valoare mai mare prioritate corespunde la -20 ° C și 10 (implicit) și mai sus sunt considerate a avea sarcini prioritare mai mici. De exemplu, pentru a rula un program cu o mai mare prioritate decât în ​​mod normal, acest lucru:

$ Sudo frumos --20 MPlayer

O limită inferioară:

$ Sudo frumos loc de muncă -20

Pentru a modifica prioritatea relativă a unui proces, ar trebui să utilizați ID-ul de proces, mai degrabă decât nume:

$ Sudo --20 PID bazat pe kernelul

prioritatea curentă depinde de timpul și de sistem frumos resurse. El este recalculat fiecare tick și în timpul ieșirea din modul nucleu. În sisteme diferite, acest lucru se întâmplă în formulele lor, în cel mai simplu caz, o prioritate este împărțită în două, iar când acesta ajunge la zero complet recalculat (restaurat). Acest mecanism vă permite să obțineți timp și cereri de prioritate scăzută, dar în cele din urmă marea prioritate a primi cea mai mare parte.

Toate aceste subtilitati sunt utilizate într-o varietate de patch-uri la nucleu implementare lowlatency 2.4. Înlocuit nu numai prioritatea algoritmilor de conversie actuale, dar este posibil constantă (de exemplu, limita de frumos a fost crescută la 256), în plus, un cronometru este setat la o frecvență de până la 1000 HZ. Un exemplu de o astfel de soluție, veți găsi pe pagina www.zip.com.au/

Pentru a indica aplicația care necesită o atenție specială din partea procesorului poate fi utilizat și încorporate în caietul de sarcini POSIX în timp real apela SCHED_FIFO (un fel de tranziție de la un mod în timp real „moale“). Un rezultat similar este realizat prin utilizarea de apeluri SCHED_RR, CAP_IPC_LOCK, CAP_SYS_NICE sau prin substituirea valorilor sys_sched_get_priority_max - o funcție care returnează prioritatea maximă în timp real. Este utilizarea SCHED_FIFO cauzele care XMMS jucător pentru a rula sub rădăcină, aproape balbism chiar și la sarcini exorbitante pe sistem.

evacueazã kernel

Principala problemă de timp real este abilitatea de a captura resurse de la procesul de prioritate redusă. mai ales în cazul în care se execută în modul de kernel. La urma urmei, chiar și în contextul de comutare a petrecut ceva timp. Sute de dezvoltatori din întreaga lume au încercat să folosească miliardele de tehnologii: posibilitatea de întrerupere în timpul execuției în modul nucleu (kernel preemptible, kernel-ul este descărcat) la o moștenire temporară (moștenesc) o prioritate în timp real a unei cereri de prioritate redusă. astfel încât să poată termina rapid o secțiune critică de cod și să dea un control.

Subiect paginată nucleu al publicului interesat în perioada de dominație a ramurii 2.2. Linus Torvalds a declarat că în timp real - o idee proastă, iar pentru moment preemptible a fost realizat doar cu ajutorul patch-uri. Dar, în pregătirea de posibilitatea de a se ramifica nucleu 2.6 neîncărcat (PREEMPT_RT) s-a adăugat la codul sursă. Preemptible-nucleu este implementat, de obicei sub forma unui al doilea nucleu. Dacă procesul se întoarce la el cu o cerere, sistemul principal este, de fapt blocat în momentul execuției sale. Efectuat toate acestea ca un modul descărcabil care inlocuieste / intercepteaza funcția cea mai critică, care poate duce la întârzieri. Dar nu toate atât de simplu. Într-un interviu cu unul
MontaVista a Inginerilor (compania-dezvoltator de una dintre soluțiile în timp real bazate pe Linux), a spus că, în kernel 2.6 aproximativ 11.000 de bucăți de cod este pur și simplu imposibil de a face preemptible.

Pe Internet, în cazul în care o căutare bună, puteți găsi un număr suficient de diferite patch-uri care permit să pună în aplicare în timp real Linux, dar, de regulă, cele mai multe dintre proiecte sunt deja depășite și propune modificări ale kernel 2.4. De exemplu, KURT-Linux (www.ittc.ku.edu/kurt) și RT-Linux (www.rtlinux.org). Ambele Linux folosesc tehnologii similare, și diferențele subiective în activitatea lor nu este vizibil, dar pe internet apreciat de toata lumea este RT-Linux. Găsiți computere aflate sub controlul său este posibil, pe generatoare „Tokamak“, în Peru, spitale,
sateliții NASA în simulator F111-C. Prin modul în care, în cazul în care Ubuntu introduceți sudo apt-cache de căutare în timp real, atunci va descoperi prezența pachetului cu vechea 3.1pre3-3 versiune de RT-Linux.

Patch-uri de bază

Pe kernel-ul standard, lansați utilitarul RT-test. Numai rulează, vom obține o valoare de 0,125 ms, atunci când sarcina crește, crește la 15.402 ms. Notă Criteriile de setare, care este egală cu 100 microsecunde. În acest caz, rezultatul testului - FAIL, care este, în timp real este încă departe. Pune lowlatency-core - un miez comun, dar cu un cronometru 1000 Hz și timpul de răspuns redus:

$ Sudo apt-get install linux-lowlatency

Reboot și executați din nou RT-test.

$ Sudo RT-test toate

Valoarea de start este acum egal cu latență de 0,073 ms, iar cea maximă - 2,907 ms. Asta e mai bine. Deși Criteriile nu au reușit încă, dar Muzychko în Amarok'e nu mai este întreruptă atunci când un portbagaj decent.

Dintre toate punerea în aplicare a sistemelor în timp real doar o singură luare a venit astăzi, a oferit Ingo Molnarom. Se zvonea că patch-uri (www.kernel.org/pub/linux/kernel/projects/rt) emise de acesta va fi inclus în kernel 2.6.22, dar până ce se întâmplă. Pentru a instala Fedora fanii RT intră pur și simplu yum install kernel-rt, altele vor avea puțin pokompilirovat. Descărcați și aplicați patch-uri pentru kernel-ul:

$ Wget -c www.kernel.org/pub/linux/kernel/projects/rt/older/patch-2.6.22.1-rt9
$ Tar xjvf linux-2.6.22.1.tar.bz2
$ Cd linux-2.6.22.1
$ Sudo plasture -p1 <. /patch-2.6.22.1-rt9
$ Make menuconfig

După repornirea sistemului, prin introducerea dmesg, puteți vedea că kernel-ul a fost PREEMPT RT. ceas cronometru este instabil ( «Clocksource TSC instabil»), și PS AUX arată prezența unui număr mare de noi procese. Dar suntem mai interesați în rezultatul RT-test. Deci, toate trucurile noastre au condus la ceea ce este acum latenta maximă este mai mică de 0,07 ms. Voila, testul a trecut!