1 / 98

G5 3OPS Operating Systems

G5 3OPS Operating Systems. Processes. Graham Kendall. Introduction to Processes - 1. Concept of a process is fundamental to an operating system Can be viewed as an abstraction of a program

hgable
Download Presentation

G5 3OPS Operating Systems

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. G53OPSOperating Systems Processes Graham Kendall

  2. Introduction to Processes - 1 • Concept of a process is fundamental to an operating system • Can be viewed as an abstraction of a program • Although to be strict we can say that a program (i.e. an algorithm expressed in some suitable notation) has a process that executes the algorithm and has associated with it input, output and a state. • Computers nowadays can do many things at the same time. They can be writing to a printer, reading from a disc and scanning an image

  3. Introduction to Processes - 2 • The computer (more strictly the operating system) is also responsible for running many processes, usually, on the same CPU • Must give the illusion that the computer is doing many things at the same time (pseudoparallelism) • Important to realise • The CPU is switching processes • One process can have an effect on another process which is not currently running.

  4. Running Ready Blocked Process States - 1

  5. Running Ready Blocked Process States - 2 • Running. Only one process can be running at any one time (assuming a single processor machine). A running process is the process that is actually using the CPU at that time. • Ready. A process that is ready is runnable but cannot get access to the CPU due to another process using it. • Blocked.A blocked process is unable to run until some external event has taken place. For example, it may be waiting for data to be retrieved from a disc. • The scheduler is concerned with deciding which one of the processes in a ready state should be allowed to move to a running state

  6. Process Control Blocks - 1 • When a process moves from a running state to a ready or blocked state it must store certain information so that it can restart from the same point when it moves back to a running state • Which instruction it was about to execute • Which record it was about to read from its input file • Values in the registers

  7. Process Management ·Registers ·Program Counter ·Program Status Word ·Stack Pointer ·Process State ·Time when process started ·CPU time used ·Time of next alarm ·Process id Process Control Blocks - 2 • Each process has a process table • Note that accounting information is stored as well

  8. Race Conditions - 1 • Sometimes necessary for two processes to communicate with one another • Not a situation where a process can write some data to a file that is read by another process at a later time • E.g. One type of process (i.e. there could be more than one process of this type running) that checks a counter when it starts running. If the counter is at a certain value, say x, then the process terminates as only x copies of the process are allowed to run at any one time

  9. Race Conditions - 2 • This is how it might work • The process starts • The counter, i, is read from the shared memory • If the i = x the process terminates else i = i + 1 • x is written back to the shared memory

  10. Race Conditions - 3 • But consider this scenario • Process 1, P1, starts • P1 reads the counter, i1, from the shared memory. Assume i1 = 3 (that is three processes of this type are already running) • P1 gets interrupted and is placed in a ready state • Process 2, P2, starts • P2 reads the counter, i2, from the shared memory; i2 = 3 • Assume i2 < x so i2 = i2 +1 (i.e. 4) • i2 is written back to shared memory • P2 is moved to a ready state and P1 goes into a running state • Assume i1 < x so i1 = i1 +1 (i.e. 4) • i1 is written back to the shared memory

  11. Race Conditions - 4 • Five processes running but the counter is only set to four • This problem is known as a race condition.

  12. Critical Sections- 1 • Avoid race conditions by not allowing two processes to be in their critical sections at the same time • We need a mechanism of mutual exclusion • Some way of ensuring that one processes, whilst using the shared variable, does not allow another process to access that variable

  13. Critical Sections- 2 • In fact we need four conditions to hold. • No two processes may be simultaneously inside their critical sections • No assumptions may be made about the speed or the number of processors • No process running outside its critical section may block other processes • No process should have to wait forever to enter its critical section • It is difficult to devise a method that meets all these conditions.

  14. Implementing Mutual Exclusion with Busy Waiting-1 • Disabling Interrupts • Allow a process to disable interrupts before it enters its critical section and then enable interrupts after it leaves its critical section • CPU will be unable to switch processes • Guarantees that the process can use the shared variable without another process accessing it • But, disabling interrupts, is a major undertaking • At best, the computer will not be able to service interrupts for, maybe, a long time • At worst, the process may never enable interrupts, thus (effectively) crashing the computer • The disadvantages far outweigh the advantages

  15. Implementing Mutual Exclusion with Busy Waiting-2 • Lock Variables • Another method is to assign a lock variable • For example, set the variable to (say) 1 when a process is in its critical section and reset to zero when a processes exits its critical section • But this is flawed as it simply moves the problem from the shared variable to the lock variable

  16. Strict Alternation- 1 Process 0 While (TRUE) { while (turn != 0); // wait critical_section(); turn = 1; noncritical_section(); } Process 1 While (TRUE) { while (turn != 1); // wait critical_section(); turn = 0; noncritical_section(); }

  17. Process 0 While (TRUE) { while (turn != 0); // wait critical_section(); turn = 1; noncritical_section(); } Process 1 While (TRUE) { while (turn != 1); // wait critical_section(); turn = 0; noncritical_section(); } Strict Alternation- 1 • Assume the variable turn is initially set to zero. • Process 0 runs. And finding turn is zero, it enters its critical region • If process 1 tries to run, it will find that turn is zero and will have to wait • When process 0 exits its critical region turn = 1 and process 1 can continue • Process 0 is now blocked

  18. Process 0 While (TRUE) { while (turn != 0); // wait critical_section(); turn = 1; noncritical_section(); } Process 1 While (TRUE) { while (turn != 1); // wait critical_section(); turn = 0; noncritical_section(); } Strict Alternation- 2 • Can you see a problem with this? • Hint : What if one process is a lot faster than the other

  19. Process 0 While (TRUE) { while (turn != 0); // wait critical_section(); turn = 1; noncritical_section(); } Process 1 While (TRUE) { while (turn != 1); // wait critical_section(); turn = 0; noncritical_section(); } Strict Alternation- 2 • Process 0 runs, enters its critical section and exits; setting turn to 1. Process 0 is now in its non-critical section. Assume this non-critical procedure takes a long time. • Process 1, which is a much faster process, now runs and once it has left its critical section turn is set to zero. • Process 1 executes its non-critical section very quickly and returns to the top of the procedure. • The situation is now that process 0 is in its non-critical section and process 1 is waiting for turn to be set to zero. In fact, there is no reason why process 1 cannot enter its critical region as process 0 is not in its critical region.

  20. Strict Alternation- 2 • What we have is a violation of one of the conditions that we listed above • No process running outside its critical section may block other processes

  21. Peterson’s Solution - 1 • Solution to the mutual exclusion problem that does not require strict alternation • Still uses the idea of lock (and warning) variables together with the concept of taking turns

  22. Peterson’s Solution - 2 int No_Of_Processes; int turn; int interested[No_Of_Processes]; void enter_region(int process) { int other; other = 1 – process; interested[process] = TRUE; turn = process; while(turn == process && interested[other] == TRUE); } void leave_region(int process) { interested[process] = FALSE; }

  23. Peterson’s Solution - 3 • Using Peterson’s algorithm work out what will happen, given the following sequence. • A process, P0, starts and calls enter_region. Assume no other processes are running • Once process 0 is in its critical region what happens if another, P1, starts and calls enter_region • P0 calls leave_region

  24. Turn == process Interested[1] F F Continue F T Continue T F Continue T T Wait Peterson’s Solution - 3 • Initially, the array interested has all (both) its elements set to false • Assume process 0 calls enter_region. The variable other is set to one (the other process number) and it indicates its interest by setting the relevant element of interested, and sets the turn variable • In this instance, the process will be allowed to enter its critical region, as process 1 is not interested in running

  25. Peterson’s Solution - 4 • Now process 1 could call enter_region. It will be forced to wait as the other process (0) is still interested. Process 1 will only be allowed to continue when interested[0] is set to false which can only come about from process 0 calling leave_region

  26. Peterson’s Solution - 3 • What happens if two processes call enter_region at exactly the same time? • One of the processes will set the turn variable, but it will be immediately overwritten

  27. Process 0 Process 1 Turn == process Turn == process Interested[1] Interested[0] F T T T Continue Wait Peterson’s Solution - 5 • Assume that process 0 sets turn to zero and then process 1 immediately sets it to 1. Under these conditions process 0 will be allowed to enter its critical region and process 1 will be forced to wait

  28. Test and Set Lock (TSL)- 1 • Some instruction sets assist us in implementing mutual exclusion • The instruction is commonly called Test and Set Lock (TSL) • It reads the contents of a memory location, stores it in a register and then stores a non-zero value at the address. • Guaranteed to be indivisible

  29. Test and Set Lock (TSL)- 2 • Solution to mutual exclusion using assembly code enter_region: tsl register, flag ; copy flag to register and set flag to 1 cmp register, #0 ;was flag zero? jnz enter_region ;if flag was non zero, lock was set , so loop ret ;return (and enter critical region) leave_region: mov flag, #0 ; store zero in flag ret ;return

  30. Test and Set Lock (TSL)- 3 • Assume, two processes. • Process 0 calls enter_region • TSL copies the flag to a register and sets it to a non-zero value • The flag is compared to zero and if found to be non-zero the routine loops back to the top • Only when process 1 has set the flag to zero (or under initial conditions) will process 0 be allowed to continue

  31. Busy Waiting and Priority Inversion- 1 • Peterson’s Solution and TSL both solve the mutual exclusion problem • However, both of these solutions sit in a tight loop waiting for a condition to be met (busy waiting). • Wasteful of CPU resources

  32. Busy Waiting and Priority Inversion- 2 • Other disadvantages. • Suppose we have two processes, one of high priority and one of low priority • The scheduling algorithm runs the high priority process whenever it is in ready state • If the low priority process is in its critical section when the high priority process becomes ready to run the low priority process will be placed in a ready state so that the higher priority process can be run • But, the high priority process will not be able to run and the low priority process cannot run again to release the higher priority process • This is sometimes known as the priority inversion problem.

  33. Classic Synchronisation Problems - 1 Producer/Consumer Problem • A producer process generates information that is to be processed by the consumer process • The processes can run concurrently through the use of a buffer • The consumer must wait on an empty buffer • The producer must wait on a full buffer

  34. Classic Synchronisation Problems - 2 • Also known as the bounded buffer problem 0 1 2 3 4 5 6 7 A B C D E F in out

  35. Classic Synchronisation Problems - 3 Readers/Writers Problem • Data is to be shared among several processes • A reader process is interested only in reading the shared data • A writer process is interested only in writing (or modifying) the shared data • Synchronization is required so that writers have exclusive access to data

  36. Classic Synchronisation Problems - 4 Dining Philosophers Problem • Five philosophers sit around a table • Each philosopher has a plate of food • There is one fork between any two philosophers • A philosopher alternates between eating and thinking • A philosopher has to find one fork on each side in order to eat

  37. P4 P0 0 4 P3 1 3 2 P1 P2 Classic Synchronisation Problems - 5

  38. Sleep and Wakeup- 1 • Instead of doing busy waiting we could send the process to sleep • In reality, it is placed in a blocked state • Important that it is not using the CPU by sitting in a tight loop

  39. Sleep and Wakeup- 2 • To implement sleep/wakeup we need access to two system calls (SLEEP and WAKEUP) • Can be implemented in a number of ways • SLEEP can block the calling process • WAKEUP can have one parameter; that is the process it has to wakeup. • Alternative is for both calls to have one parameter, this being a memory address which is used to match the SLEEP and WAKEUP calls.

  40. Producer Consumer using Sleep/Wakeup - 1 • Count keeps track of the number of items in the buffer • n = maximum items in the buffer

  41. Producer Consumer using Sleep/Wakeup - 2 • The producer checks against n. • If count = n then the producer sleeps else it adds the item to the buffer and increments n. • When the consumer retrieves an item from the buffer • It count is zero then it sleeps else it removes an item from the buffer and decrements count.

  42. Producer Consumer using Sleep/Wakeup - 3 • Calls to WAKEUP occur under the following conditions. • Once the producer has added an item to the buffer, and incremented count, it checks to see if count = 1 (i.e. the buffer was empty before). If it is, it wakes up the consumer. • Once the consumer has removed an item from the buffer, it decrements count. Now it checks count to see if it equals n-1 (i.e. the buffer was full). If it does it wakes up the producer.

  43. Producer Consumer using Sleep/Wakeup - 4 Producer/Consumer code int BUFFER_SIZE = 100; int count = 0; void producer(void) { int item; while(TRUE) { produce_item(&item); if(count == BUFFER_SIZE) sleep (); enter_item(item); count++; if(count == 1) wakeup(consumer); } } void consumer(void) { int item; while(TRUE) { if(count == 0) sleep (); remove_item(&item); count--; if(count == BUFFER_SIZE - 1) wakeup(producer); consume_item(&item); } }

  44. Producer Consumer using Sleep/Wakeup - 5 • This program seems logically correct but … • The following situation could arise. • The buffer is empty and the consumer has just read count to see if it is equal to zero • The consumer stops and the producer starts • The producer places an item in the buffer and increments count. • The producer checks to see if count is equal to one. Finding it is, it assumes that it was previously zero which implies that the consumer is sleeping – so it sends a wakeup.

  45. Producer Consumer using Sleep/Wakeup - 6 • The following situation could arise (ctd). • In fact, the consumer is not asleep so the call to wakeup is lost. • The consumer now runs – continuing from where it left off – it checks the value of count. Finding that it is zero it goes to sleep. As the wakeup call has already been issued the consumer will sleep forever. • Eventually the buffer will become full and the producer will send itself to sleep. • Both producer and consumer will sleep forever. • … we have the problem of race conditions with count

  46. Producer Consumer using Sleep/Wakeup - 7 • One solution is to have a wakeup waiting bit that is turned on when a wakeup is sent to a process that is already awake. If a process goes to sleep, it first checks the wakeup bit. If set the bit will be turned off, but the process will not go to sleep. • Whilst seeming a workable solution it suffers from the drawback that you need an ever increasing number wakeup bits to cater for larger number of processes.

  47. Semaphores - 1 • Dijkstra suggested that an integer variable (which he called a semaphore) be used to record how many wakeups had been saved • The sleep operation (DOWN) checks the semaphore to see if it is greater than zero. If it is, it decrements the value (using up a stored wakeup) and continues • If the semaphore is zero the process sleeps

  48. Semaphores - 2 • The wakeup operation (UP) increments the value of the semaphore • If one or more processes were sleeping on that semaphore then one of the processes is chosen and allowed to complete its DOWN • Updating the semaphore must be done as an atomic action

  49. Semaphores Mutual Exclusion • Assume we have a semaphore called mutex • It is initially set to 1 Down1(mutex) // p1 enters critical section (mutex = 0) Down2(mutex) // p2 sleeps (mutex = 0) Down3(mutex) // p3 sleeps (mutex = 0) Down4(mutex) // p4 sleeps (mutex = 0) Up1(mutex) // mutex = 1 and chooses p3 Down3(mutex) // p3 completes its down (mutex = 0) Up3(mutex) // mutex = 1 and chooses p2 Down2(mutex) // p2 completes its down (mutex = 0) Up2(mutex) // mutex = 1 and chooses p4 Down4(mutex) // p4 completes its down (mutex = 0) Up4(mutex) // mutex = 1 • We can use semaphores to ensure that only one process is in its critical section at any one time, i.e. the principle of mutual exclusion.

  50. Semaphores Producer/Consumer - 1 • We can use semaphores for the producer/consumer problem int BUFFER_SIZE = 100; typedef int semaphore; semaphore mutex = 1; semaphore empty = BUFFER_SIZE; semaphore full = 0; void producer(void) { int item; while(TRUE) { produce_item(&item); // generate next item down(&empty); // decrement empty count down(&mutex); // enter critical region enter_item(item); // put item in buffer up(&mutex); // leave critical region up(&full); // increment count of full slots } }

More Related