Knižnica programátora je všetko, čo začiatočník aj skúsený programátor potrebuje. Algoritmy na nahradenie stránky. Hodiny. Algoritmus LRU

  • 21.07.2019

Na pohovoroch sa ľudia často pýtajú, ktorý druh je najrýchlejší. Triková otázka. Vysvetlíme prečo a hľadáme najlepšiu možnosť.

V odpovedi by ste sa mali opýtať: "A pre aký prípad je zvolený časovo optimálny druh?" A až po vyhlásení podmienok môžete bezpečne vyriešiť dostupné možnosti.

existuje:

  • triediace algoritmy O(n2) ako je triedenie podľa vloženia, triedenie podľa bublín a triedenie výberu, ktoré sa používajú v špeciálnych prípadoch;
  • quicksort (univerzálny): priemer O(n log n) výmeny, ale najhorší čas je O(n2) ak je pole už zoradené alebo sú prvky rovnaké;
  • algoritmy O(nlogn), ako sú zlučovacie triedenie a halové triedenie (hromadné triedenie), ktoré sú tiež dobrými všeobecnými triediacimi algoritmami;
  • O(n) alebo lineárne triediace algoritmy (select, select-swap, select-count) pre zoznamy celých čísel, ktoré môžu byť vhodné v závislosti od povahy celých čísel vo vašich zoznamoch.

Ak všetko, čo viete, je všeobecný vzťah medzi prvkami, optimálne algoritmy budú zložité O(n log n). Lineárne algoritmy vyžadujú dodatočné informácie o štruktúre prvkov.

Optimálnosť algoritmu do značnej miery závisí od typu zoznamov/polí, ktoré budete triediť, a dokonca aj od počítačového modelu. Čím viac informácií máte, tým presnejší bude váš výber. Pri veľmi slabých predpokladoch o faktoroch môže byť optimálna zložitosť najhoršieho prípadu O (nie!).

Táto odpoveď je len o zložitosti. Skutočný čas vykonávania algoritmov závisí od veľkého množstva faktorov.

Testovanie

Aký druh je teda najrýchlejší?

Vizualizácia

Dobrá vizualizácia triedenia je demonštrovaná v tomto videu:

Zdá sa, že odpovedá na otázku, ktorý druh je najrýchlejší, ale majte na pamäti, že rýchlosť je ovplyvnená mnohými faktormi a toto je len jedna z demonštrovaných možností.

V mnohých aplikáciách vzniká problém s detekciou anomálií, ktoré sa môžu objaviť v nasledujúcom viacrozmernom rámci sekvencie obrazu. Takýmito anomáliami môžu byť napríklad lesné požiare, patologické zmeny na lekárskych snímkach, nové objekty v chránenej oblasti atď. V tomto prípade je problém detekcie formalizovaný takto:

SP s časopriestorovými koreláciami a SP nezávislých náhodných premenných s nulovými priemermi a rozptylmi. Vektor parametra umožňuje zohľadniť napríklad možné vzájomné priestorové posuny a rotácie susedných snímok.

Výskyt deterministického signálu vedie k zmene modelu (2.1) len v oblasti indexov (obr. 1) posledného z pozorovaných rámcov:

kde je množina vzoriek užitočného signálu.

Za uvažovaných podmienok je potrebné nájsť pravidlo na testovanie hypotézy H0 o absencii anomálie v doméne G za alternatívneho predpokladu H1 o platnosti modelu (2.2).

Vzhľadom na pravdepodobnostné charakteristiky komponentov modelov (2.1), (2.2) možno určiť zodpovedajúce hustoty podmieneného rozdelenia pravdepodobnosti (PDs) pozorovaní W(Z|Н0) a W(Z|Н1). Preto by sa na vyriešenie problému detekcie malo použiť porovnanie s prahovou úrovňou pravdepodobnostného pomeru (LR):

(2.3)

Pre zjednodušenie výpočtov predstavme podmienené PDF ako produkty: , kde ZG je množina pozorovaní v oblasti G; Z0 je množina všetkých pozorovaní, ktoré nepatria do oblasti očakávaného signálu. Od , OP (2.3) sa prepisuje do tvaru:

. (2.4)

Podmienené súbory PDF zahrnuté v OP (2.4) priblížime podľa Gaussových distribúcií:

kde , a , sú podmienené matematické očakávania a priestorové kovariančné matice pozorovaní ZG v neprítomnosti a prítomnosti užitočného signálu.

Ak vezmeme do úvahy pozorovacie modely (2.1), (2.2), je ľahké získať nasledujúce vzorce pre podmienené priemery, kde - optimálna predpoveď hodnôt SP zostavená na základe všetkých dostupných pozorovaní Z0, ktoré nepatria do oblasti signálu. Priestorové matice V0 a V1 sú rovnaké: , kde je kovariančná matica chýb optimálnej prognózy.

Po dosadení vyššie uvedených vzťahov do (2.4), (2.5) a logaritmovaní nájdeme nasledujúci algoritmus detekcie signálu:

, (2.6)

kde - prah detekcie. Ako vyplýva zo vzorca (2.6), postup detekcie anomálií zahŕňa kompenzáciu rušivých obrazov odpočítaním optimálnej predpovede zistenej na základe všetkých pozorovaní, ktoré nepatria do oblasti G, od pozorovania. Po kompenzácii rušivých SP sa lineárne vážené vykoná sa sumarizácia zvyškov

Použitím Frobeniusovho vzorca na invertovanie blokových matíc je možné ukázať, že štatistiku možno zredukovať na ekvivalentnú formu:

kde , - optimálna predpoveď hodnoty zostavená na základe všetkých dostupných pozorovaní, okrem ; . je rozptyl chyby predikcie. Naproti tomu to budeme nazývať „predpoveď do bodky“. Keď sa anomálie zistia vo všetkých možných oblastiach G s veľkým počtom prvkov, "predpoveď do bodu" sa dá nájsť pomocou oveľa menšieho počtu výpočtových operácií ako "predpoveď oblasti" .

Inú formu zápisu optimálneho detekčného postupu je možné získať za predpokladu, že užitočný signál dokáže obsadiť všetky dostupné snímky, t.j. oblasť G zahŕňa všetky viacrozmerné siete. Potom je najlepšia predpoveď a algoritmus (2.6) má tvar:

, (2.8)

kde ; je interferujúca kovariančná matica obrazu.

Priama implementácia procedúry (2.8) je náročná kvôli veľkému počtu výpočtových operácií. Rozšírenie priestorovej symetrickej matice však na súčin dvoch trojuholníkových , môžeme reprezentovať (2.8) vo forme

(2.9)

zodpovedajúce predbežnému "bieleniu" sekvencie obrázkov a následnému súčtu váh s váhami. V mnohých prípadoch tento prístup umožňuje nájsť kvázi optimálne „bieliace“ algoritmy prijateľné pre prax. Nezávislé zvažovanie adaptívnych rekurzívnych filtrov, vlastnosťami podobných bieliacim, je zároveň dôležitým smerom pri hľadaní možností na relatívne jednoduchú technickú alebo softvérovú implementáciu systému spracovania obrazových sekvencií. Novou vlastnosťou, ktorú majú algoritmy (2.7), (2.8) a (2.9) vzhľadom na (2.6) je oddelenie časovo náročnej operácie optimálnej predikcie alebo bielenia, ktorá nesúvisí s tvarom signálu a relatívne jednoduchý súčet hmotnosti, ktorý zohľadňuje typ užitočného signálu. Vďaka tomu je možné celkom jednoducho vyriešiť ako problémy s detekciou anomálií s neznámymi parametrami polohy, tak aj zložitejšie problémy multi-alternatívnej detekcie (rozpoznania) viacerých typov signálov.

Prezentované výsledky umožňujú spresniť podmienky, za ktorých platí navrhované nahradenie podmienených PDF normálnymi rozdeleniami. V prvom rade ide o širokú triedu s gaussovskými modelmi (2.1), (2.2). V týchto prípadoch sú postupy (2.6), (2.7), (2.9) prísne optimálne. Pre negaussovské komponenty modelov (2.1), (2.2) je dostatočnou podmienkou optimality možnosť aproximácie a posteriori PDF prognózy normálnym rozdelením. Všimnite si, že posledná podmienka je splnená aj v mnohých aplikovaných problémoch spracovania SP s významnými časopriestorovými koreláciami a je zvyčajne ekvivalentná podmienke vysokej aposteriórnej presnosti predikcie.

Predpokladajme, že všetky skreslenia v kanáli sú striktne určené a náhodný je iba Gaussov aditívny šum n(t), o ktorom sa spočiatku predpokladá, že je biely, so spektrálnou hustotou N 0 . To znamená, že pri vysielaní signálu u i (t) (symbol b i (i = 0,1,...,m-1) môže byť prichádzajúci signál opísaný modelom (3.38):

z(t) = si (t) + n(t), (0≤t≤T), (6,17)

kde všetky s i (t) = ku i (t-τ) (i = 0, 1,..., m-1) sú známe. Neznáma je len realizácia rušenia a index i skutočne prenášaného signálu, ktorý by mal určiť rozhodovací obvod.

Budeme tiež predpokladať, že všetky si (t) sú konečné signály, ktorých trvanie je T. K tomu dochádza, ak sú prenášané signály ui (t) konečné a majú rovnakú dobu trvania (synchrónny systém) a nedochádza k viaccestnému šíreniu ani lineárne skreslenie v kanáli, čo spôsobuje predĺženie trvania signálu (alebo sú korigované).

V nasledujúcom budeme všade predpokladať, že v systéme je zabezpečená spoľahlivá synchronizácia hodín, t.j. hranice intervalu hodín, v ktorých prichádza signál s(t), sú presne známe. Otázky synchronizácie sú veľmi dôležité pri implementácii optimálnych demodulátorov a synchrónnych komunikačných systémov vo všeobecnosti, ale presahujú rámec tohto kurzu. Okamih začiatku odosielania s(t) bude braný ako nula.

Za týchto podmienok definujeme algoritmus pre činnosť optimálneho (t.j. na základe pravidla maximálnej pravdepodobnosti) demodulátora, ktorý analyzuje signál v intervale hodín 0-T. Na to je potrebné nájsť pomery pravdepodobnosti pre všetkých m možných signálov vzhľadom na nulovú hypotézu (s(t)=0; z(t) = n(t)).

Problém je sťažený skutočnosťou, že šírka spektra signálu je nekonečná (keďže je konečná), a teda priestor signálu je nekonečnerozmerný L 2 (T). Pre takéto signály (alebo vektory s nekonečnými rozmermi), ako bolo uvedené, neexistuje žiadna hustota pravdepodobnosti. Existujú však „-rozmerné hustoty pravdepodobnosti pre ľubovoľných n úsekov signálu (pozri § 2.1).

Najprv nahraďme biely šum kvázi bielym šumom, ktorý má rovnakú jednostrannú výkonovú spektrálnu hustotu N 0 , ale len v určitom frekvenčnom pásme F = n/2T, kde n>>1. Najprv zvážime dodatočnú hypotézu, t. j. budeme predpokladať, že Z(t) je šum. Zoberme si n ekvidištantných úsekov na hodinovom intervale cez Δt = 1/2F = T/n. Hodnoty Z 1,...., Zn v týchto častiach pre kvázi biely Gaussov šum sú nezávislé v súlade s (2.49). Preto n-rozmerná hustota pravdepodobnosti pre odobraté vzorky

kde σ 2 = N 0 F je disperzia (výkon) kvázi bieleho šumu.

Za predpokladu, že bol prenesený symbol b i, podľa (6.17) n(t) = z(t) - s i (t). Preto je podmienená n-rozmerná hustota pravdepodobnosti úsekov Z(t) určená rovnakým vzorcom ako (6.18), ak z(tk) je nahradené rozdielom z(tk)-si (tk), ktorý podľa tejto hypotézy predstavuje hluk:

Pomer pravdepodobnosti pre signál s i (vo vzťahu k dodatočnej hypotéze), vypočítaný pre n úsekov:

Nahraďte disperziu σ 2 jej vyjadrením: σ 2 = N 0 F = N 0 /(2Δt). Potom

Podľa pravidla maximálnej pravdepodobnosti musí rozhodovací obvod v prípade kvázi bieleho šumu zvoliť hodnotu i, ktorá poskytuje maximum Λ i [n] . Namiesto maxima Λ i možno nájsť maximum jeho logaritmu:

Druhý člen v (6.22) nezávisí od t a možno ho pri porovnávaní hypotéz ignorovať. Potom rozhodovacie pravidlo, že symbol b i bol prenesený podľa (6.10), možno vyjadriť systémom nerovností

Vráťme sa teraz k pôvodnému problému bieleho šumu. Aby sme to dosiahli, rozšírime pás F, potom počet sekcií n bude mať tendenciu k nekonečnu a Δt bude mať tendenciu k nule. Súčty v (6.22) sa menia na integrály a jed v roztoku je definovaný takto:

Výraz (6.24) určuje tie operácie (operačný algoritmus), ktoré musí optimálny prijímač vykonať na vstupnej oscilácii z(t).

Na obr. 6.2 pre m = 2 ukazuje blokovú schému prijímača pracujúceho v súlade s algoritmom (6.24).

Tu "-" - odčítacie zariadenia; Γ 0, Γ 1 - generátory referenčného signálu s 0 (t), s 1 (t); "KB" - kvadrátory; ∫ - integrátori; RU je rozhodovacie zariadenie, ktoré určuje v časoch, ktoré sú násobkami T (keď sú kľúče zatvorené), číslo vetvy s minimálnym signálom.

Pre m>2 v schéme na obr. 6.2 a ďalších nižšie uvedených schém sa zodpovedajúcim spôsobom zvyšuje počet vetiev spracovania signálu, ktoré pripadajú na rozvádzač.

V Hilbertovom priestore


definuje normu rozdielu medzi vektormi z a s alebo vzdialenosť medzi nimi * . Preto je možné algoritmus (6.24) zapísať ako

||z - s i ||

a dajme tomu jednoduchú geometrickú interpretáciu: optimálny demodulátor by mal registrovať ten signál s i (t) (zodpovedajúci symbolu b i), ktorý je „bližší“ k prijatému tvaru vlny z(t). Ako príklad na obr. 6.3 je znázornené optimálne rozdelenie dvojrozmerného priestoru prijímaných signálov z(t) pri prenose signálov s 1 (t) a s 0 (t). Oblasti rozhodovania v prospech symbolov 0 alebo 1 sú umiestnené na oboch stranách priamky 0-0, kolmo na segment spájajúci body signálov a rozdeľujúci ho na polovicu.

Prítomnosť v diagrame na obr. 6.2 kvadrátory, navrhnuté tak, aby poskytovali kvadratickú transformáciu okamžitých hodnôt vstupných signálov v celom ich dynamickom rozsahu, často sťažujú jeho implementáciu. Preto na základe (6.24) získame ekvivalentný prijímací algoritmus, ktorý nevyžaduje zariadenia na kvadratúru.

Otvorenie zátvoriek pod znakom integrálu a zrušenie člena v oboch častiach nerovností (6.24)

dostávame sa k algoritmu príjmu:

kde Ej je energia očakávaného signálu sj(t):


Pre binárny systém sa algoritmus (6.25) redukuje na kontrolu jednej nerovnosti

Zariadenie, ktoré priamo vypočítava bodový súčin


sa nazýva aktívny filter alebo korelátor, takže prijímač, ktorý implementuje algoritmus (6.25), sa nazýva korelačný prijímač.

* (Pre n-rozmerný euklidovský priestor je táto norma rovná)


Na obr. 6.4 ukazuje blokovú schému prijímača pracujúceho v súlade s (6.27). Tu bloky × sú multiplikátory; Γ 0, Γ 1 - generátory referenčného signálu s 0 (t) s 1 (t); ∫ - integrátori; "-" - odčítacie zariadenia; RU je rozhodovacie zariadenie, ktoré určuje v časoch, ktoré sú násobkami T (keď je kľúč zatvorený), i = 0, 1 je číslo vetvy s maximálnym signálom.

Ak sú signály ui (t) zvolené tak, že všetky ich realizácie (a následne všetky realizácie si (t) majú rovnaké energie (E i = const), prijímací algoritmus (6.25) (a podľa toho, jeho implementácia) je zjednodušená (nie sú potrebné subtraktory) a má formu

Z (6.29) je vidieť, že rozhodovacie pravidlo sa nemení, ak sa signál z(t) na vstupe demodulátora vynásobí ľubovoľným číslom. Preto sa systém, v ktorom všetky realizácie signálu majú rovnakú energiu, líši v tom, že optimálny algoritmus príjmu v ňom nevyžaduje znalosť "mierky" prichádzajúceho signálu, alebo inými slovami znalosť kanálového zisku k. Táto dôležitá vlastnosť viedla k širokému používaniu signálnych systémov s rovnakou energiou, ktoré sa bežne označujú ako systémy aktívnej pauzy. Toto je obzvlášť dôležité pre slabnúce kanály, kde zisk kolíše (pozri §6.7).

Všimnite si, že pre binárny systém môže byť nerovnosť (6.27) reprezentovaná v jednoduchšej forme:


kde s Δ (0 \u003d s 1 (t) - s 0 (t) je rozdielový signál; λ \u003d 0,5 (E 1 - E 0) je prahová úroveň. Pre systém s aktívnou pauzou X \u003d 0, čo výrazne zjednodušuje implementáciu optimálnej schémy.

Ak je splnená nerovnosť (6.30), zaregistruje sa symbol 1, inak - 0. Na implementáciu (6.30) v obvode z obr. 6.4 vyžaduje iba jednu vetvu.

Na obr. 6.5a znázorňuje obvod, ktorý implementuje algoritmus (6.30) pre binárny prenosový systém s unipolárnymi impulzmi (s pasívnou pauzou): s 1 (t) = a, s 0 (t) = 0. S týmito signálmi je s Δ ( t) = s 1 (t) = a, E 1 = a 2 T, E 0 = 0, λ = a 2 T/2 a (6.30) má nasledujúci tvar:


Uvažovaný systém binárnych signálov sa používa v najjednoduchších drôtových komunikačných zariadeniach. V rádiových kanáloch, ako aj v moderných káblových kanáloch sa používajú vysokofrekvenčné signály. Najjednoduchšie binárne systémy s harmonickými signálmi sú systémy s amplitúdovým (AM), fázovým (PM) a frekvenčným (FM) kľúčovaním.

V binárnom AM s 1 (t) = acos (ω 0 t + φ), s 0 (t) = 0. Predpokladá sa, že všetky konštanty (a, ω 0, φ) v tejto časti sú známe. Keďže tu je Δ (t) \u003d s 1 (t), E 1 \u003d a 2 T / 2 a E 0 \u003d 0, pravidlo (6.30) bude napísané takto:


Je implementovaný diagramom na obr. 6.5.6, ktorý sa líši od obr. 6.5,a blokom násobenia prichádzajúceho signálu s referenčným signálom cos(ω 0 t + φ). Prahová úroveň λ̇ je v tomto prípade rovná aT/(4RC).

Pri binárnej FM sústave s 0 (t) = a cos (tω 0 + φ), s 0 (t) = a cos (tω 0 + φ + π) = -s 1 (t). Toto je systém s aktívnou pauzou, a preto v (6.30) λ = 0. Je ľahké vidieť, že rozhodovacie pravidlo sa redukuje na nasledovné:


a je realizovaný rovnakým obvodom na obr. 6.5.6 pre λ̇ = 0. V tomto prípade hrá RU úlohu polaritného diskriminátora.

Ryža. 6.6. Optimálny demodulátor bielenia pre Gaussov "farebný" šum

Pozrime sa stručne na prípad, keď gaussovský šum v kanáli nie je biely alebo kvázi biely, ale „farebný“, t. j. má nerovnomernú hustotu výkonu G(f) v pásme spektra signálu. Prepustime súčet signálu a šumu prichádzajúceho na vstup demodulátora cez filter s prenosovou funkciou k(i2πf) tak, že súčin G(f) |k(i2πf)| 2 bol konštantný N°. Zo všetkých možných filtrov s k(i2πf), ktoré spĺňajú túto podmienku a líšia sa iba fázovo-frekvenčnou charakteristikou, je možné zvoliť minimálny fázový, ktorý je reverzibilný. Je zrejmé, že šum na výstupe filtra bude kvázi biely: G out (f) = N 0 . Preto sa takýto filter nazýva bieliaci filter.

Signál si (t) sa po prechode bieliacim filtrom zmení na nejaký iný signál, ktorý označíme s "i (t). Jeho typ možno určiť so znalosťou si (t) ak (i2πf). Ak teraz použijeme oscilácie z výstupu bieliaceho filtra na demodulátor, ktorý je optimálny na príjem signálov s "i (t) (i \u003d 0, 1, ..., m-1), potom dostaneme obvod z obr. 6.6, čo je samozrejme optimálne pre signály s i (t) s farebným šumom.

Je potrebné poznamenať, že v diagrame na obr. 6.2, 6.4 a 6.5, referenčný signál musí mať rovnaké počiatočné fázy ako očakávané prichádzajúce signály alebo, inými slovami, musí byť koherentný s prichádzajúcimi signálmi. Táto požiadavka zvyčajne komplikuje implementáciu demodulátora a vyžaduje si do neho zaviesť okrem blokov uvedených na obrázkoch ďalšie zariadenia určené na úpravu fáz referenčných signálov.

Všetky metódy príjmu, ktorých implementácia si vyžaduje presné apriórne znalosti o počiatočných fázach prichádzajúcich signálov, sa nazývajú koherentné. V tých prípadoch, keď sú informácie o počiatočných fázach očakávaných signálov extrahované zo samotného prijímaného signálu (napríklad, ak fáza kolíše, ale tak pomaly, že ju možno predpovedať z predchádzajúcich signálových prvkov), príjem sa nazýva kvázikoherentný. . Ak neexistujú žiadne informácie o počiatočných fázach prichádzajúcich signálov, alebo sa z nejakého dôvodu nepoužívajú, potom sa príjem nazýva nekoherentný (pozri § 6.6).

Optimalizácia algoritmu vyvinutého programu
Fáza vývoja algoritmu vašej aplikácie je najťažšia v celom reťazci životného cyklu programu. Úspech jeho implementácie vo forme programového kódu do značnej miery závisí od toho, ako hlboko sú premyslené všetky aspekty vašej úlohy. Vo všeobecnosti platí, že zmeny v štruktúre samotného programu majú oveľa väčší efekt ako dolaďovanie programového kódu. Neexistujú žiadne ideálne riešenia a vývoj aplikačného algoritmu vždy sprevádzajú chyby a nedostatky. Tu je dôležité nájsť úzke miesta v algoritme, ktoré najviac ovplyvňujú výkon aplikácie.

Okrem toho, ako ukazuje prax, takmer vždy je možné nájsť spôsob, ako zlepšiť už vyvinutý algoritmus programu. Samozrejme, najlepšie je starostlivo vyvinúť algoritmus na začiatku návrhu, aby ste sa v budúcnosti vyhli mnohým nepríjemným následkom spojeným so zdokonaľovaním fragmentov kódu v krátkom časovom období. Nájdite si čas na vývoj aplikačného algoritmu – ušetrí vám to bolesti hlavy s ladením a testovaním programu a ušetrí čas.

Treba mať na pamäti, že algoritmus, ktorý je efektívny z hľadiska výkonu programu, nikdy nespĺňa požiadavky na hlásenie problému na 100% a naopak. Algoritmy, ktoré nie sú zlé z hľadiska štruktúry a čitateľnosti, spravidla nie sú efektívne z hľadiska implementácie programového kódu. Jedným z dôvodov je želanie vývojára zjednodušiť celkovú štruktúru programu použitím, pokiaľ je to možné, vysokoúrovňových vnorených štruktúr na výpočty. Zjednodušenie algoritmu v tomto prípade nevyhnutne vedie k zníženiu výkonu programu.

Na začiatku vývoja algoritmu je dosť ťažké odhadnúť, aký bude kód aplikácie. Ak chcete správne vytvoriť algoritmus programu, musíte dodržiavať niekoľko jednoduchých pravidiel:
1. Pozorne si preštudujte problém, pre ktorý bude program vyvinutý.
2. Určite hlavné požiadavky na program a prezentujte ich vo formalizovanej forme.
3. Určite formu prezentácie. vstupné a výstupné údaje a ich štruktúru, ako aj možné obmedzenia.
4. Na základe týchto údajov určite verziu programu (alebo model) implementácie úlohy.
5. Vyberte spôsob implementácie úlohy.
6. Vytvorte algoritmus na implementáciu programového kódu. Algoritmus na riešenie problému by sa nemal zamieňať s algoritmom na implementáciu programového kódu.
Vo všeobecnosti sa nikdy nezhodujú. Toto je najdôležitejšia fáza vývoja softvéru!
7. Vytvorte zdrojový kód programu v súlade s algoritmom implementácie programového kódu.
8. Odlaďte a otestujte programový kód vyvíjanej aplikácie.

Tieto pravidlá by sa nemali brať doslovne. V každom konkrétnom prípade si programátor sám zvolí metodiku vývoja programov. Niektoré fázy vývoja aplikácie môžu byť podrobnejšie a niektoré nemusia byť dostupné vôbec. Pre malé problémy stačí vyvinúť algoritmus, mierne ho doladiť na implementáciu programového kódu a potom ho odladiť.

Pri vytváraní veľkých aplikácií môže byť potrebné vyvinúť a otestovať samostatné fragmenty programového kódu, čo si môže vyžadovať dodatočné detaily programového algoritmu.
Pre správnu algoritmizáciu úloh môže programátorovi pomôcť množstvo literárnych zdrojov. Princípy konštrukcie efektívnych algoritmov sú dobre vyvinuté. Na túto tému existuje množstvo dobrej literatúry, napríklad Umenie programovania od D. Knutha.

Optimalizácia hardvéru vášho počítača
Softvérový vývojár sa zvyčajne snaží zabezpečiť, aby výkon aplikácie závisel čo najmenej od hardvéru počítača. V tomto prípade by ste mali počítať s najhorším možným scenárom, keď používateľ vášho programu nebude mať najnovší model počítača. V tomto prípade „revízia“ hardvéru často umožňuje nájsť rezervy na zlepšenie aplikácie.
Prvá vec, ktorú musíte urobiť, je analyzovať výkon počítačových periférií, na ktorých by mal program bežať. V každom prípade, vedieť, čo je rýchlejšie a čo pomalšie, pomôže pri vývoji programu. Analýza priepustnosti systému vám umožňuje identifikovať úzke miesta a urobiť správne rozhodnutie. Rôzne počítačové zariadenia majú rôznu šírku pásma. Najrýchlejšie z nich sú procesor a RAM, relatívne pomalé sú pevný disk a CD-mechanika. Najpomalšie sú tlačiarne, plotre a skenery.

Najzodpovednejšou činnosťou správcu pamäte je teda pridelenie rámca RAM, aby sa do neho umiestnila virtuálna stránka umiestnená v externej pamäti. Pripomeňme, že uvažujeme o situácii, keď veľkosť virtuálnej pamäte pre každý proces môže výrazne presiahnuť veľkosť hlavnej pamäte. To znamená, že pri prideľovaní stránky hlavnej pamäte je vysoko pravdepodobné, že sa nenájde žiadny voľný rámec stránky. V tomto prípade operačný systém v súlade s kritériami v ňom stanovenými by mala:

  • nájsť nejakú obsadenú stránku hlavnej pamäte;
  • v prípade potreby presunúť jeho obsah do externej pamäte;
  • prepíšte obsah požadovanej virtuálnej stránky z externej pamäte do tohto rámca stránky;
  • správne upraviť potrebný prvok príslušnej tabuľky stránok;
  • pokračovať vo vykonávaní procesu, ktorý potreboval túto virtuálnu stránku.

Upozorňujeme, že pri výmene musíte dvakrát preniesť stránku medzi hlavnou a sekundárnou pamäťou. Proces nahradenia je možné optimalizovať použitím modifikačný bit(jeden z atribútov stránky v tabuľke stránok). Modifikačný bit nastaví počítač, ak bol na stránku zapísaný aspoň jeden bajt. Keď sa vyberie náhradný kandidát, skontroluje sa bit modifikácie. Ak bit nie je nastavený, nie je potrebné túto stránku prepisovať na disk, jej kópia je už na disku. Podobný spôsob platí aj pre stránky určené len na čítanie, nikdy sa neupravujú. Táto schéma skracuje čas spracovania chýb stránky.

Existuje široká škála algoritmov na nahradenie stránok. Všetky sú rozdelené na lokálne a globálne. Lokálne algoritmy, na rozdiel od globálnych, prideľujú každému procesu pevný alebo dynamicky nastaviteľný počet stránok. Keď proces spotrebuje všetky svoje stránky, systém odstráni jednu zo svojich stránok z fyzickej pamäte a nie zo stránok iných procesov. Globálny náhradný algoritmus sa v prípade výnimky uspokojí s vydaním akejkoľvek fyzickej stránky bez ohľadu na to, ku ktorému procesu patrila.

Globálne algoritmy majú množstvo nevýhod. Po prvé, robia niektoré procesy citlivými na správanie iných procesov. Napríklad, ak jeden proces v systéme súčasne používa veľké množstvo pamäťových stránok, všetky ostatné aplikácie zaznamenajú vážne spomalenie v dôsledku nedostatku pamäťových rámcov pre ich prácu. Po druhé, nesprávne sa správajúca aplikácia môže podkopať celý systém (samozrejme, pokiaľ systém nemá limit na veľkosť pamäte pridelenej procesu), pričom sa pokúša získať viac pamäte. Preto je v multitaskingovom systéme niekedy potrebné použiť zložitejšie lokálne algoritmy. Použitie lokálnych algoritmov vyžaduje, aby operačný systém ukladal zoznam fyzických rámcov pridelených každému procesu. Tento zoznam stránok sa niekedy nazýva rezidenčný súbor proces. V jednej z nasledujúcich častí sa uvažuje o variante swapovacieho algoritmu, ktorý je založený na uvedení rezidentnej množiny do súladu s tzv. pracovná súprava proces.

Účinnosť algoritmu sa zvyčajne vyhodnocuje na špecifickej sekvencii odkazov na pamäť, pre ktorú sa počíta počet chýb stránky, ktoré sa vyskytnú. Táto sekvencia sa nazýva hit line(referenčný reťazec). Môžeme umelo vygenerovať reťazec zásahov pomocou generátora náhodných čísel alebo sledovaním špecifického systému. Posledná metóda vytvára príliš veľa odkazov, na zníženie počtu odkazov je možné urobiť dve veci:

  • pre konkrétnu veľkosť stránky si môžete zapamätať iba ich čísla a nie adresy, na ktoré odkaz smeruje;
  • niekoľko po sebe idúcich odkazov na jednu stránku je možné opraviť raz.

Ako už bolo spomenuté, väčšina procesorov má to najjednoduchšie hardvér, čo vám umožňuje zhromažďovať niektoré štatistiky prístupov do pamäte. Tieto nástroje zvyčajne obsahujú dva špeciálne príznaky na záznam tabuľky stránok. Referenčný príznak ( referenčný bit ) sa automaticky nastaví pri akomkoľvek prístupe na túto stránku a príznak zmeny ( bit modifikácie ), o ktorom sme už hovorili vyššie, sa nastaví, ak sa na túto stránku vykoná zápis. Operačný systém pravidelne kontroluje tieto príznaky, aby zvýraznil aktívne používané stránky, po čom sa hodnoty týchto príznakov vynulujú.

Zvážte niekoľko algoritmov na nahradenie stránok.

Algoritmus FIFO. Vysunutie prvej prichádzajúcej stránky

Najjednoduchší algoritmus. Každá stránka má priradenú časovú pečiatku. Realizuje sa to jednoducho vytvorením frontu stránok, na konci ktorého stránky padajú pri načítaní do fyzickej pamäte a sú odobraté od začiatku, keď je potrebné uvoľniť pamäť. Na výmenu sa vyberie najstaršia strana. Bohužiaľ, táto stratégia s veľkou pravdepodobnosťou nahradí pri úprave súboru často používané stránky, ako sú kódové stránky textového procesora. Všimnite si, že pri výmene aktívnych stránok všetko funguje správne, ale okamžite sa vyskytne chyba stránky.

Belady anomália

Na prvý pohľad sa zdá zrejmé, že čím viac rámcov stránky je v pamäti, tým menej často sa vyskytnú chyby stránky. Prekvapivo to nie je vždy tak. Ako Bilady a kolegovia zistili, určité sekvencie prístupov na stránky skutočne vedú k zvýšeniu počtu porušenie stránok pri zvyšovaní rámcov pridelených procesu. Tento jav sa nazýva "anomálie Bilady" alebo „FIFO anomálie“.

Systém s tromi snímkami (9 porúch) je pri výbere stratégie FIFO efektívnejší ako so štyrmi snímkami (10 porúch) pre reťazec prístupu do pamäte 012301401234.


Ryža. 10.1.

Optimálny algoritmus (OPT)

Jedným z dôsledkov objavu Biladyho anomálie bolo hľadanie optimálneho algoritmu, ktorý by mal pre daný reťazec prístupov minimálnu frekvenciu chýb stránok spomedzi všetkých ostatných algoritmov. Takýto algoritmus sa našiel. Je to jednoduché: vymeňte stránku, ktorá sa nebude používať dlhší čas.

Každá stránka by mala byť označená počtom pokynov, ktoré sa vykonajú pred vytvorením prvého odkazu na danú stránku. Strana, pre ktorú je toto číslo najvyššie, by mala byť vytlačená.

Tento algoritmus sa dá ľahko opísať, no nemožno ho implementovať. Operačný systém nevie, na ktorú stránku sa bude najbližšie pristupovať. (Skôr takéto problémy vznikali pri plánovaní procesov - algoritmus SJF).

Na druhej strane môžeme konštatovať, že na to, aby sa náhradný algoritmus čo najviac priblížil ideálnemu algoritmu, musí systém čo najpresnejšie predpovedať prístupy procesov do pamäte. Tento algoritmus sa používa na hodnotenie kvality implementovaných algoritmov.

Tlačenie najdlhšie nepoužívanej strany. Algoritmus LRU

Jedna aproximácia k algoritmu OPT je algoritmus založený na heuristickom pravidle, že nedávna minulosť je dobrým vodítkom pre predpovedanie blízkej budúcnosti.

Kľúčový rozdiel medzi FIFO a optimálnym algoritmom je v tom, že jeden sa pozerá dozadu a druhý dopredu. Ak používate minulosť na priblíženie sa budúcnosti, má zmysel nahradiť stránku, ktorá sa nepoužívala najdlhšie. Tento prístup sa nazýva najmenej nedávno používané algoritmu (LRU). Činnosť algoritmu je znázornená na obr. ryža. 10.2. Porovnanie Obr. 10.1b a 10.2 je možné vidieť, že použitie algoritmu LRU znižuje počet porušenie stránok.


Ryža. 10.2.

LRU je dobrý, ale ťažko implementovateľný algoritmus. Musieť mať prepojený zoznam všetkých stránok v pamäti, na začiatku ktorých budú uložené naposledy použité stránky. Okrem toho sa tento zoznam musí aktualizovať pri každom prístupe do pamäte. Vyhľadávanie stránok v takomto zozname si vyžaduje veľa času.

V [Tanenbaum, 2002] sa uvažuje o variante implementácie algoritmu LRU so špeciálnym 64-bitovým ukazovateľom, ktorý sa po vykonaní každej inštrukcie automaticky zvýši o jednotku a tabuľka stránok má zodpovedajúce pole, v ktorom je ukazovateľ hodnota sa zadáva pre každý odkaz na stránku. Keď sa vyskytne chyba stránky, stránka s najmenšou hodnotou v tomto poli sa uvoľní.

Optimálny algoritmus ani LRU netrpia Biladyho anomáliou. Existuje trieda algoritmov, pre ktoré pri rovnakom rade prístupov je množina stránok v pamäti pre n snímok vždy podmnožinou stránok pre n + 1 snímok. Tieto algoritmy nevykazujú Biladyho anomálie a nazývajú sa zásobníkové algoritmy.

Tlačenie zriedka používanej stránky. Algoritmus NFU

Pretože väčšina moderných procesorov neposkytuje dostatočnú hardvérovú podporu na implementáciu algoritmu