560 likes | 694 Views
This document explores the core concepts of processes and threads within operating systems. It details the management of process IDs, user IDs, thread-specific data, and environment settings. Key differences between user space and kernel space threads are discussed, alongside their advantages and disadvantages. Practical examples using POSIX threads (pthread) illustrate thread creation, joining, and synchronization techniques such as mutexes and semaphores. Additionally, it examines priority inversion problems and solutions to ensure efficient and safe threading in applications.
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