rndr. andrej lúčny microstep-misprocesy: names pid1 pid2 proces manager každý vie svoj vlastný...

30
QNX RNDr. Andrej Lúčny MicroStep-MIS [email protected] http://www.microstep-mis.sk/~andy

Upload: others

Post on 07-Feb-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

QNX

RNDr. Andrej Lúčny

MicroStep-MIS

[email protected]

http://www.microstep-mis.sk/~andy

Page 2: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

aplikačnáprezentačná

relačnátransportná

sieťováspojováfyzická

mid

dle

tier

aplikačnáprezentačná

relačnátransportná

sieťováspojováfyzická

IPC

Implementácia MAS

LAN / WAN

Page 3: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

QNX4

• RTOS pre PC• Reálny čas = garantovaná odozva

(latency=2µs)• IPC založené na message passing-u• Blokujúci a neblokujúci• Rovnaký komunikačný model pre IPC a

LAN

Page 4: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Procesy: pid

pid1 pid2

OS

jeden Proces môže komunikovať s druhým pokiaľ vie jeho pid

Page 5: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Procesy: names

pid1 pid2

proces manager

Každý vie svoj vlastný pid (a pid

otca)

„poznač, že Jano má pid

21034“prideľuje jedinečné

pidy a spravuje mená, má fixne pid 1

„Aký pid má teraz Jano ?“

Page 6: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Procesy: names

pid1 pid2

proces manager

Každý vie svoj vlastný pid (a pid

otca)

„poznač, že Jano má pid

21034“prideľuje jedinečné

pidy a spravuje mená, má fixne pid 1

„Aký pid má teraz Jano ?“

name_locate() name_attach()

Page 7: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Procesy: komunikácia

pid1 pid2

OS

data

kernel

Send() Receive()Reply()

Page 8: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Procesy: komunikácia

pid1 pid2

OS

data

kernel

Page 9: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Procesy: stavy

SEND-BLOCKED

REPLY-BLOCKED

RECEIVE-BLOCKEDREADY

Page 10: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

SRR model

data

data

Receive()

Reply()

Send()

senderreceiver

RECEIVE-BLOCKED

READY

REPLY-BLOCKED

READY

READY

READY

Page 11: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

SRR model

data

data

Receive()

Reply()

Send()

senderreceiver

SEND-BLOCKED

READY

REPLY-BLOCKED

READY

READY

Page 12: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

SRR model

data

data

Receive()

Reply()

Send()

senderreceiver

RECEIVE-BLOCKED

READY

REPLY-BLOCKED

READY

READY

READY

data

data

Receive()

Reply()

Send()

senderreceiver

SEND-BLOCKED

READY

REPLY-BLOCKED

READY

READY

Ktorú možnosť si programátor želá ?

Page 13: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Primitívy

SRR model

Send (pid, send-data, replied-data, sizeof-send-data, sizeof-replied-data);

pid-of-sender = Receive (0, send-data, size-of-send-data);

Reply(pid-of-sender, replied-data, sizeof-replied-data);

Kto zaručí, že tieto veľkosti si budú

zodpovedať ?

Page 14: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

SRR model

neblokujúce posielanie správ• virtuálny proces proxy

• virtuálny proces timer

• virtuálny circuit

komunikácia cez LAN

Page 15: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

SRR model

proxy pid

Receive()

Trigger()

userowner

RECEIVE-BLOCKED

READY

READY

READY

Pproxy

proxy pid

Receive()

Trigger()

userowner

READY READY

Pproxy

Pproxy

pidp = proxy_attach(0,0,0,-1)

Trigger(pidp)

Page 16: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

SRR model

Receive()

owner

RECEIVE-BLOCKED

READY

READY

P Tproxy timer

Receive()RECEIVE-BLOCKED

READY

P Tproxy timer

Receive()RECEIVE-BLOCKED

READY

P Tproxy timer

pidt = timer_create(-pidp)

timer_set(pidt, typ, sec0, nsec0, sec, nsec )

TIMER

Page 17: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

typedef struct server_msg {short header;short action;union {

...} data;

};#define SERVER_HAEDER 'SH'#define SERVER_ACTION1 'A1'...#define SERVER_ACTIONx 'Ax'main () {

struct server_msg msg;// inicializaciafor (;;) {

pid = Receive(0,&msg,sizeof(msg));if (msg.header != SERVER_HEADER)

continue;switch (msg.action) {

case SERVER_ACTION1:// spracuj msgbreak;

...case SERVER_ACTIONx:

...break;

}Reply(pid,&msg,sizeof(msg));

}}

main () {

struct server_msg msg;// inicializaciapid = name_locate("...");msg.header = SERVER_HEADER;msg.action = SERVER_ACTIONy;// naplni msg.data;Send(pid,&msg,&msg,

sizeof(msg),sizeof(msg));// spracuje msg.data

}

main (){

// inicializaciapids = name_locate("...");pidp = proxy_attach();pidt = timer_create(-pidp)timer_set(pidt,RELATIVE,0,0,1,0);for (;;) {

pid = Receive(0,NULL,0);if (pid == pidp) {

// vytvor msgSend(pids,&msg,&msg,

sizeof(msg),sizeof(msg));// spracuj msg

}}

}

ServerClient-utilita

Client-data collector

Page 18: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Agent-Space

Architektúra založená na nepriamej komunikácii medzi agentami

Každý proces je buď

• agent

alebo

• space

Page 19: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

agent agent

blocks in space

Read (ask) write (tell)

data flow

name

Implementácia Agent - Spacepod QNX

SPACE

P

blocks in space

agent agent

write

data flow

readproxy

notification

trigger registration name

Page 20: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Space

typedef struct server_port {pid_t pid;...

};

main (){

struct server_msg msg;struct server_port *port;// inicializaciaports_init();for (;;) {

pid = Receive(0,&msg,sizeof(msg));if (msg.header != SERVER_HEADER)

continue;ports_reinit();if ((port = port_get(pid)) == -1) {

port = port_new();port_setdefaults(port);

}

switch (msg.action) {case WRITE:

// spracuj *port a msgbreak;

case READ:...break;

case TRIGGER:...break;

...}Reply(pid,&msg,sizeof(msg));

}}

Page 21: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Agentvoid main (){

// initializationpids = qnx_name_locate(0,”SPACE”);pidp = qnx_proxy_attach(0,0,0,-1);pidt = timer_create(-pidp);timer_set(pidt,RELATIVE,0,0,...);for (;;) {

pid = Receive(0,NULL,0); // Receive(trigger_proxy,NULL,0);if (pid == pidp) {

// senseSend(pids,...);Send(pids,...);Send(pids,...); ...// select...// actSend(pids,...);Send(pids,...);Send(pids,...); ...

}}

}

Page 22: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

agent agent agent

space

device

agent

device

agent

space

agent

agent

user user

Agent-Space

Page 23: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Dátový tok

• Client-server je jednou z realizácii dátového toku

producer

consumers

producer

consumers

traditional client-server

producer

consumers

agent-space

Page 24: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Štruktúra kódu

• Space(y) obsahuje len komunikačný kód

• Agenti obsahujú len aplikačný kód

Page 25: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

10,11,12,13,14

slow

fast 10,11,12,13,14

10, 12, 14

• dead lock nemôže nastať

• live lock – každý proces dobrovolne opúšťa procesor

• podpora reálneho času – vyplýva z povahy informácie v Space – natívne vzorkovanie

Vlastnosti

Page 26: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Vzťah ku Client-Server

Agent je špeciálnejší client

Space je špeciálnejší server

Page 27: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Vývojové prostriedky

• File manager: nc• Editor: vp• Compiler: Watcom C: cc• Toolkit: Space: MsEnv –N <name>• Toolkit: MsAgent.h, MsAgent.Lib• Project ALLEN

Page 28: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

MsAgent toolkit

# MsEnv –N ALLEN &# joridrv &# agwi forward 1# agwi forward 0# agent &

Page 29: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

MsAgent library

MsAgentInsTrigger (proxy-pid, block-name, 0, 0, timeout-s, timeout-ms);

MsAgentInsTrigger (proxy-pid, NULL, period-s, period-ms, 0, 0);

MsAgentRead (block-name, read-data, sizeof-read-data, return-code);

MsAgentWrite (block-name, written-data, sizeof-written-data, return-code);

MsAgent (space-name, NULL);

Page 30: RNDr. Andrej Lúčny MicroStep-MISProcesy: names pid1 pid2 proces manager Každý vie svoj vlastný pid (a pid otca) „poznač, že Jano má pid 21034“ prideľuje jedinečné pidy

Agentvoid main (){

// initialization...pidp = qnx_proxy_attach(0,0,0,-1);pidt = MsAgentInsTrigger(pidp,NULL,0,500000000,0,0);MsAgent(“ALLEN”,NULL);for (;;) {

pid = Receive(pidp,NULL,0);// senseMsAgentRead(“block1”,&block1,sizeof(block1),&ok1);block2 = def_value;MsAgentRead(“block2”,&block2,sizeof(block2),NULL);MsAgent(“ALLEN”,NULL);// select...

// actMsAgentWrite(“block3”,&block3,sizeof(block3),NULL);MsAgent(“ALLEN”,NULL);

}}