L16-Scheduling-2

L16-Scheduling-2

Scheduling II q Multiprocessor scheduling issues q Real-time scheduling q Linux scheduling q Linux scheduler architecture 1 How to allocate processes to CPUs? processes CPU0 CPU1 CPU2 CPU3 2 Symmetric multiprocessing (SMP) Shared Memory $ $ $ $ CPU0 CPU1 CPU2 CPU3 q Multiple CPUs q Same access time to main memory q Private cache 3 Global queue of processes q One ready queue shared across all CPUs CPU0 CPU1 CPU2 CPU3 q Advantages § Good CPU utilization § Fair to all processes q Disadvantages § Not scalable (contention for global queue lock) § Poor cache locality q Linux 2.4 uses global queue 4 Per-CPU queue of processes q Static partition of processes to CPUs q Advantages CPU0 CPU1 CPU2 CPU3 § Easy to implement § Scalable (no contention on ready queue) § Better cache locality q Disadvantages § Load-imbalance (some CPUs have more processes) • Unfair to processes and lower CPU utilization 5 Modern OSes take hybrid approaches q Use both global and per-CPU queues q Migrate processes across per-CPU queues CPU0 CPU1 CPU2 CPU3 q Processor Affinity § Add process to a CPU’s queue if recently run on the CPU • Cache state may still present 6 Real-time scheduling q Real-time processes have timing constraints § Expressed as deadlines or rate requirements § Ex) gaming, video/music player, autopilot q Hard real-time systems – required to complete a critical task within a guaranteed amount of time q Soft real-time computing – requires that critical processes receive priority over others q Linux supports soft real-time 7 Linux: multi-level queue with priorities q Soft real-time scheduling policies § SCHED_FIFO (FCFS) § SCHED_RR (round robin) Real Time 99 § Priority over normal tasks … § 100 static priority levels (1..99) Real Time 3 q Normal scheduling policies Real Time 2 § SCHED_NORMAL: standard Real Time 1 • SCHED_OTHER in POSIX § SCHED_BATCH: CPU bound Nice -20 … § SCHED_IDLE: lower priority § Static priority is 0 Nice 0 • 40 dynamic priority … • “Nice” values Nice 19 q sched_setscheduler(), nice() q See “man 7 sched” for detailed overview 8 Linux scheduler history q O(N) scheduler up to 2.4 § Simple: global run queue § Poor performance on multiprocessor and large N q O(1) scheduler in 2.5 & 2.6 § Good performance: per-CPU run queue § Complex and error prone logic to boost interactivity § No fairness guarantee q Completely Fair Scheduler (CFS) in 2.6 and later § Currently default scheduler for SCHED_NORMAL § Processes get fair share of CPU § Naturally boosts interactivity q BFS and MuQSS § Linux scheduler for hippies § Available as kernel patches on the street 9 Ideal fair scheduling q Infinitesimally small time slice q n processes: each runs uniformly at 1/nth rate •1 Process 1/3rd progress •3 Processes q Various approximations of the ideal § Lottery scheduling § Stride scheduling § Linux CFS 10 Completely Fair Scheduler (CFS) q Approximate fair scheduling § Run each process once per schedule latency period • sysctl_sched_latency § Time slice for process Pi: T * Wi/(Sum of all Wi) • sched_slice() q Too many processes? § Lower bound on smallest time slice § Schedule latency = lower bound * number of procs q Introduced in Linux 2.6.23 11 Picking the next process q Pick proc with weighted minimum runtime so far § Virtual runtime: task->vruntime += executed time / Wi q Example § P1: 1 ms burst per 10 ms (schedule latency) § P2 and P3 are CPU-bound § All processes have the same weight (1) Ready P1 P2 P3 0 P1 1 P2 P3 P2 5 P2 5 P3 P3 5 Slice 3ms 5ms 3ms 12 Finding proc with minimum runtime fast q Red-black tree § Balanced binary search tree § Ordered by vruntime as key § O(lgN) insertion, deletion, update, O(1): find min 300 100 cfs_rq->min_vruntime 400 30 150 410 q Tasks move from left of tree to the right q min_vruntime caches smallest value q Update vruntime and min_vruntime § When task is added or removed § On every timer tick, context switch 13 Converting nice level to weight q Table of nice level to weight § static const int prio_to_weight[40] (kernel/sched/sched.h) q Nice level changes by 1 è 10% weight q Pre-computed to avoid § Floating point operations § Runtime overhead 14 Fsck all that… Enter BFS The scheduler that shall not be named (now replaced by MuQSS, sadly…) 15 Hierarchical, modular scheduler •Code from kernel/sched/core.c: class = sched_class_hiGhest; for ( ; ; ) { p = class->pick_next_task(rq); if (p) return p; /* * Will never be NULL as the idle class always * returns a non-NULL p: */ class = class->next; } 16 sched_class Structure static const struct sched_class fair_sched_class = { .next = &idle_sched_class, .enqueue_task = enqueue_task_fair, .dequeue_task = dequeue_task_fair, .yield_task = yield_task_fair, .check_preempt_curr = check_preempt_wakeup, .pick_next_task = pick_next_task_fair, .put_prev_task = put_prev_task_fair, .select_task_rq = select_task_rq_fair, .load_balance = load_balance_fair, .move_one_task = move_one_task_fair, .set_curr_task = set_curr_task_fair, .task_tick = task_tick_fair, .task_fork = task_fork_fair, .prio_changed = prio_changed_fair, .switched_to = switched_to_fair, } 17 The runqueue q All run queues available in array runqueues, one per CPU q struct rq (kernel/sched/sched.h) § Contains per-class run queues (RT, CFS) and params • E.g., CFS: a red-black tree of task_struct (struct rb_root tasks_timeline) • E.g., RT: array of active priorities • Data structure rt_rq, cfs_rq, q struct sched_entity (include/linux/sched.h) § Member of task_struct, one per scheduler class § Maintains struct rb_node run_node, other per-task params q Current scheduler for task is specified by task_struct.sched_class § Pointer to struct sched_class § Contains functions pertaining to class (object-oriented code) 18 Adding a new Scheduler Class q The Scheduler is modular and extensible § New scheduler classes can be installed § Each scheduler class has priority within hierarchical scheduling hierarchy § Linked list of sched_class sched_class.next reflects priority § Core functions: kernel/sched/core.c, kernel/sched/sched.h, include/linux/sched.h § Additional classes: kernel/sched/fair.c, rt.c q Process changes class via sched_setscheduler syscall q Each class needs § New runqueue structure in main struct rq § New sched_class structure implementing scheduling functions § New sched_entity in the task_struct 19.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    19 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us