task control: signals and alarms chapter 7 and 8

35
Page 1 Task Control: Signals and Alarms Chapter 7 and 8 B. Ramamurthy

Upload: lavey

Post on 19-Jan-2016

24 views

Category:

Documents


0 download

DESCRIPTION

Task Control: Signals and Alarms Chapter 7 and 8. B. Ramamurthy. Multi-tasking. How to create multiple tasks? Ex: Xinu create() How to control them? ready() resched() How to synchronize them? How to communicate among them? XINU: semaphores, send and receive messages - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Task Control: Signals and Alarms Chapter 7 and 8

Page 1

Task Control:Signals and AlarmsChapter 7 and 8

B. Ramamurthy

Page 2: Task Control: Signals and Alarms Chapter 7 and 8

Page 2

Multi-tasking

• How to create multiple tasks? Ex: Xinu create() • How to control them?

– ready()– resched()

• How to synchronize them? How to communicate among them?

• XINU: semaphores, send and receive messages

• How to (software) interrupt a process? signals

Page 3: Task Control: Signals and Alarms Chapter 7 and 8

Page 3

Examples

• Consider g++ myProg.c– You want to kill this process after you started the

compilation..hit cntrl-C

• Consider execution of a program called “badprog”>badprogIt core dumps .. What happened? The error in the

program results in a signal to kernel to stop and dump the offending code

• Consider “kill –p <pid>”– Kill issues a termination signal to the process

identified by the pid

Page 4: Task Control: Signals and Alarms Chapter 7 and 8

Linux Processes

• Similar to XINU Procs.• Lets understand how to create a

linux process and control it.• Chapter 7 and 8 of text book.• Chapter 7 : multi-tasking• Chapter 8: Task communication

and synchronization

Page 4

Page 5: Task Control: Signals and Alarms Chapter 7 and 8

Page 5

Process creation• Four common events that lead to a process

creation are:1) When a new batch-job is presented for

execution.2) When an interactive user logs in / system

initialization.3) When OS needs to perform an operation

(usually IO) on behalf of a user process, concurrently with that process.

4) To exploit parallelism an user process can spawn a number of processes.

Page 6: Task Control: Signals and Alarms Chapter 7 and 8

Page 6

Termination of a process• Normal completion, time limit exceeded, memory

unavailable• Bounds violation, protection error, arithmetic error,

invalid instruction• IO failure, Operator intervention, parent

termination, parent request, killed by another process

• A number of other conditions are possible. • Segmentation fault : usually happens when you

try write/read into/from a non-existent array/structure/object component. Or access a pointer to a dynamic data before creating it. (new etc.)

• Bus error: Related to function call and return. You have messed up the stack where the return address or parameters are stored.

Page 7: Task Control: Signals and Alarms Chapter 7 and 8

Page 7

Process control

• Process creation in unix is by means of the system call fork().

• OS in response to a fork() call:– Allocate slot in the process table for new process.– Assigns unique pid to the new process..– Makes a copy of the process image, except for

the shared memory.– both child and parent are executing the same

code following fork()– Move child process to Ready queue. – it returns pid of the child to the parent, and

a zero value to the child.

Page 8: Task Control: Signals and Alarms Chapter 7 and 8

Page 8

Process control (contd.)

• All the above are done in the kernel mode in the process context. When the kernel completes these it does one of the following as a part of the dispatcher:– Stay in the parent process. Control returns to

the user mode at the point of the fork call of the parent.

– Transfer control to the child process. The child process begins executing at the same point in the code as the parent, at the return from the fork call.

– Transfer control another process leaving both parent and child in the Ready state.

Page 9: Task Control: Signals and Alarms Chapter 7 and 8

Page 9

Process Creation (contd.)

• Parent process create children processes, which, in turn create other processes, forming a tree of processes

• Generally, process identified and managed via a process identifier (pid)

• Resource sharing– Parent and children share all resources– Children share subset of parent’s resources– Parent and child share no resources

• Execution– Parent and children execute concurrently– Parent waits until children terminate

Page 10: Task Control: Signals and Alarms Chapter 7 and 8

Page 10

Process Termination

• Process executes last statement and asks the operating system to delete it (exit)– Output data from child to parent (via wait)– Process’ resources are deallocated by operating system

• Parent may terminate execution of children processes (abort)– Child has exceeded allocated resources– Task assigned to child is no longer required– If parent is exiting

• Some operating system do not allow child to continue if its parent terminates– All children terminated - cascading termination

Page 11: Task Control: Signals and Alarms Chapter 7 and 8

04/21/23Page 11

Task State Diagram

Ready

Blocked

New

Run

Task admitted

Resources allocated

Dispatched; cpu allocated

Waiting for event

Even

t occ

urred

Task exit

Page 12: Task Control: Signals and Alarms Chapter 7 and 8

Resources & Critical Resources

• Shared resources: need mutual exclusion• Tasks cooperating to complete a job• Tasks contending to access a resource• Tasks synchronizing • Critical resources and critical region• A important synchronization and mutual

exclusion primitive / resource is “semaphore”

04/21/23Page 12

Page 13: Task Control: Signals and Alarms Chapter 7 and 8

04/21/23Page 13

Critical sections and Semaphores

• When multiples tasks are executing there may be sections where only one task could execute at a given time: critical region or critical section

• There may be resources which can be accessed only be one of the processes: critical resource

• Semaphores can be used to ensure mutual exclusion to critical sections and critical resources

Page 14: Task Control: Signals and Alarms Chapter 7 and 8

04/21/23Page 14

Semaphores

See semaphore.h of xinu

Page 15: Task Control: Signals and Alarms Chapter 7 and 8

Semaphores in exinu• #include <kernel.h>• #include <queue.h> /**< queue.h must define # of sem queues */

• /* Semaphore state definitions */• #define SFREE 0x01 /**< this semaphore is free */• #define SUSED 0x02 /**< this semaphore is used */

• /* type definition of "semaphore" */• typedef ulong semaphore;

• /* Semaphore table entry */• struct sentry• {• char state; /**< the state SFREE or SUSED */• short count; /**< count for this semaphore */• queue queue; /**< requires q.h. */• };

15

Page 16: Task Control: Signals and Alarms Chapter 7 and 8

Semaphores in exinu (contd.)

• extern struct sentry semtab[];

• /**• * isbadsem - check validity of reqested semaphore id and state• * @param s id number to test; NSEM is declared to be 100 in kernel.h• A system typically has a predetermined limited number of semaphores• */• #define isbadsem(s) (((ushort)(s) >= NSEM) || (SFREE ==

semtab[s].state))

• /* Semaphore function declarations */• syscall wait(semaphore);• syscall signal(semaphore);• syscall signaln(semaphore, short);• semaphore newsem(short);• syscall freesem(semaphore);• syscall scount(semaphore);

16

Page 17: Task Control: Signals and Alarms Chapter 7 and 8

Definition of Semaphores functions

• static semaphore allocsem(void);• /**• * newsem - allocate and initialize a new semaphore.• * @param count - number of resources available without waiting.• * example: count = 1 for mutual exclusion lock• * @return new semaphore id on success, SYSERR on failure• */• semaphore newsem(short count)• {• irqmask ps;• semaphore sem;• ps = disable(); /* disable interrupts */• sem = allocsem(); /* request new semaphore */• if ( sem != SYSERR && count >= 0 ) /* safety check */• {• semtab[sem].count = count; /* initialize count */• restore(ps); /* restore interrupts */• return sem; /* return semaphore id */• }• restore(ps);• }

17

Page 18: Task Control: Signals and Alarms Chapter 7 and 8

Semaphore: newsem contd.

• /**• * allocsem - allocate an unused semaphore and return its index.• * Scan the global semaphore table for a free entry, mark the entry• * used, and return the new semaphore• * @return available semaphore id on success, SYSERR on failure• */• static semaphore allocsem(void)• {• int i = 0;• while(i < NSEM) /* loop through semaphore table */• { /* to find SFREE semaphore */• if( semtab[i].state == SFREE )• {• semtab[i].state = SUSED;• return i;• }• i++;• }• return SYSERR; }

18

Page 19: Task Control: Signals and Alarms Chapter 7 and 8

Semaphore: wait(…)• /**• * wait - make current process wait on a semaphore• * @param sem semaphore for which to wait• * @return OK on success, SYSERR on failure• */• syscall wait(semaphore sem)• {• irqmask ps;• struct sentry *psem;• pcb *ppcb;• ps = disable(); /* disable interrupts */• if ( isbadsem(sem) ) /* safety check */• {• restore(ps);• return SYSERR;• }• ppcb = &proctab[currpid]; /* retrieve pcb from process table */• psem = &semtab[sem]; /* retrieve semaphore entry */• if( --(psem->count) < 0 ) /* if requested resource is unavailable */• {• ppcb->state = PRWAIT; /* set process state to PRWAIT*/

19

Page 20: Task Control: Signals and Alarms Chapter 7 and 8

Semaphore: wait()

• ppcb->sem = sem; /* record semaphore id in pcb */• enqueue(currpid, psem->queue);• resched(); /* place in wait queue and reschedule */• }• restore(ps); /* restore interrupts */• return OK;• }

20

Page 21: Task Control: Signals and Alarms Chapter 7 and 8

Semaphore: signal()• /*signal - signal a semaphore, releasing one waiting process, and block• * @param sem id of semaphore to signal• * @return OK on success, SYSERR on failure• */• syscall signal(semaphore sem)• {• irqmask ps;• register struct sentry *psem;

• ps = disable(); /* disable interrupts */• if ( isbadsem(sem) ) /* safety check */• {• restore(ps);• return SYSERR;• }• psem = &semtab[sem]; /* retrieve semaphore entry */• if ( (psem->count++) < 0 ) /* release one process from wait queue */• { ready(dequeue(psem->queue), RESCHED_YES); }• restore(ps); /* restore interrupts */• return OK;• }

21

Page 22: Task Control: Signals and Alarms Chapter 7 and 8

Semaphore: usage

• Problem 1: – Create 3 tasks that each sleep for a random

time and update a counter. – Counter is the critical resources shared

among the processes.– Only one task can update the counter at a

time so that counter value is correct.• Problem 2:

– Create 3 tasks; task 1 updates the counter by 1 and then signal task 2 that updates the counter by 2 and then signals task 3 to update the counter by 3.

22

Page 23: Task Control: Signals and Alarms Chapter 7 and 8

Problem 1

#include <..>//declare semaphoresemaphore mutex1 = newsem(1);int counter = 0;//declare functions: proc1,proc1, proc3ready(create((void *)proc1, INITSTK, INITPRIO,

“PROC1",, 2, 0, NULL), RESCHED_NO);ready(create((void *)proc2, INITSTK, INITPRIO,

“PROC2",, 2, 0, NULL), RESCHED_NO); ready(create((void *)proc3, INITSTK, INITPRIO,

“PROC3",, 2, 0, NULL), RESCHED_NO);

23

Page 24: Task Control: Signals and Alarms Chapter 7 and 8

Problem 1: multi-tasks

void proc1(){ while (1) { sleep (rand()%10); wait(mutex1); counter++; signal(mutex1);} } void proc2(){ while (1) { sleep (rand()%10); wait(mutex1); counter++; signal(mutex1);} } //similarly proc3

24

Page 25: Task Control: Signals and Alarms Chapter 7 and 8

Problem 1

25

Task 1 Task 2

Task 3

Counter1

Page 26: Task Control: Signals and Alarms Chapter 7 and 8

Problem 2

semaphore synch12 = newsem(0);semaphore synch23 = newsem(0);semaphore synch31 = newsem(0);ready(create((void *)proc1, INITSTK, INITPRIO,

“PROC1",, 2, 0, NULL), RESCHED_NO);ready(create((void *)proc2, INITSTK, INITPRIO,

“PROC2",, 2, 0, NULL), RESCHED_NO); ready(create((void *)proc3, INITSTK, INITPRIO,

“PROC3",, 2, 0, NULL), RESCHED_NO);signal(synch31);

26

Page 27: Task Control: Signals and Alarms Chapter 7 and 8

Task flow

27

Page 28: Task Control: Signals and Alarms Chapter 7 and 8

Page 28

Signals

• Signals provide a simple method for transmitting software interrupts to UNIX process

• Signals cannot carry information directly, which limits their usefulness as an general inter-process communication mechanism

• However each type of signal is given a mnemonic name; Ex: SIGINT

• See signal.h for others• SIGHUP, SIGINT, SIGILL, SIGTRAP, SIGFPE, SIGKILL• SIGALRM (sent by kernel to a process after an

alarm timer has expired)• SIGTERM • signal (signal id, function) simply arms the signal

Page 29: Task Control: Signals and Alarms Chapter 7 and 8

Intercept Signals

Page 29

Task1

Task2

Two essential parameters are destination process identifierand the signal code number: kill (pid, signal)Signals are a useful way of handling intermittent data arrivals or rare errorconditions.

Page 30: Task Control: Signals and Alarms Chapter 7 and 8

Page 30

Handling Signals

• Look at the examples:• Catching SIGALRM • Ignoring SIGALRM• sigtest.c• sigHandler.c• pingpong.c• See /usr/include/sys/iso/signal_iso.h for

signal numbers

Page 31: Task Control: Signals and Alarms Chapter 7 and 8

Page 31

Signals and Alarms#include <signal.h> unsigned int alarm( unsigned int seconds ); alarm(a); will start a timer for a secsonds and will interrupt

the calling process after a secs.time(&t); will get you current time in the variable t

declared as time_t tctime(&t); will convert time to ascii formatAlarm has a sigaction function that is set for configuring

the alarm handler etc.sigaction(SIGALRM, &act, &oldact) ; the third paramter is

for old action configuration

Page 32: Task Control: Signals and Alarms Chapter 7 and 8

Page 32

Sample programs

• Starting new tasks in linux: page 165• Programs in pages: 174-180 on signals

and alarms• See demos directory for first• See page 175 for the second program• See page 178 … for the third program

Page 33: Task Control: Signals and Alarms Chapter 7 and 8

Pingpong

Page 33

Parent

Child

PSIG 43

CSIG 42

Page 34: Task Control: Signals and Alarms Chapter 7 and 8

Observe in pingpong.c

• pause(): indefinite• sleep(): sleep is random/finite time• While loop• Signal handlers• Re-arming of the signals

Page 35: Task Control: Signals and Alarms Chapter 7 and 8

Page 35

Volatile (from code reading: last lecture)

• A variable should be declared volatile whenever its value could change unexpectedly. In practice, only three types of variables could change: – Memory-mapped peripheral registers – Global variables modified by an

interrupt service routine – Global variables within a multi-threaded

application