Rev 127 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 127 | Rev 131 | ||
|---|---|---|---|
| Line 1... | Line 1... | ||
| 1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | <chapter id="time"> |
2 | <chapter id="time"> |
| 3 | <?dbhtml filename="time.html"?> |
3 | <?dbhtml filename="time.html"?> |
| 4 | 4 | ||
| 5 | <title>Time management</title> |
5 | <title>Time Management</title> |
| 6 | 6 | ||
| 7 | <para>Time is one of the dimensions in which kernel, as well as the whole |
7 | <para>Time is one of the dimensions in which kernel, as well as the whole |
| 8 | system, operates. It is of special importance to many kernel subsytems. |
8 | system, operates. It is of special importance to many kernel subsytems. |
| 9 | Knowledge of time makes it possible for the scheduler to preemptively plan |
9 | Knowledge of time makes it possible for the scheduler to preemptively plan |
| 10 | threads for execution. Different parts of the kernel can request execution |
10 | threads for execution. Different parts of the kernel can request execution |
| 11 | of their callback function with some specified delay. A good example of such |
11 | of their callback function with some specified delay. A good example of such |
| 12 | kernel code is the synchronization subsystem which uses this functionality |
12 | kernel code is the synchronization subsystem which uses this functionality |
| 13 | to implement timeouting versions of synchronization primitives.</para> |
13 | to implement timeouting versions of synchronization primitives.</para> |
| 14 | 14 | ||
| 15 | <section> |
15 | <section> |
| 16 | <title>System clock</title> |
16 | <title>System Clock</title> |
| 17 | 17 | ||
| 18 | <para>Every hardware architecture supported by HelenOS must support some |
18 | <para>Every hardware architecture supported by HelenOS must support some |
| 19 | kind of a device that can be programmed to yield periodic time signals |
19 | kind of a device that can be programmed to yield periodic time signals |
| 20 | (i.e. clock interrupts). Some architectures have external clock that is |
20 | (i.e. clock interrupts). Some architectures have external clock that is |
| 21 | merely programmed by the kernel to interrupt the processor multiple times |
21 | merely programmed by the kernel to interrupt the processor multiple times |
| Line 82... | Line 82... | ||
| 82 | <title>Timeouts</title> |
82 | <title>Timeouts</title> |
| 83 | 83 | ||
| 84 | <para>Kernel subsystems can register a callback function to be executed |
84 | <para>Kernel subsystems can register a callback function to be executed |
| 85 | with a specified delay. Such a registration is represented by a kernel |
85 | with a specified delay. Such a registration is represented by a kernel |
| 86 | structure called <classname>timeout</classname>. Timeouts are registered |
86 | structure called <classname>timeout</classname>. Timeouts are registered |
| 87 | via <code>timeout_register()</code> function. This function takes a pointer |
87 | via <code>timeout_register</code> function. This function takes a pointer |
| 88 | to a timeout structure, a callback function, a parameter of the callback |
88 | to a timeout structure, a callback function, a parameter of the callback |
| 89 | function and a delay in microseconds as parameters. After the structure is |
89 | function and a delay in microseconds as parameters. After the structure is |
| 90 | initialized with all these values, it is sorted into the processor's list |
90 | initialized with all these values, it is sorted into the processor's list |
| 91 | of active timeouts, according to the number of clock interrupts remaining |
91 | of active timeouts, according to the number of clock interrupts remaining |
| 92 | to their expiration and relatively to already listed timeouts.</para> |
92 | to their expiration and relatively to already listed timeouts.</para> |
| 93 | 93 | ||
| 94 | <para>Timeouts can be unregistered via <code>timeout_unregister()</code>. |
94 | <para>Timeouts can be unregistered via <code>timeout_unregister</code>. |
| 95 | This function can, as opposed to <code>timeout_register()</code>, fail when |
95 | This function can, as opposed to <code>timeout_register</code>, fail when |
| 96 | it is too late to remove the timeout from the list of active |
96 | it is too late to remove the timeout from the list of active |
| 97 | timeouts.</para> |
97 | timeouts.</para> |
| 98 | 98 | ||
| 99 | <para>Timeouts are nearing their expiration in the list of active timeouts |
99 | <para>Timeouts are nearing their expiration in the list of active timeouts |
| 100 | which exists on every processor in the system. The expiration counters are |
100 | which exists on every processor in the system. The expiration counters are |
| Line 105... | Line 105... | ||
| 105 | the list and their callback function is called with respective |
105 | the list and their callback function is called with respective |
| 106 | parameter.</para> |
106 | parameter.</para> |
| 107 | </section> |
107 | </section> |
| 108 | 108 | ||
| 109 | <section> |
109 | <section> |
| 110 | <title>Generic clock interrupt handler</title> |
110 | <title>Generic Clock Interrupt Handler</title> |
| 111 | 111 | ||
| 112 | <para>On each clock interrupt, the architecture specific part of the clock |
112 | <para>On each clock interrupt, the architecture specific part of the clock |
| 113 | interrupt handler makes a call to the generic clock interrupt handler |
113 | interrupt handler makes a call to the generic clock interrupt handler |
| 114 | implemented by the <code>clock()</code> function. The generic handler takes |
114 | implemented by the <code>clock</code> function. The generic handler takes |
| 115 | care of several mission critical goals:</para> |
115 | care of several mission critical goals:</para> |
| 116 | 116 | ||
| 117 | <itemizedlist> |
117 | <itemizedlist> |
| 118 | <listitem> |
118 | <listitem> |
| 119 | <para>expiration of timeouts,</para> |
119 | <para>expiration of timeouts,</para> |
| Line 126... | Line 126... | ||
| 126 | <listitem> |
126 | <listitem> |
| 127 | <para>preemption of threads.</para> |
127 | <para>preemption of threads.</para> |
| 128 | </listitem> |
128 | </listitem> |
| 129 | </itemizedlist> |
129 | </itemizedlist> |
| 130 | 130 | ||
| 131 | <para>The <code>clock()</code> function checks for expired timeouts and |
131 | <para>The <code>clock</code> function checks for expired timeouts and |
| 132 | decrements unexpired timeout expiration counters exactly one more times |
132 | decrements unexpired timeout expiration counters exactly one more times |
| 133 | than is the number of missed clock signals (i.e. at least once and |
133 | than is the number of missed clock signals (i.e. at least once and |
| 134 | possibly more times, depending on the missed clock signals counter). The |
134 | possibly more times, depending on the missed clock signals counter). The |
| 135 | time of the day counters are also updated one more times than is the |
135 | time of the day counters are also updated one more times than is the |
| 136 | number of missed clock signals. And finally, the remaining timeslice of |
136 | number of missed clock signals. And finally, the remaining timeslice of |
| Line 139... | Line 139... | ||
| 139 | lost due to an occasional excessive time drift described in previous |
139 | lost due to an occasional excessive time drift described in previous |
| 140 | paragraphs.</para> |
140 | paragraphs.</para> |
| 141 | </section> |
141 | </section> |
| 142 | 142 | ||
| 143 | <section> |
143 | <section> |
| 144 | <title>Time source for userspace</title> |
144 | <title>Time Source for Userspace</title> |
| 145 | 145 | ||
| 146 | <para>In HelenOS, userspace tasks don't communicate with the kernel in |
146 | <para>In HelenOS, userspace tasks don't communicate with the kernel in |
| 147 | order to read the system time. Instead, a mechanism that shares kernel |
147 | order to read the system time. Instead, a mechanism that shares kernel |
| 148 | time of the the day counters with userspace address spaces is deployed. On |
148 | time of the the day counters with userspace address spaces is deployed. On |
| 149 | the kernel side, during system initialization, HelenOS allocates a frame |
149 | the kernel side, during system initialization, HelenOS allocates a frame |