Operaciumoj: Tri Facilaj Pecoj. Parto 1: Enkonduko (traduko)

Enkonduko al Operaciumoj

Hej Habr! Mi ŝatus prezenti al via atento serion da artikoloj-tradukoj de unu interesa literaturo laŭ mi - OSTEP. Ĉi tiu materialo diskutas sufiĉe profunde la laboron de Unikso-similaj operaciumoj, nome, laboro kun procezoj, diversaj planiloj, memoro kaj aliaj similaj komponantoj kiuj konsistigas modernan OS. Vi povas vidi la originalon de ĉiuj materialoj ĉi tie tie. Bonvolu noti, ke la traduko estis farita senprofesie (sufiĉe libere), sed mi esperas, ke mi konservis la ĝeneralan signifon.

Laboratorio pri ĉi tiu temo troveblas ĉi tie:
- originala: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- originala: github.com/remzi-arpacidusseau/ostep-code
- mia persona adapto: github.com/bykvaadm/OS/tree/master/ostep

Vi ankaŭ povas kontroli mian kanalon ĉe telegramo =)

Programa funkciado

Kio okazas kiam programo funkcias? Kuranta programo faras unu simplan aferon - ĝi plenumas instrukciojn. Ĉiun sekundon, milionoj kaj eĉ eble miliardoj da instrukcioj estas prenitaj de la procesoro el RAM, siavice ĝi malkodas ilin (ekzemple, ĝi rekonas al kiu tipo apartenas ĉi tiuj instrukcioj) kaj plenumas ilin. Ĉi tio povus esti aldoni du nombrojn, aliri memoron, kontroli kondiĉon, salti al funkcio, ktp. Post la ekzekuto de unu instrukcio, la procesoro daŭrigas al la ekzekuto de alia. Kaj tiel instrukcio post instrukcio, ili estas ekzekutitaj ĝis la programo finiĝas.
Ĉi tiu ekzemplo estas nature konsiderata simpligita - fakte, por akceli la procesoron, moderna aparataro ebligas al vi ekzekuti instrukciojn sen vico, kalkuli eblajn rezultojn, ekzekuti instrukciojn samtempe kaj similajn lertaĵojn.

Von Neumann-modelo de komputado

La simpligita formo de laboro priskribita de ni estas simila al la Von Neumann-modelo de komputado. Von Neumann estas unu el la pioniroj de komputilaj sistemoj, li ankaŭ estas unu el la aŭtoroj de ludoteorio.. Dum la programo funkcias, amaso da aliaj eventoj okazas, multaj aliaj procezoj kaj triaparta logiko funkcias, kies ĉefa celo estas simpligi la lanĉon, funkciadon kaj prizorgadon de la sistemo.
Estas aro da programaro, kiu respondecas pri igi programojn facile ruleblajn (aŭ eĉ permesi plurajn programojn ruliĝi samtempe), kiu permesas programojn dividi la saman memoron, kaj komuniki kun malsamaj aparatoj. Tia aro de programaro (programaro) estas esence nomita operaciumo kaj ĝiaj taskoj inkluzivas monitoradon, ke la sistemo funkcias ĝuste kaj efike, kaj ankaŭ certigi facilecon de administrado de ĉi tiu sistemo.

operaciumo

Operaciumo, mallongigita kiel OS, estas aro de interrilataj programoj dizajnitaj por administri komputilajn rimedojn kaj organizi uzantinteragon kun komputilo..
La OS atingas sian efikecon en la unua loko, per la plej grava tekniko - la tekniko virtualigo. La OS interagas kun fizika rimedo (procesoro, memoro, disko, ktp.) kaj transformas ĝin en pli ĝeneralan, pli potencan kaj pli facile uzeblan formon de si mem. Tial, por ĝenerala kompreno, vi povas tre proksimume kompari la operaciumon kun virtuala maŝino.
Por permesi al uzantoj doni komandojn al la operaciumo kaj tiel uzi la kapablojn de la virtuala maŝino (kiel ekz. ruli programon, asigni memoron, aliri dosieron, ktp), la operaciumo disponigas iun interfacon nomitan API (aplika interfaco de programado) kaj al kiu vi povas voki (voko). Tipa operaciumo permesas centojn da sistemvokoj esti faritaj.
Fine, ĉar virtualigo permesas al multoblaj programoj ruliĝi (tiel dividante la CPU), kaj samtempe aliri iliajn instrukciojn kaj datumojn (tiel dividante memoron), kaj aliri diskojn (tiel dividante I/O-aparatojn). ), la operaciumo ankaŭ estas nomita administranto de rimedoj. Ĉiu procesoro, disko kaj memoro estas rimedo de la sistemo, kaj tiel unu el la roloj de la operaciumo fariĝas la tasko administri ĉi tiujn rimedojn, farante ĝin efike, honeste aŭ inverse, depende de la tasko por kiu ĉi tiu operaciumo. estas desegnita.

CPU virtualización

Konsideru la sekvan programon:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Operaciumoj: Tri Facilaj Pecoj. Parto 1: Enkonduko (traduko)

Ĝi ne faras iujn ajn specialajn agojn, fakte, ĉio, kion ĝi faras, estas nomi funkcion turniĝado(), kies tasko estas cirkuli tra la tempokontrolo kaj reveni post kiam unu sekundo pasis. Tiel, ĝi ripetas senfine la ĉenon, kiun la uzanto pasis kiel argumento.
Ni rulu ĉi tiun programon kaj donu al ĝi la signon "A" kiel argumenton. La rezulto ne estas precipe interesa - la sistemo simple efektivigas programon, kiu periode montras la signon "A".
Nun ni provu la opcion kiam multaj okazoj de la sama programo funkcias, sed eligas malsamajn literojn por pliklarigi ĝin. En ĉi tiu kazo, la rezulto estos iom malsama. Malgraŭ la fakto, ke ni havas unu procesoron, la programo estas ekzekutita samtempe. Kiel ĝi okazas? Sed rezultas, ke la operaciumo, ne sen la helpo de aparataj kapabloj, kreas iluzion. La iluzio ke la sistemo havas multoblajn virtualajn procesorojn, igante ununuran fizikan procesoron en teorie senfinan nombron kaj tiel permesante al ŝajne programoj funkcii samtempe. Ĉi tiu iluzio nomiĝas CPU virtualización.
Ĉi tiu bildo levas multajn demandojn, ekzemple, se pluraj programoj volas funkcii samtempe, kiu estos lanĉita? La "politikoj" de la OS respondecas pri ĉi tiu demando. Politikoj estas uzataj en multaj lokoj en la OS kaj respondas demandojn kiel ĉi tion, kaj estas la bazaj mekanismoj kiujn la OS efektivigas. Tial la rolo de la OS kiel resursmanaĝero.

Memorvirtualigo

Nun ni rigardu la memoron. La fizika modelo de memoro en modernaj sistemoj estas reprezentita kiel aro de bajtoj.. Por legi el memoro, vi devas specifi ĉela adresopor aliri ĝin. Por skribi aŭ ĝisdatigi datumojn, vi ankaŭ devas specifi la datumojn kaj la adreson de la ĉelo kie skribi ĝin.
Memoro estas alirita konstante dum programo ekzekuto. Programo konservas sian tutan datumstrukturon en memoro kaj aliras ĝin plenumante diversajn instrukciojn. La instrukcioj, dume, ankaŭ estas konservitaj en memoro, do ĝi ankaŭ estas alirebla por ĉiu peto por la sekva instrukcio.

malloc() voko

Konsideru la sekvan programon, kiu asignas regionon de memoro uzante la vokon malloc () (https://youtu.be/jnlKRnoT1m0):

Operaciumoj: Tri Facilaj Pecoj. Parto 1: Enkonduko (traduko)

La programo faras plurajn aferojn. Unue, ĝi asignas iom da memoro (linio 7), tiam presas la adreson de la asignita ĉelo (linio 9), skribas nul al la unua fendo de la asignita memoro. Poste, la programo eniras buklon en kiu ĝi pliigas la valoron konservitan en memoro ĉe la adreso en la "p" variablo. Ĝi ankaŭ presas la procezan ID de si mem. La proceza ID estas unika por ĉiu funkcianta procezo. Lanĉinte plurajn kopiojn, ni renkontos interesan rezulton: En la unua kazo, se vi faras nenion kaj nur rulas plurajn kopiojn, tiam la adresoj estos malsamaj. Sed ĉi tio ne falas sub nia teorio! Ĝuste, ĉar modernaj distribuoj havas memorrandomigon ebligita defaŭlte. Se ĝi estas malŝaltita, ni ricevas la atendatan rezulton - la memoraj adresoj de du samtempe kurantaj programoj kongruos.

Operaciumoj: Tri Facilaj Pecoj. Parto 1: Enkonduko (traduko)

Rezulte, rezultas, ke du sendependaj programoj funkcias kun siaj propraj privataj adresspacoj, kiuj siavice estas mapitaj de la operaciumo en fizika memoro.. Tial, la uzo de memoradresoj ene de unu programo neniel influos aliajn, kaj ŝajnas al ĉiu programo, ke ĝi havas sian propran pecon de fizika memoro, tute donita al ĝi. La realo, tamen, estas, ke fizika memoro estas komuna rimedo administrita de la operaciumo.

Kohereco

Alia el la gravaj temoj ene de operaciumoj estas − kohereco. Ĉi tiu termino estas uzata kiam oni parolas pri problemoj en la sistemo, kiuj povas okazi kiam oni laboras kun multaj aferoj samtempe en la sama programo. Konsekvencproblemoj aperas eĉ ene de la operaciumo mem. En la antaŭaj ekzemploj pri memoro kaj procesoro virtualigado, ni rimarkis, ke la OS administras multajn aferojn samtempe - ĝi komencas la unuan procezon, poste la duan, ktp. Kiel rezultis, ĉi tiu konduto povas konduki al iuj problemoj. Do, ekzemple, modernaj plurfadenaj programoj spertas tiajn malfacilaĵojn.

Konsideru la sekvan programon:

Operaciumoj: Tri Facilaj Pecoj. Parto 1: Enkonduko (traduko)

La programo en la ĉefa funkcio kreas du fadenojn uzante la alvokon pthread_create (). En ĉi tiu ekzemplo, fadeno povas esti opiniita kiel funkcio funkcianta en la sama memorspaco kune kun aliaj funkcioj, kun klare pli ol unu funkcio funkcianta samtempe. En ĉi tiu ekzemplo, ĉiu fadeno komenciĝas kaj efektivigas la funkcion worker() kiu siavice simple pliigas la variablon,.

Ni rulu ĉi tiun programon kun argumento de 1000. Kiel vi eble divenis, la rezulto devus esti 2000 ĉar ĉiu fadeno pligrandigis la variablon 1000 fojojn. Tamen ĉio ne estas tiel simpla. Ni provu ruli la programon kun grandordo pli da ripetoj.

Operaciumoj: Tri Facilaj Pecoj. Parto 1: Enkonduko (traduko)

Enmetante nombron, ekzemple, 100000, ni atendas vidi la eligon kiel la nombron 200000. Tamen, se ni rulas la nombron 100000 plurajn fojojn, ni ne nur ne vidos la ĝustan respondon, sed ankaŭ ricevos malsamajn malĝustajn respondojn. La respondo kuŝas en tio, ke por pliigi la nombron, necesas tri operacioj - ĉerpi la nombron el memoro, pligrandigi, kaj poste reskribi la nombron. Ĉar ĉiuj ĉi tiuj instrukcioj ne estas ekzekutitaj atome (ĉiuj samtempe), strangaj aferoj kiel ĉi tio povas okazi. Ĉi tiu problemo nomiĝas en programado raskondiĉo. Kiam nekonataj fortoj en nekonata momento povas influi la agadon de iu ajn el viaj operacioj.

fonto: www.habr.com

Aldoni komenton