Vyšlo v týdeníku Computerworld č. 26/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a326c120.php3

Cycle stealing

Vztahy mezi jednotlivými částmi počítače nemusí být vždy zcela idylické. Dokud byl procesor jediným pánem, který rozhodoval o všem a sám, bylo ještě vše jednoduché. Jakmile se ale v našich počítačích začínají objevovat různé více či méně samostatné a na procesoru nezávislé subsystémy, věci se začínají komplikovat. Náhle se totiž vedle sebe vyskytuje více autonomních subjektů, které mezi sebou soutěží o získání něčeho, co může skutečně získat jen jeden z nich. Na typický příklad jsme narazili v minulém vydání této rubriky, které bylo věnováno technice přímého přístupu do paměti, neboli technice DMA.

Jakmile je v nějakém počítači instalován řadič DMA, přestává být procesor tohoto počítače jediným, kdo může požadovat přístup k operační paměti - za účelem čtení či zápisu. Stejným požadavek totiž může vznést i DMA řadič, takže musí existovat nějaký mechanismus, který v případě souběhu obou požadavků rozhodne o tom, který z nich má být uspokojen, a toto rozhodnutí také prakticky uskuteční.

Minule, když jsme si o technice DMA povídali poprvé, jsme se zmínili o nejobvyklejším řešení, které lze charakterizovat jako "slušné chování DMA řadiče". Spočívá v tom, že o přístupu k systémovým sběrnicím (a jejich prostřednictvím o přístupu k paměti) rozhoduje procesor, a DMA řadič jej slušně požádá o dočasné přepuštění těchto sběrnic, tak aby i on mohl s pamětí pracovat. Konkrétní forma je pak taková, že DMA řadič pošle procesoru zvláštní signál (obvykle pojmenovaný HOLD), kterým žádá o přidělení sběrnic. Procesor na tuto žádost odpovídá dalším speciálním signálem (HLDA, resp. Hold Acknowledge), kterým DMA řadiči signalizuje přidělení sběrnic. Zajímavou otázkou je, kdy a za jakých podmínek procesor žádosti DMA řadiče vyhoví: procesor obvykle není konstruován tak, aby mohl žádost ignorovat, takže DMA řadiči vyhoví vždy. Nemusí to ale udělat okamžitě - pokud právě sám pracuje s pamětí (tj. právě z ní něco čte, resp. něco do ní zapisuje), tuto svou činnost nejprve dokončí, a teprve pak přenechá sběr nice DMA řadiči. Práce procesoru s pamětí přitom probíhá v tzv. cyklech (anglicky: cycles, resp. memory cycles), které představují jednotlivá "sáhnutí" do paměti za účelem načtení či zápisu tak velkého objemu dat, jaký je možné zapsat či přečíst najednou (tj. u počítačů s 8-bitovou datovou sběrnicí 1 byte, s 16-bitovou datovou sběrnicí 2 byty atd.). Pokud tedy žádost DMA řadiče o sběrnice přijde v průběhu nějakého paměťového cyklu, procesor jej nejprve dokončí, a teprve pak vyhoví žádosti DMA řadiče. Jakmile DMA řadič získá tímto způsobem sběrnice, může je využít buď jen pro jediné "sáhnutí" do paměti (tj. jen po dobu jednoho paměťového cyklu), nebo i po delší dobu (po více paměťových cyklů), má-li co přenášet. Okamžik, kdy vrací sběrnice zpět procesoru, signalizuje ukončením své žádosti (signálem HOLD) - pokud si tedy DMA řadič chce ponechat sběrnice déle, stačí když udržuje signál HOLD v takovém stavu, který signalizuje žádost o sběrnice.

Existují ovšem i dvě další varianty, při kterých se DMA řadič již zdaleka nechová tak "slušně", jako v předchozím případě.

Jedna varianta je založena na tom, že procesor nemusí vytěžovat paměť trvale - tedy že jednotlivé přístupy procesoru do paměti nemusí navazovat těsně na sebe, ale může mezi nimi být určitý časový odstup. Pokud je tento časový odstup dostatečně velký, může jej chytrý DMA řadič využít pro svůj vlastní přístup do paměti. Tato technika, označovaná jako transparentní DMA, však připadala v úvahu jen u některých 8-bitových mikroprocesorů, zatímco u dnešních 16 a 32-bitových mikroprocesorů ji nelze použít. Důvod je ten, že tyto mikroprocesory pracují s pamětí velmi intenzivně, snaží se z ní číst "dopředu" do svých cache pamětí, a mezi jednotlivými přístupy do paměti proto neponechávají prakticky žádný časový odstup.

Další varianta je pak založena na myšlence, že když procesor neponechává mezi jednotlivými přístupy k paměti dostatečně dlouhou dobu, kterou by DMA řadič mohl využít, tento si ji "násilně" prodlouží. Jak?

DMA řadič v tomto případě musí umět správně rozpoznat začátek a konec každého paměťového cyklu, využívaného procesorem. Chce-li sám pracovat s pamětí, musí počkat na konec právě probíhajícího paměťového cyklu, a pak, ve správný okamžik, přinutit procesor, aby nezahajoval další paměťový cyklus, a naopak sám začít pracovat s pamětí. Teprve po jejím skončení pak DMA řadič zase nechá procesor, aby v práci s pamětí pokračoval. Domyšleno do důsledku, DMA řadič vlastně ukradne procesoru jeden nebo několik paměťových cyklů, a využije je sám k vlastnímu prospěchu. Proto se také této technice říká kradení cyklů (cycle stealing).

Zajímavý je konkrétní mechanismus, kterým DMA řadič "krade" paměťové cykly. Procesor této možnosti většinou nijak nevychází vstříc. Místo toho musí DMA řadič vystihnout vhodný okamžik (konec probíhajícího paměťového cyklu) a pak procesor náhle a bez jeho vědomí "uspat" - tak aby nezahajoval další paměťový cyklus. Toho lze dosáhnout poměrně jednoduše: procesor se při své činnosti řídí periodicky se měnícím signálem (tzv. hodinovým signálem), od jehož průběhu pak odvozuje časový průběh veškerých svých akcí. Jestliže se tento hodinový signál náhle přestane měnit, pro procesor se doslova "zastaví čas", a procesor "usne". To mimo jiné znamená, že všechny signály, generované procesorem, zůstanou v takovém stavu, v jakém byly v okamžiku zastavení hodin, a dále se nemění.

Pokud tedy DMA řadič dokáže vystihnout správný okamžik a procesoru zastavit jeho měřítko času, vlastně tím procesor odstaví od sběrnic a paměti, a ty pak může využít sám.

DMA řadič by ale neměl ponechávat procesor "uspaný" příliš dlouho. Je zde totiž jedno velké nebezpečí: vnitřní registry většiny dnešních procesorů jsou konstruovány jako dynamické, což znamená, že potřebují pravidelné osvěžování. Za normálních okolností je tato skutečnost plně transparentní, protože osvěžování si zajišťuje procesor sám. přitom však vychází z průběhu hodinového signálu, takže kdyby jej DMA řadič zastavil na příliš dlouhou dobu, obsah dynamických registrů procesoru by nebyl včas osvěžen, a ztratil by se.