1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
/*
* Mach Operating System
* Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
* File: sched.h
* Author: Avadis Tevanian, Jr.
* Date: 1985
*
* Header file for scheduler.
*
*/
#ifndef _KERN_SCHED_H_
#define _KERN_SCHED_H_
#include <kern/queue.h>
#include <kern/lock.h>
#include <kern/kern_types.h>
#include <kern/macro_help.h>
#if MACH_FIXPRI
#include <mach/policy.h>
#endif /* MACH_FIXPRI */
#if STAT_TIME
/*
* Statistical timing uses microseconds as timer units. 18 bit shift
* yields priorities. PRI_SHIFT_2 isn't needed.
*/
#define PRI_SHIFT 18
#else /* STAT_TIME */
/*
* Otherwise machine provides shift(s) based on time units it uses.
*/
#include <machine/sched_param.h>
#endif /* STAT_TIME */
#define NRQS 50 /* 50 run queues per cpu */
struct run_queue {
queue_head_t runq[NRQS]; /* one for each priority */
decl_simple_lock_data(, lock) /* one lock for all queues */
int low; /* low queue value */
int count; /* count of threads runable */
};
typedef struct run_queue *run_queue_t;
#define RUN_QUEUE_NULL ((run_queue_t) 0)
#if MACH_FIXPRI
/*
* NOTE: For fixed priority threads, first_quantum indicates
* whether context switch at same priority is ok. For timeshareing
* it indicates whether preempt is ok.
*/
#define csw_needed(thread, processor) ((thread)->state & TH_SUSP || \
((processor)->runq.count > 0) || \
((thread)->policy == POLICY_TIMESHARE && \
(processor)->first_quantum == FALSE && \
(processor)->processor_set->runq.count > 0 && \
(processor)->processor_set->runq.low <= \
(thread)->sched_pri) || \
((thread)->policy == POLICY_FIXEDPRI && \
(processor)->processor_set->runq.count > 0 && \
((((processor)->first_quantum == FALSE) && \
((processor)->processor_set->runq.low <= \
(thread)->sched_pri)) || \
((processor)->processor_set->runq.low < \
(thread)->sched_pri))))
#else /* MACH_FIXPRI */
#define csw_needed(thread, processor) ((thread)->state & TH_SUSP || \
((processor)->runq.count > 0) || \
((processor)->first_quantum == FALSE && \
((processor)->processor_set->runq.count > 0 && \
(processor)->processor_set->runq.low <= \
((thread)->sched_pri))))
#endif /* MACH_FIXPRI */
/*
* Scheduler routines.
*/
extern struct run_queue *rem_runq(thread_t);
extern struct thread *choose_thread(processor_t);
extern queue_head_t action_queue; /* assign/shutdown queue */
decl_simple_lock_data(extern,action_lock);
extern int min_quantum; /* defines max context switch rate */
/*
* Default base priorities for threads.
*/
#define BASEPRI_SYSTEM 6
#define BASEPRI_USER 25
/*
* Macro to check for invalid priorities.
*/
#define invalid_pri(pri) (((pri) < 0) || ((pri) >= NRQS))
/*
* Shift structures for holding update shifts. Actual computation
* is usage = (usage >> shift1) +/- (usage >> abs(shift2)) where the
* +/- is determined by the sign of shift 2.
*/
struct shift {
int shift1;
int shift2;
};
typedef struct shift *shift_t, shift_data_t;
/*
* sched_tick increments once a second. Used to age priorities.
*/
extern unsigned sched_tick;
#define SCHED_SCALE 128
#define SCHED_SHIFT 7
/*
* thread_timer_delta macro takes care of both thread timers.
*/
#define thread_timer_delta(thread) \
MACRO_BEGIN \
unsigned delta; \
\
delta = 0; \
TIMER_DELTA((thread)->system_timer, \
(thread)->system_timer_save, delta); \
TIMER_DELTA((thread)->user_timer, \
(thread)->user_timer_save, delta); \
(thread)->cpu_delta += delta; \
(thread)->sched_delta += delta * \
(thread)->processor_set->sched_load; \
MACRO_END
#if SIMPLE_CLOCK
/*
* sched_usec is an exponential average of number of microseconds
* in a second for clock drift compensation.
*/
extern int sched_usec;
#endif /* SIMPLE_CLOCK */
#endif /* _KERN_SCHED_H_ */
|