Rev 52 | Rev 58 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 9 | bondari | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 57 | jermar | 2 | <chapter id="scheduling"> |
| 3 | <?dbhtml filename="scheduling.html"?> |
||
| 9 | bondari | 4 | |
| 57 | jermar | 5 | <title>Scheduling</title> |
| 9 | bondari | 6 | |
| 57 | jermar | 7 | <para>One of the key aims of the operating system is to create and support |
| 8 | the impression that several activities are executing contemporarily. This is |
||
| 9 | true for both uniprocessor as well as multiprocessor systems. In the case of |
||
| 10 | multiprocessor systems, the activities are trully happening in parallel. The |
||
| 11 | scheduler helps to materialize this impression by planning threads on as |
||
| 12 | many processors as possible and, where this means reaches its limits, by |
||
| 13 | quickly switching among threads executing on a single processor.</para> |
||
| 14 | |||
| 15 | <section> |
||
| 16 | <title>Contexts</title> |
||
| 17 | |||
| 18 | <para>The term context refers to the set of processor resources that |
||
| 19 | define the current state of the computation or the environment and the |
||
| 20 | kernel understands it in several more or less narrow sences:</para> |
||
| 21 | |||
| 22 | <itemizedlist> |
||
| 23 | <listitem> |
||
| 24 | <para>synchronous register context,</para> |
||
| 25 | </listitem> |
||
| 26 | |||
| 27 | <listitem> |
||
| 28 | <para>asynchronous register context,</para> |
||
| 29 | </listitem> |
||
| 30 | |||
| 31 | <listitem> |
||
| 32 | <para>FPU context and</para> |
||
| 33 | </listitem> |
||
| 34 | |||
| 35 | <listitem> |
||
| 36 | <para>memory management context.</para> |
||
| 37 | </listitem> |
||
| 38 | </itemizedlist> |
||
| 39 | |||
| 40 | <para>The most narrow sence refers to the the synchronous register |
||
| 41 | context. It includes all the preserved registers as defined by the |
||
| 42 | architecture. To highlight some, the program counter and stack pointer |
||
| 43 | take part in the synchronous register context. These are the registers |
||
| 44 | that must be preserved across a procedure call and during synchronous |
||
| 45 | context switches. </para> |
||
| 46 | |||
| 47 | <para>The next type of the context understood by the kernel is the |
||
| 48 | asynchronous register context. On an interrupt, the interrupted execution |
||
| 49 | flow's state must be guaranteed to be eventually completely restored. |
||
| 50 | Therefore the interrupt context includes, among other things, the scratch |
||
| 51 | registers as defined by the architecture. As a special optimization and if |
||
| 52 | certain conditions are met, it need not include the architecture's |
||
| 53 | preserved registers. The condition mentioned in the previous sentence is |
||
| 54 | that the low-level assembly language interrupt routines don't modify the |
||
| 55 | preserved registers. The handlers usually call a higher-level C routine. |
||
| 56 | The preserved registers are then saved on the stack by the compiler |
||
| 57 | generated code of the higher-level function. In HelenOS, several |
||
| 58 | architectures can be compiled with this optimization.</para> |
||
| 59 | |||
| 60 | <para>Although the kernel does not do any floating point |
||
| 61 | arithmetics<footnote> |
||
| 62 | <para>Some architectures (e.g. ia64) inevitably use a fixed set of |
||
| 63 | floating point registers to carry out its normal operations.</para> |
||
| 64 | </footnote>, it must protect FPU context of userspace threads against |
||
| 65 | destruction by other threads. Moreover, only a fraction of userspace |
||
| 66 | programs use the floating point unit. HelenOS contains a generic framework |
||
| 67 | for switching FPU context only when the switch is forced.</para> |
||
| 68 | |||
| 69 | <para>The last member of the context family is the memory management |
||
| 70 | context. It includes memory management registers that identify address |
||
| 71 | spaces on hardware level (i.e. ASIDs and page tables pointers).</para> |
||
| 72 | |||
| 9 | bondari | 73 | <section> |
| 57 | jermar | 74 | <title>Synchronous context switches</title> |
| 9 | bondari | 75 | |
| 57 | jermar | 76 | <para>The scheduler, but also other pieces of the kernel, make heavy use |
| 77 | of synchronous context switches, because it is a natural vehicle not |
||
| 78 | only for changes in control flow, but also for switching between two |
||
| 79 | kernel stacks. Two functions figure in a synchronous context switch |
||
| 80 | implementation: <code>context_save</code> and |
||
| 81 | <code>context_restore</code>. Note that these two functions break the |
||
| 82 | natural perception of the linear C code execution flow starting at |
||
| 83 | function's entry point and ending on one of the function's exit |
||
| 84 | points.</para> |
||
| 85 | |||
| 86 | <para>When the <code>context_save</code> function is called, the |
||
| 87 | synchronous context is saved in a memory structure passed to it. After |
||
| 88 | executing <code>context_save</code>, the caller is returned 1 as a |
||
| 89 | return value. The execution of instructions continues as normally until |
||
| 90 | <code>context_restore</code> is called. For the caller, it seems like |
||
| 91 | the call never returns<footnote> |
||
| 92 | <para>Which might be a source of problems with variable liveliness |
||
| 93 | after <code>context_restore</code>.</para> |
||
| 94 | </footnote>. Nevertheless, a synchronous register context, which is |
||
| 95 | saved in a memory structure passed to <code>context_restore,</code> is |
||
| 96 | restored, thus transfering the control flow to the place of occurrence |
||
| 97 | of the corresponding call to <code>context_save</code>. From the |
||
| 98 | perspective of the caller of the corresponding |
||
| 99 | <code>context_save</code>, it looks as though a return from |
||
| 100 | <code>context_save</code>. However, this time a return value of 0 is |
||
| 101 | returned.</para> |
||
| 9 | bondari | 102 | </section> |
| 57 | jermar | 103 | </section> |
| 9 | bondari | 104 | |
| 57 | jermar | 105 | <section> |
| 106 | <title>Scheduler</title> |
||
| 9 | bondari | 107 | |
| 57 | jermar | 108 | <para>How scheduler designed and how it works.</para> |
| 109 | </section> |
||
| 110 | </chapter> |