Moravské přístroje, a. s., zdroj: https://www.mii.cz/art?id=1109&lang=405, vytištěno: 20.04.2024 5:28:00

Hlavní stránkaPodporaRady pro tvorbu aplikací

Aplikace jako služba operačního systému
 V systému Control Web je možné spouštět aplikace jako službu operačního systému. Kdy je vhodné aplikace spustit jako službu? Jaké aplikace je možné spustit jako službu? Jaká jsou omezení a možnosti? Vše si vysvětlíme v následujícím článku.

V systému Control Web je od verze 6 možné spouštět aplikaci jako službu (servis). Taková aplikace je spuštěna ihned po startu operačního systému, běží na pozadí a bez ohledu na to jestli je přihlášený nějaký uživatel. Aplikaci jako službu je možné spouštět například na počítačích, kde není nikdo přihlášený nebo kde se přihlášení uživatelé mění a aplikace má neustále běžet.

Hlavní nevýhodou je, že aplikaci nevidíme (ani pokud se k počítači přihlásíme). Testování nebo ladění takové aplikace může být náročnější. Je zde však ještě jedno omezení, které není na první pohled vidět, ale které je při vývoji aplikace běžící jako servis klíčové. Aplikace běžící jako servis je spuštěna v prostředí operačního systému, které má oproti prostředí pro klasické aplikace omezené prostředky. Služby jsou v operačním systému od toho, aby prováděly na pozadí nějakou nezbytnou činnost (například hlídání aktualizací, kontrola zabezpečení a podobně), které ale zásadně nezatěžují běh počítače. Běží "nenápadně" na pozadí. Spustit například řízení rozsáhlé technologie s archivací, web serverem a spoustou komunikací jako službu operačního systému není rozhodně dobrý nápad.

Paměť

V čem je tedy prostředí služby omezené oproti běhu klasické aplikace? Každá aplikace běžící v operačním systému Windows používá některé systémové prostředky. Nejznámějším prostředkem, který aplikace používají, je paměť. Aplikace, které jsou 32bitové, mají k dispozici 2GB paměti, pokud běží v 32bitovém operačním systému. V některých případech 3GB paměti pokud běží v 64bitovém operačním systému. 64bitové aplikace mají teoreticky k dispozici až 256 TB. Stejné omezení platí také pro aplikace běžící jako servis. Tady tedy rozdíl mezi klasickou a "servisovou" aplikací není.

Zásadní rozdíl uvidíme až u následujících prostředků. Aplikace dále využívají Popisovače (handles), uživatelské objekty (user objects) a GDI objekty (GDI objects).

Popisovače (Handles)

Popisovač - handle je datová struktura, která odkazuje na nějaký objekt v operačním systému. Pokud to hodně zjednodušíme, můžeme operační systém požádat, aby nám vytvořil určitý objekt, který potřebujeme pro svoji práci. Operační systém ho vytvoří a vrátí nám handle (odkaz) na vytvořený objekt. Pomocí tohoto odkazu můžeme s objektem dále pracovat (například ho na konci práce zase smazat). Handle se používá třeba při práci se soubory. Pro nás je důležité, že počet handlů je omezený (maximální počet je zhruba 16 miliónů).

Správně naprogramovaná aplikace toto omezení nikdy nepřekročí. Problém může nastat například v aplikacích, které nějaké objekty vytváří, ale zapomenou je zrušit, když už je nepotřebují. Pokud běží hodně dlouho, systémové prostředky pak dojdou a požadavek o vytvoření dalšího objektu selže. Aplikace pak pravděpodobně přestane pracovat nebo rovnou "spadne".

Pokud se libovolná aplikace (netýká se to pouze systému Control Web) dostává po delší době běhu do problémů, je užitečné podívat se do Správce procesů. V záložce podrobnosti si zapnout sloupce Popisovače (Handles), Objekty users (User objects) a Objekty GDI (GDI objects). Pokud se hodnota v některém sloupci blíží svému limitu, je to důležitá informace o chybě v aplikaci (je extrémně důležité toto sdělit při komunikaci s technickou podporou výrobce dané aplikace).

Uživatelské objekty (User objects)

Dalším prostředkem operačního systému jsou uživatelské objekty (user objects). To jsou objekty, které si aplikace vytváří pro komunikaci s uživatelem (okna, menu, lišty s nástroji) nebo pro komunikaci s operačním systémem, jinými procesy nebo také komunikaci s jiným zařízením (například pro komunikaci s PLC s využitím Modbus TCP nebo web server pro komunikaci s klienty). Počet těchto objektů má tři omezení.

První omezení nedovolí jednomu procesu vytvořit více než 10 000 uživatelských objektů. Na toto omezení můžeme narazit i v klasické aplikaci. Pokud v rozsáhlé aplikaci používáme panely ve vykreslovacím režimu gdi (graphics_mode=gdi), každý přístroj je objektem operačního systému a tedy spotřebuje minimálně jeden uživatelský objekt. Pokud počet 10 000 překročíme, projeví se to v aplikaci tak, že některé části přestanou být viditelné. Tady je řešení jednoduché. Stačí u panelů nastavit parametr graphics_mode na některý pokročilejší vykreslovací režim (gdi_offscreen, gdi_plus, direct2d, open_gl). Potom je pouze samotný panel objektem operačního systému, ale přístroje v něm už objekty operačního systému nejsou a tedy uživatelské objekty nespotřebovávají.

Pro uživatelské objekty existují bohužel ještě další omezení. Všechny aplikace v jedné session (zjednodušeně řečeno je to prostředí vytvořené pro přihlášeného uživatele) mohou vytvořit 65 535 uživatelských objektů. Pokud tento počet aplikace společně překročí, stane se další práce s operačním systémem i aplikacemi prakticky nemožnou. Většinu aplikací není možné ani ukončit (pro ukončení potřebují vytvořit několik objektů například pro uložení do souboru). Ze stejných důvodu se nepovede ani odhlásit nebo restartovat.

Servis a uživatelské objekty

Pro aplikace běžící jako služba je klíčové poslední omezení. Všechny uživatelské objekty se vyváří v určité části paměti, která je pro tyto účely vyhrazena a má omezenou velikost (tato oblast se označuje jako desktop heap). Tato paměť je společná pro jeden desktop. Desktop si zase můžeme představit jako prostředí v němž je přihlášen jeden uživatel a běží jeho aplikace. Velikost této paměti je v různých verzích operačního systému různá. Ve Windows 10 je nastavená tak, aby zhruba odpovídala velikosti potřebné pro vytvoření 65 535 objektů (objekty nemusí být stejně veliké). Pro "interactiv desktop", tedy prostředí přihlášeného uživatele, je to 20MB.

Ale pozor, pro non-interactiv desktop (prostředí v němž běží služby operačního systému) je to pouze 768KB. Všechny aplikace systému Control Web, které běží jako služba, běží společně - tedy mají jeden desktop heap (velký 768KB). Počet uživatelských objektů, které mohou vytvořit aplikace běžící jako služba, je tedy podstatně menší.

Rozsáhlejší aplikace je tedy vždy lepší spustit například pod automaticky přihlašovaným uživatelem, tedy v normálním prostředí s menším omezením prostředků operačního systému.

Velikost non-interactiv desktop heap je možné v nastavení operačního systému zvětšit. Podrobný popis je například zde. Je potřeba si uvědomit, že se tím zvětší velikost vyhrazené paměti všech desktop heapů, které se vyváří pro každý desktop. V operačním systému běží služeb velké množství a proto je potřeba tuto velikost nastavit "rozumně" (také proto není toto nastavení jednoduše přístupné běžným uživatelům).