Memory Management: Early Systems Single-User Configurations → Fixed Partitions → Dynamic Partitions → Relocatable Dynamic Partitions “Memory is the primary and fundamental power, without which there could be no other intellectual operation.” —Samuel Johnson (1709–1784) Types of memory allocation schemes: • Single-user systems • Fixed partitions • Dynamic partitions • Relocatable dynamic partitions 1. Single-User Contiguous Scheme: Program is loaded in its entirety into memory and allocated as much contiguous space in memory as it needs. • Jobs processed sequentially in single-user systems • Requires minimal work by the Memory Manager • Register to store the base address • Accumulator to keep track of the program size Disadvantages of Single-User Contiguous Scheme: • Doesn’t support multiprogramming • Not cost effective 2. Fixed Partitions: Main memory is partitioned; one partition/job. • Allows multiprogramming • Partition sizes remain static unless and until computer system id shut down, reconfigured, and restarted • Requires protection of the job’s memory space • Requires matching job size with partition size To allocate memory spaces to jobs, the operating system’s Memory Manager must keep a table as shown below: Table 2.1: A simplified fixed partition memory table with the free partition shaded NOTE: Job 3 must wait even though 70K of free space is available in Partition 1 where Job 1 occupies only 30K of the 100K available Figure 2.1: Main memory use during fixed partition allocation of Table 2.1 Disadvantages: • Requires entire program to be stored contiguously • Jobs are allocated space on the basis of first available partition of required size • Works well only if all of the jobs are of the same size or if the sizes are known ahead of time • Arbitrary partition sizes lead to undesired results • Too small a partition size results in large jobs having longer turnaround time • Too large a partition size results in memory waste or internal fragmentation 3. Dynamic Partitions: Jobs are given only as much memory as they request when they are loaded • Available memory is kept in contiguous blocks • Memory waste is comparatively small Disadvantages: • Fully utilizes memory only when the first jobs are loaded • Subsequent allocation leads to memory waste or external fragmentation Figure 2.2: Main memory use during dynamic partition allocation Best-Fit versus First-Fit Allocation Free partitions are allocated on the following basis: First-fit memory allocation: First partition fitting the requirements • Leads to fast allocation of memory space Advantage: Faster in making allocation Disadvantage: Leads to memory waste Best-fit memory allocation: Smallest partition fitting the requirements • Results in least wasted space • Internal fragmentation reduced but not eliminate Advantage: Makes the best use of memory space Disadvantage: Slower in making allocation Figure 2.3: An example of a first-fit free scheme Algorithm for First-Fit: • Assumes Memory Manager keeps two lists, one for free memory and one for busy memory blocks • Loop compares the size of each job to the size of each memory block until a block is found that’s large enough to fit the job • Job is stored into that block of memory • Memory Manager moves out of the loop to fetch the next job from the entry queue • If the entire list is searched in vain, then the job is placed into a waiting queue • The Memory Manager then Figure 2.3: An example of a best-fit free fetches the next job and scheme repeats the process Table 2.2: Status of each memory block before and after a request is made for a block of 200 spaces using the first-fit algorithm • – Algorithm for Best-Fit: Goal: find the smallest memory block into which the job will fit Entire table must be searched before allocation Hypothetical allocation schemes: Next-fit: Starts searching from last allocated block, for the next available block when a new job arrives – Worst-fit: Allocates the largest free available block to the new job • Opposite of best-fit • Good way to explore the theory of memory allocation; might not be the best choice for an actual system – • – Table 2.3: Status of each memory block before and after a request is made for a memory block of 200 spaces using the best-fit algorithm Deallocation: Freeing an allocated memory space For fixed-partition system: • Straightforward process • When job completes, Memory Manager resets the status of the job’s memory block to “free” • Any code—for example, binary values with 0 indicating free and 1 indicating busy —may be used For dynamic-partition system: • Algorithm tries to combine free areas of memory whenever possible • Three cases: Case 1: When the block to be deallocated is adjacent to another free block Case 2: When the block to be deallocated is between two free blocks Case 3: When the block to be deallocated is isolated from other free blocks Case 1: Joining Two Free Blocks Change list must reflect starting address of the new free block • In the example, 7600—which was the address of the first instruction of the job that just released this block Memory block size for the new free space must be changed to show its new size—that is, the combined total of the two free partitions • In the example, (200 + 5) (TOP) Table 2.5: Free list after deallocation for Case 1 (LEFT) Table 2.4: Original free list before deallocation for Case 1 Case 2: Joining Three Free Blocks Deallocated memory space is between two free memory blocks Change list to reflect the starting address of the new free block • In the example, 7560— which was the smallest beginning address Sizes of the three free partitions must be combined • In the example, (20 + 20 + 205) Combined entry is given the status of null entry • In the example, 7600 Table 2.6: Original free list before deallocation for Case 2 Table 2.7: Free list after job has released memory Case 3: Deallocating an Isolated Block Space to be deallocated is isolated from other free areas System learns that the memory block to be released is not adjacent to any free blocks of memory, it is between two other busy areas Must search the table for a null entry Null entry in the busy list occurs when a memory block between two other busy memory blocks is returned to the free list The job to be deallocated is of size 445 and begins at location 8805. The asterisk indicates the soon-to-be-free memory block. Table 2.8: Original free list before deallocation for Case 3 Table 2.9: Memory list before deallocation Table 2.10: Busy list after the job has released its memory. The asterisk indicates the new null entry in the busy list. 4. Relocatable Dynamic Partitions: • Memory Manager relocates programs to gather together all of the empty blocks • Compact the empty blocks to make one block of memory large enough to accommodate some or all of the jobs waiting to get in Compaction: Reclaiming fragmented sections of the memory space • Every program in memory must be relocated so they are contiguous • Operating system must distinguish Table 2.11: Free list after the job has released between addresses and data values its memory. The asterisk indicates the new free • Every address must be adjusted to block entry replacing the null entry account for the program’s new location in memory • Data values must be left alone Compaction issues: • What goes on behind the scenes when relocation and compaction take place? • What keeps track of how far each job has moved from its original storage area? • What lists have to be updated? What lists have to be updated? • Free list must show the partition for the new block of free memory • Busy list must show the new locations for all of the jobs already in process that were relocated • Each job will have a new address except for those that were already at the lowest memory locations Special-purpose registers are used for relocation: • Bounds register • Stores highest location accessible by each program • Relocation register • Contains the value that must be added to each address referenced in the program so it will be able to access the correct memory addresses after relocation • If the program isn’t relocated, the value stored in the program’s relocation register is zero Figure 2.7: Three snapshots of memory before and after compaction Figure 2.8: Contents of relocation register and close-up of Job 4 memory area (a) before relocation and (b) after relocation and compaction • Compacting and relocating optimizes the use of memory and thus improves throughput • Options for when and how often it should be done: • When a certain percentage of memory is busy • When there are jobs waiting to get in • After a prescribed amount of time has elapsed Goal: Optimize processing time and memory use while keeping overhead as low as possible Summary • Four memory management techniques were used in early systems: single-user systems, fixed partitions, dynamic partitions, and relocatable dynamic partitions • Memory waste in dynamic partitions is comparatively small as compared to fixed partitions • First-fit is faster in making allocation but leads to memory waste • Best-fit makes the best use of memory space but slower in making allocation • Compacting and relocating optimizes the use of memory and thus improves throughput • All techniques require that the entire program must: a) Be loaded into memory b) Be stored contiguously c) Remain in memory until the job is completed • Each technique puts severe restrictions on the size of the jobs: can only be as large as the largest partitions in memory Processor Management Program (Job): – A unit of work that has been submitted by user to an operating system – An inactive unit, such as a file stored on a disk • Process (Task): – An active entity, which requires a set of resources, including a processor and special registers, to perform its function – A single instance of an executable program • Processor (CPU): performs calculations and executes programs – In single-user systems: • Processor is busy only when user is executing a job, at all other times it is idle • Processor management is simple – In a multiprogramming environment: • Processor must be allocated to each job in a fair and efficient manner • Requires scheduling policy and a scheduling algorithm • Interrupt: A hardware signal that suspends execution of a program and activates the execution of interrupt handler • Context Switch: Saving a job’s processing information in its PCB when interrupted • Context switching occurs in all preemptive Job Scheduling Versus Process Scheduling • Processor Manager has two sub managers: – Job Scheduler: • In charge of job scheduling • Initiates the job based on certain criteria – Process Scheduler: • In charge of process scheduling • Assigns the CPU to execute processes of those jobs placed on READY queue by Job Scheduler Job Scheduler (High level scheduler): – Initiates the job based on certain criteria – Puts jobs in a sequence that uses all system’s resources as fully as possible – Strives for balanced mix of jobs with large I/O interaction and jobs with lots of computation – Tries to keep most system components busy most of time Process Scheduler (Low level scheduler): – Determines which jobs will get the CPU, when, and for how long – Decides when processing should be interrupted – Determines which queues the job should be moved to during its execution – Recognizes when a job has concluded and should be terminated • I/O-bound jobs have many brief CPU cycles and long I/O cycles, e.g., printing a series of documents • CPU-bound jobs have long CPU cycles and shorter I/O cycles, e.g., finding the first 300 prime numbers • Total effect of all CPU cycles, from both I/O-bound and CPU-bound jobs, approximates a Poisson distribution curve • Figure 4.1: Distribution of CPU cycle times Figure 4.2: A typical job (or process) changes status as it moves through the system from HOLD to FINISHED 10 • • • Middle level scheduler (third layer): Used in a highly interactive environment – Removes active jobs from memory to reduce degree of multiprogramming – Allows jobs to be completed faster Job and Process Status • Job status: A job takes one of the following states as it moves through the system – HOLD, READY, WAITING, RUNNING, FINISHED Transition from one status to another is initiated by either the Job Scheduler (JS) or the Process Scheduler (PS): – HOLD to READY: JS, using a predefined policy – READY to RUNNING: PS, using some predefined algorithm – RUNNING back to READY: PS, according to some predefined time limit or other criterion – RUNNING to WAITING: PS, and is initiated by an instruction in the job – WAITING to READY: PS, and is initiated by signal from I/O device manager that I/O request has been satisfied and job can continue. – RUNNING to FINISHED: PS or JS, if job is finished or error has occurred Process Control Blocks Process Control Block (PCB): Data structure that contains basic info about the job including – What it is – Where it’s going – How much of its processing has been completed – Where it’s stored – How much it has spent in using resources • Contents of Process Control Block (PCB): – Process identification – Process status (HOLD, READY, RUNNING, WAITING) – Process state (process status word, register contents, main memory info, resources, process priority) – Accounting (CPU time, total time, memory occupancy, I/O operations, number of input records read, etc.) PCBs and Queuing • PCB of a job: Contains all of the data about the job needed by the operating system to manage the processing of the job – Created when job scheduler accepts the job – Updated as job goes from beginning to end of Figure 4.3: Contents of its execution each job’s Process Control • Queues use PCBs to track jobs Block – PCBs, not jobs, are linked to form queues – Queues must be managed by process scheduling policies and algorithms Process Scheduling Policies • Operating system must resolve three limitations of a system before scheduling all jobs in a multiprogramming environment: – Finite number of resources (e.g., disk drives, printers, and tape drives) – Some resources can’t be shared once they’re allocated (e.g., printers) – Some resources require operator intervention (e.g., tape drives) Figure 4.4: Queuing paths from HOLDshould: to A good process scheduling policy FINISHED • Maximize throughput by running as many jobs as possible in a given amount of time – Minimize response time by quickly turning around interactive requests – Minimize turnaround time by moving entire jobs in and out of system quickly – Minimize waiting time by moving jobs out of READY queue as quickly as possible – Maximize CPU efficiency by keeping CPU busy 100 percent of time – Ensure fairness for all jobs by giving every one an equal amount of CPU and I/O time • Need for Interrupts: When a job claims CPU for a very long time before issuing an I/O request – Builds up READY queue & empties I/O queues – Creates an unacceptable imbalance in the system • Process Scheduler uses interrupts when a predetermined slice of time has expired – Suspends all activity on the currently running job – Reschedules it into the READY queue Types of Scheduling Policies: o Preemptive scheduling policy: Interrupts processing of a job and transfers the CPU to another job o Nonpreemptive scheduling policy: Functions without external interrupts Process Scheduling Algorithms Types of Process Scheduling Algorithms: • First Come, First Served (FCFS) • Shortest Job Next (SJN) • Priority Scheduling • Shortest Remaining Time (SRT) • Round Robin • Multiple Level Queues First-Come, First-Served • Nonpreemptive • Handles jobs according to their arrival time: the earlier they arrive, the sooner they’re served • Simple algorithm to implement: uses a FIFO queue • Good for batch systems; unacceptable for interactive systems • Turnaround time is unpredictable Jobs arrival sequence: A, B, C Average turnaround time: • Job A has a CPU cycle of 15 milliseconds 16.67 s for job sequence A, B, C using the Figure 4.5: Timeline FCFS algorithm • • Job B has a CPU cycle of 2 milliseconds Job C has a CPU cycle of 1 millisecond Jobs arrival sequence: C, B, A • Job A has a CPU cycle of 15 Average turnaround time: milliseconds 7.3 s • Job B has a CPU cycle of 2 milliseconds Figure 4.6: Timeline for job sequence C, B, A using the • Job C has a CPU cycle of 1 millisecond FCFS algorithm Shortest Job Next (SJN) • Nonpreemptive • Handles jobs based on length of their CPU cycle time • Easiest to implement in batch environments • Doesn’t work in interactive systems • Optimal only when all jobs are available at same time and the CPU estimates are available and accurate Four batch jobs A, B, C, D, all in the READY queue Job: A B C D Average turnaround time: CPU cycle: 5 2 6 4 Figure 4.7: Timeline for job sequence B, D, A, C using the SJN algorithm 9s Priority Scheduling • • • • • • • • Nonpreemptive Gives preferential treatment to important jobs o Programs with highest priority are processed first o Not interrupted until CPU cycles are completed or a natural wait occurs FCFS policy is used if two or more jobs with equal priority in READY queue System administrator or Processor Manager use different methods of assigning priorities Shortest Remaining Time Preemptive version of the SJN algorithm Processor allocated to job closest to completion o Current job can be preempted if newer job in READY queue has shorter time to completion Cannot be implemented in interactive system o Requires advance knowledge of the CPU time required to finish each job SRT involves more overhead than SJN o OS monitors CPU time for all jobs in READY queue and performs context switching Arrival time: 2 3 Job: C D Job: CPU cycle: C D 1 4 Turnaround: 6 Figure 4.8: Timeline for job sequence A, B, C, D using the preemptive SRT algorithm Arrival time: 2 3 Job: C D CPU cycle: 1 4 0 1 A B 6A 3 B 14 4 1 0 1 A B 6 3 Figure 4.9: Timeline for job sequence A, B, C, D using the nonpreemptive SJN algorithm Job: A B C D Turnaround: 6 9 5 11 Round Robin • Preemptive • Used extensively in interactive systems • Based on a predetermined slice of time (time quantum) that’s given to each job • Size of time quantum crucial to system performance o Usually varies from 100 ms to 1-2 s • Ensures CPU is equally shared among all active processes and is not monopolized by any one job Arrival time: 0 1 2 3 Job: A B Time slice: 4ms C D • If Job’s CPU cycle > time quantum CPU cycle: 8 Job: A 4B C o Job is preempted and put at the end of the READY queue and 9 5 D its information is saved in its PCB Turnaround: 20 7 24 22 • If Job’s CPU cycle < time quantum o If job is finished, all resources allocated to it are released & completed job is returned to user o If interrupted by I/O request, then info is saved in PCB & it is linked at end of the appropriate I/O queue o Once I/O request is satisfied, job returns to end of READY queue to await allocation of CPU CPU cycle of job A: 8 ms Figure 4.11: Context switches for job A with three different time quantums. In (a) the job finishes before the time quantum expires. In (b) and (c), the time quantum expires first, interrupting the job. Figure 4.10: Timeline for job sequence A, B, C, D using the preemptive round robin algorithm • • – • – – • – – Efficiency depends on the size of time quantum in relation to the average CPU cycle If the quantum is too large - larger than most CPU cycles Algorithm reduces to the FCFS scheme If the quantum is too small Amount of context switching slows down the execution of the jobs Amount of overhead is dramatically increased General rules of thumb for selecting the proper time quantum: Should be long enough to allow 80% of CPU cycles to run to completion Should be at least 100 times longer than the time required to perform one context switch • These rules are flexible and depend on the system Multiple-Level Queues • Work in conjunction with several other schemes • Found in systems with jobs that can be grouped according to a common characteristic • Examples: – Priority-based system with different queues for each priority level – System with all CPU-bound jobs in one queue and all I/O-bound jobs in another – Hybrid system with batch jobs in background queue and interactive jobs in a foreground queue • Four primary methods to the movement of jobs: – No Movement Between Queues – Movement Between Queues – Variable Time Quantum Per Queue – Aging • No Movement Between Queues: – The processor is allocated to the jobs in the high-priority queue in FCFS fashion – Allocated to jobs in lower priority queues only when the high priority queues are empty • Movement Between Queues – Adjusts the priorities assigned to each job – A job may also have its priority increased – Good in interactive systems • • Variable Time Quantum Per Queue: – Each of the queues is given a time quantum twice as long as the previous queue – CPU-bound job can execute for longer and longer periods of time, thus improving its chances of finishing faster Aging: – System moves the old job to the next highest queue, and so on until it reaches the top queue – Ensures that jobs in the lower-level queues will eventually complete their execution A Word About Interrupts • Types of Interrupts: – Page interrupts to accommodate job requests – Time quantum expiration interrupts – I/O interrupts when READ or WRITE command is issued – Internal interrupts (synchronous interrupts) result from arithmetic operation or job instruction – Illegal arithmetic operations (e.g., dividing by 0). – Illegal job instructions (e.g., attempts to access protected storage locations) • Interrupt handler: Control program that handles the interruption sequence of events • When operating system detects a nonrecoverable error, the interrupt handler follows this sequence: – The type of interrupt is described and stored – The state of the interrupted process is saved – The interrupt is processed – The processor resumes normal operation Summary • • • • • • • • • • • Process scheduler assigns the CPU to execute processes of those jobs placed on READY queue by Job Scheduler Total effect of all CPU cycles, from both I/O-bound and CPU-bound jobs, approximates a Poisson distribution curve Transition from one status to another is initiated by either Job Scheduler (JS) or Process Scheduler (PS) PCB of a job contains all data about the job needed by OS to manage the processing of the job A good process scheduling policy should maximize CPU efficiency by keeping CPU busy 100 percent of time FIFO has simple algorithm to implement but turnaround time is unpredictable SJN minimizes average waiting time but results in infinite postponement of some jobs Priority scheduling ensures fast completion of important jobs but results in infinite postponement of some jobs SRT ensures fast completion of short jobs but involves more overhead than SJN, incurred by context switching Efficiency in round robin policy depends on the size of time quantum in relation to the average CPU cycle Multiple-level queues counteract indefinite postponement with aging or other queue movement