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).
|