C-Sim verze 5.0
Charakteristika Softwarový nástroj pro simulaci v diskrétním čase Použitá metodou paralelních procesů Navržen podle vzoru jazyka SIMULA
Typy systémů Dynamické versus statické Spojité vs. diskrétní Otevřené vs. uzavřené Deterministické vs. stochastické
Metody diskrétní simulace Metoda interpretace událostí Metoda pseudo-paralelních procesů
Simulační krok (csim_step()) Spustí se proces na prvním místě kalendáře (vytvoří se nový proces nebo se předá se řízení existujícímu procesu) a zvýší se hodnota simulačního času. Proces vykonávající hlavní smyčku se zastaví. Provede se část kódu po kterou je konstantní simulační čas Spustí se proces s hlavní smyčkou a zastaví se proces z kalendáře
Stavy procesu
Implementace založená na dlouhých skocích funkce setjmp() uloží obsah registrů procesoru do struktury v paměti funkce longjmp() obnoví obsah registrů z paměti, výpočet pokračuje na místě volání setjmp(), zda jde o prvotní uložení nebo o návrat se rozliší podle návratové hodnoty setjmp().
Makro pro přepnutí procesů #define csim_switch_processes(from, to) if (setjmp(from->rollback) == 0) { longjmp(to->rollback, 1); }
Implementace založená na vláknech pro každý proces je vytvořeno jedno vlákno, hlavní smyčka simulace běží ve vlákně které vytváří a ukončuje všechnu ostatní vlákno má proměnnou thread_run, podmínkovou proměnnou (cond_var typu pthread_cond_t) a mutex (pthread_mutex_t).
Makro pro přepnutí procesů pthread_mutex_lock(&(_p_from->mutex)); _p_from->thread_run = FALSE; pthread_mutex_lock(&(_p_to->mutex)); _p_to->thread_run = TRUE; pthread_mutex_unlock(&(_p_to->mutex)); pthread_cond_signal(&(_p_to->cond_var)); while (_p_from->thread_run != TRUE) pthread_cond_wait (&(_p_from->cond_var), &(_p_from->mutex)); pthread_mutex_unlock(&(_p_from->mutex));
Porovnání implementace Dlouhé skoky Lepší přenositelnost Vyšší rychlost Nelze používat automatické proměnné Nelze vnořovat volání funkcí
Porovnání implementace POSIX vlákna Platforma musí podporovat POSIX vlákna Nižší rychlost Vlastní zásobník
Datové typy Jako v SIMULE: CSIM_LINK, CSIM_HEAD, CSIM_PROCESS Všechny odvozené od CSIM_DYN_MEM
Hierarchie datových typů
Mechanizmus odvozování datových typů Náhrada za dědičnost v objektovém jazyce pomocí maker typedef struct my_process { csim_d_process; int my_data; } MY_PROCESS;
Další vlastnosti Detekce chyb za běhu Statistika
Struktura a moduly
Použití Vložit hlavičkové soubory Definovat typy pro procesy (pokud je třeba) Napsat programy procesů Napsat hlavní smyčku
Typ procesu typedef struct { csim_d_process; float mi; float lambda; } WORKER;
Program procesu csim_program(WORKER, WORKER_PROG) for (;;) { csim_hold (csim_negexp(rng, my.lambda)); csim_lock_sem(p_sem); csim_hold (csim_negexp(rng, my.mi)); csim_unlock_sem(p_sem); } csim_end_program
Inicializace csim_init_mem(); p_sem = csim_new_semaphore(1); rng = csim_new_rng(1234); for (i=0; i<N; i++) { p_wrks[i] = csim_new_process(WORKER, WORKER_PROG); p_wrks[i]->mi = 1; p_wrks[i]->lambda = 0.5; csim_activate_at((CSIM_PROCESS *) p_wrks[i], 0); }
Hlavní smyčka while(csim_time() < ) { if (csim_step() == FAILURE) { CSIM_ERROR er; csim_error(&er); printf("%s\n", csim_error_msg(er.error_code)); break; } csim_clear_mem();