Operační systémy

Transkript

Operační systémy
Operační systémy
Cvičení 8: Komunikace mezi procesy (IPC)
1
Obsah cvičení
• Semafory
• Fronty zpráv
• Kde najít další informace
2
Semafory (pro Systém V)
• Slouží pro synchronizaci procesů.
• Alokují se, používají se a ruší se podobně jako například
sdílená paměť.
• Semafor = pole čítačů (velikost pole definujeme při alokaci).
3
Semafory – alokace
int semget (key_t key, int nsems, int flag);
• Funkce alokuje semafor.
– 1. parametr = celočíselný klíč specifikující semafor
– 2. parametr = počet čítačů v semaforu
– 3. parametr = definuje způsob vytvoření semaforu
• Funkce vrací identifikátor semaforu.
4
Příklad: Alokace binárního semaforu
/* We must define union semun ourselves. */
union semun {
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
/* Obtain a binary semaphore's ID, allocating if necessary. */
int binary_semaphore_allocation (key_t key, int sem_flags)
{
return semget (key, 1, sem_flags);
}
5
Semafory – řízení a dealokace
int semctl (int semid, int semnum, int cmd, union semun arg);
• Funkce umožňuje:
– získávat informace o semaforu,
– nastavovat (modifikovat) semafor,
– rušit semafor.
6
Příklad: nastavení binárního semaforu
/* Initialize a binary semaphore with a value of one. */
int binary_semaphore_initialize (int semid)
{
union semun argument;
unsigned short values[1];
values[0] = 1;
argument.array = values;
return semctl (semid, 0, SETALL, argument);
}
7
Příklad: zrušení binárního semaforu
/* Deallocate a binary semaphore. All users must have
finished their use. Returns -1 on failure. */
int binary_semaphore_deallocate (int semid)
{ union semun ignored_argument;
return semctl (semid, 1, IPC_RMID, ignored_argument);
}
8
Semafory – operace
int semop (int semid, struct sembuf semoparray[], size_t nops);
• Funkce umožňuje provádět operace nad semaforem
(jednotlivými čítači).
• Pole semoparray je pole operací nad semaforem:
struct sembuf {
ushort sem_num;
short sem_op;
short sem_flg;
}
/* číslo čítače v poli */
/* operace nad čítačem */
/* IPC_NOWAIT, SEM_UNDO */
• Nechť count je hodnota čítače.
9
Semafory – operace (2)
• sem_op - celé číslo specifikující operaci nad daným čítačem semaforu.
• Jak funguje sem_op:
– sem_op > 0 => sem_op se přičte k čítači semaforu.
– sem_op < 0 => absolutní hodnota sem_op se odečte od čítače
semaforu.
• Je-li po odečtení čítač semaforu záporný, volání se zablokuje, dokud
není hodnota semaforu tak velká jako absolutní hodnota sem_op.
– sem_op = 0 => zablokuje se volání, dokud není čítač semaforu
nulový.
• sem_flg - hodnota příznaku.
– Pokud chcete zabránit zablokování operace, používejte hodnotu
IPC_NOWAIT. Pokud by byla operace již zablokovaná, funkce vrátí
chybový návratový kód.
– Při IPC_UNDO jádro rozpozná v případě ukončení procesu, kolik
zdrojů proces alokoval a upraví hodnotu semaforu tak, aby ostatní
nezablokoval.
• Operace nad čítači semaforu jsou atomické.
10
Příklad: operace down()
/* Wait on a binary semaphore. Block until the semaphore value is
positive, then decrement it by one. */
int binary_semaphore_down (int semid)
{
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = -1;
operations[0].sem_flg = SEM_UNDO;
/* Use the first counter. */
/* Decrement by 1. */
/* Permit undo'ing. */
return semop (semid, operations, 1);
}
11
Příklad: operace up()
/* Post to a binary semaphore: increment its value by one. This
returns immediately. */
int binary_semaphore_up (int semid)
{
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = 1;
operations[0].sem_flg = SEM_UNDO;
/* Use the first counter */
/* Increment by 1. */
/* Permit undo'ing. */
return semop (semid, operations, 1);
}
12
Úkol
• Pomocí semaforů Systému V implementujte striktní
střídání dvou procesů A a B.
13
Fronty zpráv
•
Fronta je seznam zpráv navzájem provázaných odkazy, ukládán pomocí
jádra.
•
Každá fronta má unikátní identifikátor.
•
Nová fronta se vytvoří funkcí msgget(). Stejnou funkcí se otevře i již
existující fronta.
•
Informace se do fronty zapisují funkcí msgsnd() a vybírají pomocí
msgrcv().
•
Se založenou frontou lze provádět některé řídící operace pomocí
msgctl().
•
Nemusíme nutně vybírat zprávy metodou FIFO, ale můžeme je vybírat v
závislosti na jejich typu.
•
Ke každé frontě je přidělena odpovídající struktura msqid_ds (popsána v
<sys/msg.h>).
14
Kde najít další informace?
• Viz. odkazy na web stránce cvičení.
15

Podobné dokumenty

Informační systémy - Katedra automatizační techniky a řízení

Informační systémy - Katedra automatizační techniky a řízení INSERT INTO typyprace (tp_nazev, tp_popis, tp_cena) VALUES ('kvákání','skupinové',1000); INSERT INTO typyprace (tp_nazev, tp_popis, tp_cena) VALUES ('praní','každý kousek zvlášť',10); INSERT INTO t...

Více

• DT = datové typy • ADT/ADS = abstraktní datové typy / struktury

• DT = datové typy • ADT/ADS = abstraktní datové typy / struktury • seznam = způsob seskupení paměťových míst • lineární spojový seznam, zřetězený seznam (list) – dynamická datová struktura » dynamická alokace paměti, tvorba struktur – pole, stromy, grafy – nároč...

Více

zde

zde SMTe M. Údolí DDM Třešť DDM Třinec SMTe M. Údolí SMTe M. Údolí DDM Třinec DDM Český Těšín DDM Třinec SLEZSKO DDM Třinec Hukvaldy Hukvaldy SLEZSKO Hukvaldy SLEZSKO SMTe M. Údolí Hukvaldy DDM Třešť H...

Více

11 PLAN 9 - Fuky.org

11 PLAN 9 - Fuky.org vytvoření nebo zrušení adresáře, nastavení pracovního adresáře, vytvoření nebo zrušení speciálního souboru, který představuje periferii, test atributů existujícího souboru, adresáře nebo periferie,...

Více

Základy operačních systémů

Základy operačních systémů – Např. disky … Práce s hlavičkou disku Alokace dealokace bloků dat Víc programů chce sdílet stejné médium

Více