|
Contents
|
Ectat actuel sur la caméra : | Valeurs proposées pour le module de test : | ||||||||||||||||||||||||||||||||||||
|
|
Voici un programme simplifié
permettant de tester cette architecture.
A l'édition des liens, il faut indiquer la librairie adéquate : gcc -lpthread simuServer.c
.
Sous linux, 3 ordonnancements co-existent.
S'il existe un ou plusieurs processus FIFO ou RR, ils sont séléctionnés en premier. Lors de la phase de débugage, il est important de conserver un shell s'exécutant à un niveau de priorité supérieur. Attention lors du fork, il faut placer la modification de priorité dans le code du processus père.
Les threads sont des processus allégés ne réclamant que peu de ressources pour les changements de contexte. Chaque thread dispose personnellement d'une pile et d'un contexte d'exécution contenant les registres du processeur et un compteur d'instruction. En revanche, ils se partagent les données statiques et dynamiques.
Sous LINUX, l'implémentation usuelle des threads est effectuée dans l'espace noyau.
Remarque : un thread finissant envoie un signal au thread parent si celui-ci n'est pas trappe le thread ne meurt pas ... seul le systeme le fera disparaitre 1 mn plus tard. Ainsi, pour ne pas borner le nombre de threads lancés par le nombre de threads qu'il est possible de lancer en même temps, il faut soit utiliser la fonction pthread_join
soit détacher les threads.
Comme pour les processus, on peut modifier l'ordonnancement des threads.
Les ordonnancements temps-réel nécessitent un UID effectif nul, sinon la fonction pthread_create
échouera avec l'erreur EPERM.
Les serveurs embarqués pour HESS utilisent 2 thread, le fils principal devenant alors le second thread :
/* privilèges root */ setuid(geteuid()); /* processus privilégié * attention, les tread créés sans l'attribut 'PTHREAD_EXPLICIT_SCHED' * hériteront de la nouvelle priorité */ paramSocketServer.sched_priority = thread_prior_max - SERVER_PRIORITY; sched_setscheduler(0, __SCHEDULER_POLICY, ¶mSocketServer) /* construction du thread executant la fonction 'Scheduler' */ pthread_attr_setdetachstate(&threadAttributs, PTHREAD_CREATE_DETACHED) pthread_attr_setschedpolicy(&threadAttributs, __SCHEDULER_POLICY) pthread_attr_setinheritsched(&threadAttributs, PTHREAD_EXPLICIT_SCHED) paramThreadScheduler.sched_priority = thread_prior_max - SCHEDULER_PRIORITY pthread_attr_setschedparam(&threadAttributs, ¶mThreadScheduler) pthread_create(&threadScheduler, &threadAttributs, Scheduler, NULL) /* definition des thread qui éxecuteront la fonction process_message */ pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED) pthread_attr_setschedpolicy(&thread_attr, __SCHEDULER_POLICY) pthread_attr_setinheritsched(&thread_attr, PTHREAD_EXPLICIT_SCHED) scheduler._parameters.sched_priority = thread_prior_max - BIG_SCHEDULER_PRIORITY pthread_attr_setschedparam(&thread_attr, &scheduler._parameters) /* rendre les privilèges */ setuid(realUserIdentifier); /* lancement du serveur de socket */ tcp_server();
Les serveurs embarqués pour HESS utilisent un schéma séquentiel.
/* creation de la socket standardiste */ sock_contact = socket(AF_INET, SOCK_STREAM, 0) bind(sock_contact, ...) listen(sock_contact, ...) /* connexion sequentielle aux clients */ while(loop) { sock_dialog = accept(sock_contact, ...) process_connection(sock_dialog)
Ce schéma sequentiel peut alors déboucher sur une prise en charge parallèle :
if (...) { /* traitement sequentiel */ ... } else { /* thread executant la fonction 'process_message' avec en paramètre la socket */ pthread_create(&thread_producer[n], &producer__attr, process_message, (void *)sock))) }
Remarque : CLOSE_WAIT
is when the other endpoint have closed the connection and the kernel is vaiting for the application to confirm the close by closing the socket descriptor. There is no timeout for CLOSE_WAIT
. It persists for as long as the application has not closed the socket.
# netstat -nap Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 55 0 192.168.1.169:1806 134.158.155.234:53291 CLOSE_WAIT -
orders: SHUT_ | PING_ | preposition stanza ENDMSG | stanza ENDMSG preposition: BEGIN | FAST_ stanza: order : stanza order order: CAMERA camera | NODE farm | FIFO fifo | DRAWER drawer | DAEMON daemon | RUN run | TASK task | INI drawer2 | TRG | ACK FIFODATA_EMPTY | ACK FIFODATA_PROBE_EVTSIZE | ??? | ...
camera: CONFIGURE | SAFE | RUN | STOP | FIFODATA_PROBE_EVTSIZE
farm: CONTROLLER node | MONITORING node | ADD 0x%4X%n node | CURRENT %d | DELETE %d | DISABLE %d | ENABLE %d | FREQUENCY %d | LIST node: %s %s %s%n { %x%n}+
fifo: RESET | RESET_INTERFACE | INIT_BOXBUS | RESET_WFIFO | RESET_RFIFO
drawer: TARGET | SET_CNTRL_SLC | SET_CNTRL_DAQ | SET_CNTRL_L2 | SET_CNTRL_SAM_DAQ | SET_CNTRL_SAM_ND | SET_CNTRL_SAM_REGISTER | SET_CNTRL_TRIGGER | SET_TRIGGER_DISABLE | SET_CNTRL_VOLTAGE | SET_HV_OFF | SET_VOLTAGE_VALUE | SET_VOLTAGE_LEVEL
daemon: DEBUG %X | CLEARSCREEN | INIT_DAQ
run: START | STOP | INIT
task: STATUS | LIST | UNLOCK | ADD | SCHEDULER_DELAY %d | FREQUENCY %d | DELETE | ENABLE | DISABLE
drawer2: cmdId label ... | | | | ...
Home | Up |