560 likes | 684 Views
Threads. Process ID, process group ID, user ID, and group ID Environment Working directory. Program instructions Registers Stack Heap File descriptors Signal actions Shared libraries
E N D
Threads Styresystemer og tjenester
Process ID, process group ID, user ID, and group ID • Environment • Working directory. • Program instructions • Registers • Stack • Heap • File descriptors • Signal actions • Shared libraries • Inter-process communication tools such as message queues, pipes, semaphores, or shared memory) Process Threads • Stack pointer • Registers • Scheduling properties (such as policy or priority) • Set of pending and blocked signals • Thread specific data. Styresystemer og tjenester
Threads User Space thread Kernel Space thread Styresystemer og tjenester
Threads • User Space thread: • Fordel: Effektive og fleksible. • Problemer: • Blocking systemkald blokere alle tråde. • Ingen timer interrupt så ingen Round-robin kan dog implementeres vha. signals. • Kernel Space thread • Fordel: Når en tråd blokere kan en anden tage over. • Ulempe: • Ikke så effektiv trådkald som User Spece threads. Styresystemer og tjenester
Threads Styresystemer og tjenester
Threads Anvendelse. Styresystemer og tjenester
int pthread_create (pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void), void *arg) ; Return 0 for OK ellers fejlkode. thread: Tråd ID. attr: Tråd atrubutter hvis NULL så default. start_routine: Kode der skal afvikles. arg: Evt argumenter til koden. void pthread_exit (void *value_ptr); value_ptr: Værdi til joining tråde. Ofte NULL. int pthread_join (pthread_t thread, void **value_ptr); Return 0 for OK ellers fejlkode. Thread: Joining tråd ID. value_ptr: Værdi fra joining tråde. Threads systemkald. Styresystemer og tjenester
void pthread_yield (); int pthread_setschedparam (thread, schedpolicy, schedparam); Threads systemkald. Styresystemer og tjenester
#include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { printf("\n%d: Hello World!\n", threadid); pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc, t; for(t=0;t < NUM_THREADS;t++){ printf("Creating thread %d\n", t); rc=pthread_create(&threads[t], NULL, PrintHello, (void *)t); if (rc){ printf("ERROR; from pthread_create() is %d\n", rc); exit(-1); } } pthread_exit(NULL); } Thread eksempel. Styresystemer og tjenester
Thread - processes Time : ms Styresystemer og tjenester
Synkronisering. Styresystemer og tjenester
Peterson’s algoritme. Styresystemer og tjenester
Test og set instruktion. Intel fx: BST Motorola: BSET Styresystemer og tjenester
Priority inversion problem. Busy waiting. P1 lav prioritet. P2 høj prioritet. P1 og P2 anvender samme ressource R1. P1 starter først og går ind i R1. P2 starter og overtager CPU (høj prioritet.) og busy waiter ved R1. ---- Løsning: blokkerende mutual exclusion kald. Styresystemer og tjenester
Semafor, Mutex, Condition variables. Atomart system-kald, der tester, sætter og blokkerer, hvis nødvendigt: int pthread_mutex_lock (mutex) int pthread_mutex_unlock (mutex) int pthread_cond_wait (condition); int pthread_cond_signal (condition) Eller mit Systen V kald: sem_create (&semafor, key, 1); sem_wait(semafor); sem_signal(semafor); Eller Java: semafor= new Semaphor(1); semafor.sem_wait(); semafor.sem_signal(); Styresystemer og tjenester
Semafor Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key sem_id Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key sem_id Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key sem_id Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key sem_id Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key sem_id Styresystemer og tjenester
System V: Semafor. . key= ftok (".", 'a'); sem_create (&sem_id, key, 0); . sem_wait (sem_id); . key= ftok (".", 'a'); sem_get(&sem_id,key); . sem_signal (sem_id); Applikation: Operativsystem: key sem_id Styresystemer og tjenester
Posix: Semafor. . Sem_id = sem_open(”/sem1”, O_CREAT , 0644 , 1); . sem_wait (sem_id); . Sem_id = sem_open(”/sem1”, 0, mode,value); . sem_post (sem_id); Applikation: Operativsystem: /tmp/.SEMDsem1 /tmp/.SEMLsem1 Styresystemer og tjenester
Semafor void wait(SEM *sem) { disable (sem->value)--; if (sem->value < 0) { deQ(RunningTcb); enQ(sem->TcbQue,RunningTcb); dispatcher(); } enable } void signal(SEM *sem) { TCB *e; disable (sem->value)++; if (sem->value <= 0) { e= sem->TcbQue->next; deQ(e); prioenQ(AkQ,e); dispatcher(); } enable } typedef struct tcb { struct tcb *next; struct tcb *pred; int pid; char *sp; int prio; } TCB; typedef struct { int value; TCB *TcbQue; } SEM;
Synkronisering. • Ressourcemæssige forhold: Mutual exclusion. • Tidsmæssige forhold: Timing. • Kommunikationsmæssige forhold: IPC Styresystemer og tjenester
Message passing. Send(kø,’A’); kø A Receive(kø,&besked); Hvis der er en besked, så return ellers blokker indtil besked sendt. Styresystemer og tjenester
Producer-consumer i endelig kø. Styresystemer og tjenester
Monitor Kun en procedure/funktion af gangen. Styresystemer og tjenester
Monitor Styresystemer og tjenester
Klassiske IPC-typer. • Pipe • Named pipes eller FIFO’s • Message Gueues • Shared memory Styresystemer og tjenester
Pipe int fd[2]; pipe(fd); // Inden fork() write(fd[1],....); // En proces. read(fd[0],....); // En anden proces. fd[0] fd[1] Styresystemer og tjenester
Pipe #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(void) { int fd[2], nbytes; pid_t pid; char string[] = "Hello, world!\n"; char readbuffer[80]; pipe(fd); pid = fork(); if(pid == 0) { close(fd[0]); // Child process closes up input side of pipe write(fd[1], string, (strlen(string)+1)); // Send "string" exit(0); } else { close(fd[1]); // Parent process closes up output side of pipe nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); // Read pipe printf("Received string: %s", readbuffer); } } Styresystemer og tjenester
Named pipes eller FIFO’s. • Named pipes eksisterer som en device fil i filsystenet. • Processer med forskellige forældre kan udvæksle data gennem named pipe. • Når processer er færdige med at udvæksle data forbliver named pipes i filsystemet. Device fil kaldt minfifo mkfifo minfifo fp = fopen(”minfifo”, ”w”); fputs(”go dav do”, fp); fp = fopen(”minfifo”, ”r”); fgets(readbuf, 80, fp); Styresystemer og tjenester
Message Gueues. • En FIFO kø der oprettes i operativsystemet vha en key. . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1, 0); . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . qbuf->mtype = type; msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0); Applikation: Operativsystem: Styresystemer og tjenester
Message Gueues. . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1, 0); . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . qbuf->mtype = type; msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0); Applikation: Operativsystem: key Styresystemer og tjenester
Message Gueues. . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1, 0); . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . qbuf->mtype = type; msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0); Applikation: kø Operativsystem: key Styresystemer og tjenester
Message Gueues. . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1, 0); . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . qbuf->mtype = type; msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0); Applikation: kø qbuf Operativsystem: key Styresystemer og tjenester
Message Gueues. . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1, 0); Applikation: . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0); kø qbuf Operativsystem: key Styresystemer og tjenester
Message Gueues. . key= ftok (".", 'a'); qid = msgget(key, IPC_CREAT|0660); . msgsnd(qid, (struct msgbuf *)qbuf, strlen(qbuf->mtext)+1, 0); struct msgbuf { long mtype; /* type of message */ char mtext[1]; /* message text */ }; • Datatype. • Modtager adresse. • .... Styresystemer og tjenester
Message Gueues. • En FIFO kø der oprettes i operativsystemet vha navn. . mqfd = mq_open("myipc", O_CREAT|O_RDWR , 0666,&attr); . mq_send(mqfd,buffer,num_bytes,priority); Applikation: . mqfd = mq_open("myipc", O_CREAT|O_RDWR , 0666,&attr); . num_bytes_received = mq_receive(mqfd, buffer,MAX_MSGSIZE,0); Operativsystem: Styresystemer og tjenester
Shared memory. • Delt memory mellem flere processer. • Den hurtigste form for IPC. • Men husk mutual exclusion. key= ftok (".", 'a'); char *mem; if ((shmid = shmget (key, size, IPC_CREAT | IPC_EXCL | 0666)) == -1){ error; } mem= shmat (shmid, 0, 0); . key= ftok (".", 'a'); char *mem; if ((shmid = shmget (key, size, 0)) == -1) { error; } mem= shmat (shmid, 0, 0); Applikation: Operativsystem: shm Styresystemer og tjenester
Posix shared memory. fd = shm_open (shmname, O_RDWR | O_CREAT , S_IRWXU | S_IRWXG | S_IRWXO); char *array = mmap (0, MEMSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); Styresystemer og tjenester
Ressourcer • Ressourcer • Printer • Skærm • Disk • Data strukturer. • Kun en af gangen vha mutex, semafor, … • Ofte bruges flere end en ressource samtidig. Fx data-disk, disk-printer osv. • Hvis P1 og P2 skal bruge ressource A og B…… så pas på ! Styresystemer og tjenester
Betingelse for deadlock • Mutual exclusion betingelse. • Hver ressourse er taget af 1 proces eller også er den ledig. • Hold and wait betingelse. • Processer kan tage mere end en ressource af gangen. • No preemption betingelse. • Allerede tagene ressourcer kan ikke fratages processen. • Circular wait betingelse. • Der er en cikulær kæde af mindst to processer hvor hver • proces venter på en ressource som er taget af en anden proces. Styresystemer og tjenester
Deadlock Styresystemer og tjenester
Håndtering af deadlock • Detection and recovery • Dynamik avoidance • careful ressource allocation • Prevention • Fjern en af de fire betingelser. Styresystemer og tjenester
Recovery • Recovery vha. preemption • Tag en ressource fra en proces • Recovery vha. rollback • Perodiske checkpoint. • Restart processen fra sikker tilstand hvis deadlock. • Recovery vha. at afbryde en proces. Styresystemer og tjenester
Håndtering af deadlock • Detection and recovery • Dynamik avoidance • careful ressource allocation • Prevention • Fjern en af de fire betingelser. Styresystemer og tjenester