Komunikace mezi procesy
Z MiS
(Rozdíly mezi verzemi)
m (Přidána kategorie Procesy) |
(Doplnění a rozšíření textu) |
||
(Nejsou zobrazeny 2 mezilehlé verze od 1 uživatele.) | |||
Řádka 1: | Řádka 1: | ||
[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Procesy]] | [[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Procesy]] | ||
− | + | * Při programování úlohy postupujeme, jako by náš program byl jediný, který v počítači běží. | |
+ | * Procesy se musí mít zcela oddělenou paměť, aby nemohlo omylem či záměrně dojít k poškození dat nebo dokonce kódu procesu jiným procesem (například malwarem, nebo prostě chybou v jiném procesu). | ||
+ | * Jak si ale mohou procesy vyměňovat data, pokud je to potřeba? | ||
<div class="Poznamka"> | <div class="Poznamka"> | ||
− | Vlákna | + | ; Poznámka |
+ | [[Proces#Vl.C3.A1kno|Vlákna]] jednoho procesu mají společný datový segment — tedy sdílí společnou paměť. Sdílení dat mezi ''vlákny'' tedy problém není, stačí použít společné proměnné. | ||
+ | |||
+ | Proces ale má svůj virtuální paměťový prostor a ostatní procesy jeho proměnné nevidí (viz heslo [[Přístup procesů do paměti]]). | ||
</div> | </div> | ||
+ | |||
+ | * Dále uvedeme způsoby, jak procesy mohou navzájem předávat data, když je to potřeba. | ||
+ | |||
== Soubory == | == Soubory == | ||
− | * Diskový prostor je pro všechny procesy společný, | + | * Diskový prostor je pro všechny procesy společný, jeden proces tedy může zapsat data do souboru a druhý proces je z téhož souboru může přečíst. |
+ | |||
+ | |||
== Roura (pipe) == | == Roura (pipe) == | ||
− | * | + | * ''Rouru'' znáte z příkazového řádku — je to znak <code>|</code>, který píšete mezi dva příkazy. |
− | * Pokud zpracovávající proces nestíhá, je generující proces pozastaven ( | + | * (Viz [[Vstup a výstup procesů, přesměrování]].) |
+ | * Například: | ||
+ | ls | sort | head | ||
+ | * ''Roura'' je ve skutečnosti speciální virtuální „soubor“ určený jen pro komunikaci mezi procesy. | ||
+ | * Pokud ''zpracovávající'' proces vpravo od znaku <code>|</code> nestíhá zpracovávat data, je generující proces (ten vlevo od znaku <code>|</code>) pozastaven (''blocked'' — v rámci [[Životní cyklus procesu|našeho rozdělení stavů je to stav ''Sleep/wait'']]). | ||
+ | |||
+ | |||
== Síťové rozhraní (socket) == | == Síťové rozhraní (socket) == | ||
− | * Procesy mohou komunikovat prostřednictvím | + | * Procesy mohou komunikovat prostřednictvím sítě. |
− | * | + | * I když běží na jednom počítači, mohou použít jako cílovou IP adresu „místní smyčku“ (localhost, 127.0.0.1). |
− | * Výhoda: relativně snadný převod na síťovou aplikaci. | + | * Využívá se například u linuxových grafických rozhraní. |
+ | * Výhoda: relativně snadný převod na síťovou aplikaci, pokud je to v budoucnu potřeba. | ||
+ | |||
+ | |||
== Proměnné prostředí == | == Proměnné prostředí == | ||
− | * Proměnné prostředí se | + | * Proměnné prostředí (''environment variables'') se kopírují z rodičovských procesů na dceřiné. |
− | * Tímto způsobem se často předává informace o nastavení cest k významným adresářům (pro komunikaci prostřednictvím souborů). | + | * Jedná se například o proměnnou <code>PATH</code>, viz [[Proměnné prostředí]]. |
− | + | * Proces A tedy může nastavit proměnnou prostředí a pokud A později spustí další (dceřinný) proces B, může si proces B hodnotu proměnné přečíst. | |
+ | * Tímto způsobem se často předává informace o nastavení cest k významným adresářům. (Což lze poté využít pro komunikaci prostřednictvím souborů). | ||
+ | |||
+ | |||
== Signály == | == Signály == | ||
− | * Speciální mechanismus pro komunikaci mezi operačním systémem a procesy navzájem. | + | * Speciální mechanismus pro komunikaci mezi operačním systémem a procesy navzájem. |
− | * | + | * Signály může posílat i uživatel ručně prostřednictvím příkazu <code>kill</code> (viz také [[Nástroje pro práci s procesy]]). |
+ | |||
=== Příklady signálů === | === Příklady signálů === | ||
; TERM (TERMinate) | ; TERM (TERMinate) | ||
− | *požádá aplikaci o ukončení | + | * požádá aplikaci o ukončení |
− | * | + | * Tento signál vyšle i „zavírací tlačítko“ v pravém horním rohu okna aplikace v GUI. |
; INT (INTerrupt) | ; INT (INTerrupt) | ||
− | *Násilné ukončení. | + | * Násilné ukončení. |
− | * | + | * Odpovídá stisku kombinace „Ctrl-C“ v příkazovém řádku Linuxu. (Pozor, nepleťte s kopírováním do schránky, což je význam Ctrl-C v grafickém prostředí.) |
; KILL | ; KILL | ||
− | * | + | * Aplikace je „zabita“ — ukončena bez možnosti zareagovat na signál. |
− | * | + | * Tento signál se neposílá procesu, zpracuje přímo operační systém — zruší proces a uvolní jeho paměť. Může ale dojít ke ztrátě dat, pokud proces právě pracoval s diskem či posílal data jinému procesu. |
; NOHUP (NO HangUP) | ; NOHUP (NO HangUP) | ||
* Proces neskončí při ukončení rodičovského procesu. | * Proces neskončí při ukončení rodičovského procesu. | ||
+ | |||
+ | |||
== Adresář <code>/proc</code> == | == Adresář <code>/proc</code> == | ||
− | * | + | * Jedná se o speciální virtuální adresář, kde lze zjistit informace o běžících procesech. |
+ | * Viz [[Adresář /proc]]. | ||
+ | |||
+ | |||
== Schránka operačního systému == | == Schránka operačního systému == | ||
+ | * Schránku znáte z grafického prostředí. | ||
+ | * Kombinace kláves <tt>Ctrl-C</tt> umístí data v rámci jednoho procesu do „schránky“, ve druhém procesu pak kombinace <tt>Ctrl-V</tt> data ze schránky vyzvedne. | ||
+ | |||
+ | |||
+ | == Související stránky == | ||
+ | * [[Nástroje pro práci s procesy]], [[Přístup procesů do paměti]], [[Adresář /proc]], [[Nástroje pro práci s procesy]] |
Aktuální verze z 6. 10. 2020, 07:35
- Při programování úlohy postupujeme, jako by náš program byl jediný, který v počítači běží.
- Procesy se musí mít zcela oddělenou paměť, aby nemohlo omylem či záměrně dojít k poškození dat nebo dokonce kódu procesu jiným procesem (například malwarem, nebo prostě chybou v jiném procesu).
- Jak si ale mohou procesy vyměňovat data, pokud je to potřeba?
- Poznámka
Vlákna jednoho procesu mají společný datový segment — tedy sdílí společnou paměť. Sdílení dat mezi vlákny tedy problém není, stačí použít společné proměnné.
Proces ale má svůj virtuální paměťový prostor a ostatní procesy jeho proměnné nevidí (viz heslo Přístup procesů do paměti).
- Dále uvedeme způsoby, jak procesy mohou navzájem předávat data, když je to potřeba.
Obsah |
Soubory
- Diskový prostor je pro všechny procesy společný, jeden proces tedy může zapsat data do souboru a druhý proces je z téhož souboru může přečíst.
Roura (pipe)
- Rouru znáte z příkazového řádku — je to znak
|
, který píšete mezi dva příkazy. - (Viz Vstup a výstup procesů, přesměrování.)
- Například:
ls | sort | head
- Roura je ve skutečnosti speciální virtuální „soubor“ určený jen pro komunikaci mezi procesy.
- Pokud zpracovávající proces vpravo od znaku
|
nestíhá zpracovávat data, je generující proces (ten vlevo od znaku|
) pozastaven (blocked — v rámci našeho rozdělení stavů je to stav Sleep/wait).
Síťové rozhraní (socket)
- Procesy mohou komunikovat prostřednictvím sítě.
- I když běží na jednom počítači, mohou použít jako cílovou IP adresu „místní smyčku“ (localhost, 127.0.0.1).
- Využívá se například u linuxových grafických rozhraní.
- Výhoda: relativně snadný převod na síťovou aplikaci, pokud je to v budoucnu potřeba.
Proměnné prostředí
- Proměnné prostředí (environment variables) se kopírují z rodičovských procesů na dceřiné.
- Jedná se například o proměnnou
PATH
, viz Proměnné prostředí. - Proces A tedy může nastavit proměnnou prostředí a pokud A později spustí další (dceřinný) proces B, může si proces B hodnotu proměnné přečíst.
- Tímto způsobem se často předává informace o nastavení cest k významným adresářům. (Což lze poté využít pro komunikaci prostřednictvím souborů).
Signály
- Speciální mechanismus pro komunikaci mezi operačním systémem a procesy navzájem.
- Signály může posílat i uživatel ručně prostřednictvím příkazu
kill
(viz také Nástroje pro práci s procesy).
Příklady signálů
- TERM (TERMinate)
- požádá aplikaci o ukončení
- Tento signál vyšle i „zavírací tlačítko“ v pravém horním rohu okna aplikace v GUI.
- INT (INTerrupt)
- Násilné ukončení.
- Odpovídá stisku kombinace „Ctrl-C“ v příkazovém řádku Linuxu. (Pozor, nepleťte s kopírováním do schránky, což je význam Ctrl-C v grafickém prostředí.)
- KILL
- Aplikace je „zabita“ — ukončena bez možnosti zareagovat na signál.
- Tento signál se neposílá procesu, zpracuje přímo operační systém — zruší proces a uvolní jeho paměť. Může ale dojít ke ztrátě dat, pokud proces právě pracoval s diskem či posílal data jinému procesu.
- NOHUP (NO HangUP)
- Proces neskončí při ukončení rodičovského procesu.
Adresář /proc
- Jedná se o speciální virtuální adresář, kde lze zjistit informace o běžících procesech.
- Viz Adresář /proc.
Schránka operačního systému
- Schránku znáte z grafického prostředí.
- Kombinace kláves Ctrl-C umístí data v rámci jednoho procesu do „schránky“, ve druhém procesu pak kombinace Ctrl-V data ze schránky vyzvedne.
Související stránky
- Nástroje pro práci s procesy, Přístup procesů do paměti, Adresář /proc, Nástroje pro práci s procesy