root / lab4 / .minix-src / include / sys / sched.h @ 13
History | View | Annotate | Download (9.04 KB)
1 |
/* $NetBSD: sched.h,v 1.75 2011/11/21 04:36:05 christos Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 1999, 2000, 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by Ross Harvey, Jason R. Thorpe, Nathan J. Williams, Andrew Doran and
|
9 |
* Daniel Sieger.
|
10 |
*
|
11 |
* Redistribution and use in source and binary forms, with or without
|
12 |
* modification, are permitted provided that the following conditions
|
13 |
* are met:
|
14 |
* 1. Redistributions of source code must retain the above copyright
|
15 |
* notice, this list of conditions and the following disclaimer.
|
16 |
* 2. Redistributions in binary form must reproduce the above copyright
|
17 |
* notice, this list of conditions and the following disclaimer in the
|
18 |
* documentation and/or other materials provided with the distribution.
|
19 |
*
|
20 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
21 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
24 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30 |
* POSSIBILITY OF SUCH DAMAGE.
|
31 |
*/
|
32 |
|
33 |
/*-
|
34 |
* Copyright (c) 1982, 1986, 1991, 1993
|
35 |
* The Regents of the University of California. All rights reserved.
|
36 |
* (c) UNIX System Laboratories, Inc.
|
37 |
* All or some portions of this file are derived from material licensed
|
38 |
* to the University of California by American Telephone and Telegraph
|
39 |
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
|
40 |
* the permission of UNIX System Laboratories, Inc.
|
41 |
*
|
42 |
* Redistribution and use in source and binary forms, with or without
|
43 |
* modification, are permitted provided that the following conditions
|
44 |
* are met:
|
45 |
* 1. Redistributions of source code must retain the above copyright
|
46 |
* notice, this list of conditions and the following disclaimer.
|
47 |
* 2. Redistributions in binary form must reproduce the above copyright
|
48 |
* notice, this list of conditions and the following disclaimer in the
|
49 |
* documentation and/or other materials provided with the distribution.
|
50 |
* 3. Neither the name of the University nor the names of its contributors
|
51 |
* may be used to endorse or promote products derived from this software
|
52 |
* without specific prior written permission.
|
53 |
*
|
54 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
55 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
56 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
57 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
58 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
59 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
60 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
61 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
62 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
63 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
64 |
* SUCH DAMAGE.
|
65 |
*
|
66 |
* @(#)kern_clock.c 8.5 (Berkeley) 1/21/94
|
67 |
*/
|
68 |
|
69 |
#ifndef _SYS_SCHED_H_
|
70 |
#define _SYS_SCHED_H_
|
71 |
|
72 |
#include <sys/featuretest.h> |
73 |
#include <sys/types.h> |
74 |
|
75 |
#if defined(_KERNEL_OPT)
|
76 |
#include "opt_multiprocessor.h" |
77 |
#include "opt_lockdebug.h" |
78 |
#endif
|
79 |
|
80 |
struct sched_param {
|
81 |
int sched_priority;
|
82 |
}; |
83 |
|
84 |
/*
|
85 |
* Scheduling policies required by IEEE Std 1003.1-2001
|
86 |
*/
|
87 |
#define SCHED_NONE -1 |
88 |
#define SCHED_OTHER 0 |
89 |
#define SCHED_FIFO 1 |
90 |
#define SCHED_RR 2 |
91 |
|
92 |
#if defined(_NETBSD_SOURCE)
|
93 |
__BEGIN_DECLS |
94 |
|
95 |
/*
|
96 |
* Interface of CPU-sets.
|
97 |
*/
|
98 |
typedef struct _cpuset cpuset_t; |
99 |
|
100 |
#ifndef _KERNEL
|
101 |
|
102 |
#define cpuset_create() _cpuset_create()
|
103 |
#define cpuset_destroy(c) _cpuset_destroy(c)
|
104 |
#define cpuset_size(c) _cpuset_size(c)
|
105 |
#define cpuset_zero(c) _cpuset_zero(c)
|
106 |
#define cpuset_isset(i, c) _cpuset_isset(i, c)
|
107 |
#define cpuset_set(i, c) _cpuset_set(i, c)
|
108 |
#define cpuset_clr(i, c) _cpuset_clr(i, c)
|
109 |
|
110 |
cpuset_t *_cpuset_create(void);
|
111 |
void _cpuset_destroy(cpuset_t *);
|
112 |
void _cpuset_zero(cpuset_t *);
|
113 |
int _cpuset_set(cpuid_t, cpuset_t *);
|
114 |
int _cpuset_clr(cpuid_t, cpuset_t *);
|
115 |
int _cpuset_isset(cpuid_t, const cpuset_t *); |
116 |
size_t _cpuset_size(const cpuset_t *);
|
117 |
|
118 |
#endif
|
119 |
|
120 |
/*
|
121 |
* Internal affinity and scheduling calls.
|
122 |
*/
|
123 |
int _sched_getaffinity(pid_t, lwpid_t, size_t, cpuset_t *);
|
124 |
int _sched_setaffinity(pid_t, lwpid_t, size_t, const cpuset_t *); |
125 |
int _sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); |
126 |
int _sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); |
127 |
__END_DECLS |
128 |
|
129 |
/*
|
130 |
* CPU states.
|
131 |
* XXX Not really scheduler state, but no other good place to put
|
132 |
* it right now, and it really is per-CPU.
|
133 |
*/
|
134 |
#define CP_USER 0 |
135 |
#define CP_NICE 1 |
136 |
#define CP_SYS 2 |
137 |
#define CP_INTR 3 |
138 |
#define CP_IDLE 4 |
139 |
#define CPUSTATES 5 |
140 |
|
141 |
#if defined(_KERNEL) || defined(_KMEMUSER)
|
142 |
|
143 |
#include <sys/mutex.h> |
144 |
#include <sys/time.h> |
145 |
|
146 |
/*
|
147 |
* Per-CPU scheduler state. Field markings and the corresponding locks:
|
148 |
*
|
149 |
* s: splsched, may only be safely accessed by the CPU itself
|
150 |
* m: spc_mutex
|
151 |
* (: unlocked, stable
|
152 |
* c: cpu_lock
|
153 |
*/
|
154 |
struct schedstate_percpu {
|
155 |
/* First set of data is likely to be accessed by other CPUs. */
|
156 |
kmutex_t *spc_mutex; /* (: lock on below, runnable LWPs */
|
157 |
kmutex_t *spc_lwplock; /* (: general purpose lock for LWPs */
|
158 |
struct lwp *spc_migrating; /* (: migrating LWP */ |
159 |
pri_t spc_curpriority;/* m: usrpri of curlwp */
|
160 |
pri_t spc_maxpriority;/* m: highest priority queued */
|
161 |
psetid_t spc_psid; /* c: processor-set ID */
|
162 |
time_t spc_lastmod; /* c: time of last cpu state change */
|
163 |
|
164 |
/* For the most part, this set of data is CPU-private. */
|
165 |
void *spc_sched_info;/* (: scheduler-specific structure */ |
166 |
volatile int spc_flags; /* s: flags; see below */ |
167 |
u_int spc_schedticks; /* s: ticks for schedclock() */
|
168 |
uint64_t spc_cp_time[CPUSTATES];/* s: CPU state statistics */
|
169 |
int spc_ticks; /* s: ticks until sched_tick() */ |
170 |
int spc_pscnt; /* s: prof/stat counter */ |
171 |
int spc_psdiv; /* s: prof/stat divisor */ |
172 |
}; |
173 |
|
174 |
/* spc_flags */
|
175 |
#define SPCF_SEENRR 0x0001 /* process has seen roundrobin() */ |
176 |
#define SPCF_SHOULDYIELD 0x0002 /* process should yield the CPU */ |
177 |
#define SPCF_OFFLINE 0x0004 /* CPU marked offline */ |
178 |
#define SPCF_RUNNING 0x0008 /* CPU is running */ |
179 |
#define SPCF_NOINTR 0x0010 /* shielded from interrupts */ |
180 |
|
181 |
#define SPCF_SWITCHCLEAR (SPCF_SEENRR|SPCF_SHOULDYIELD)
|
182 |
|
183 |
#endif /* defined(_KERNEL) || defined(_KMEMUSER) */ |
184 |
|
185 |
/*
|
186 |
* Flags passed to the Linux-compatible __clone(2) system call.
|
187 |
*/
|
188 |
#define CLONE_CSIGNAL 0x000000ff /* signal to be sent at exit */ |
189 |
#define CLONE_VM 0x00000100 /* share address space */ |
190 |
#define CLONE_FS 0x00000200 /* share "file system" info */ |
191 |
#define CLONE_FILES 0x00000400 /* share file descriptors */ |
192 |
#define CLONE_SIGHAND 0x00000800 /* share signal actions */ |
193 |
#define CLONE_PID 0x00001000 /* share process ID */ |
194 |
#define CLONE_PTRACE 0x00002000 /* ptrace(2) continues on |
195 |
child */
|
196 |
#define CLONE_VFORK 0x00004000 /* parent blocks until child |
197 |
exits */
|
198 |
|
199 |
#endif /* _NETBSD_SOURCE */ |
200 |
|
201 |
#ifdef _KERNEL
|
202 |
|
203 |
extern int schedhz; /* ideally: 16 */ |
204 |
|
205 |
struct proc;
|
206 |
struct cpu_info;
|
207 |
|
208 |
/*
|
209 |
* Common Scheduler Interface.
|
210 |
*/
|
211 |
|
212 |
/* Scheduler initialization */
|
213 |
void runq_init(void); |
214 |
void synch_init(void); |
215 |
void sched_init(void); |
216 |
void sched_rqinit(void); |
217 |
void sched_cpuattach(struct cpu_info *); |
218 |
|
219 |
/* Time-driven events */
|
220 |
void sched_tick(struct cpu_info *); |
221 |
void schedclock(struct lwp *); |
222 |
void sched_schedclock(struct lwp *); |
223 |
void sched_pstats(void); |
224 |
void sched_lwp_stats(struct lwp *); |
225 |
void sched_pstats_hook(struct lwp *, int); |
226 |
|
227 |
/* Runqueue-related functions */
|
228 |
bool sched_curcpu_runnable_p(void); |
229 |
void sched_dequeue(struct lwp *); |
230 |
void sched_enqueue(struct lwp *, bool); |
231 |
struct lwp * sched_nextlwp(void); |
232 |
void sched_oncpu(struct lwp *); |
233 |
void sched_newts(struct lwp *); |
234 |
|
235 |
/* Priority adjustment */
|
236 |
void sched_nice(struct proc *, int); |
237 |
|
238 |
/* Handlers of fork and exit */
|
239 |
void sched_proc_fork(struct proc *, struct proc *); |
240 |
void sched_proc_exit(struct proc *, struct proc *); |
241 |
void sched_lwp_fork(struct lwp *, struct lwp *); |
242 |
void sched_lwp_collect(struct lwp *); |
243 |
|
244 |
void sched_slept(struct lwp *); |
245 |
void sched_wakeup(struct lwp *); |
246 |
|
247 |
void setrunnable(struct lwp *); |
248 |
void sched_setrunnable(struct lwp *); |
249 |
|
250 |
struct cpu_info *sched_takecpu(struct lwp *); |
251 |
void sched_print_runqueue(void (*pr)(const char *, ...) |
252 |
__printflike(1, 2)); |
253 |
|
254 |
/* Dispatching */
|
255 |
bool kpreempt(uintptr_t);
|
256 |
void preempt(void); |
257 |
void yield(void); |
258 |
int mi_switch(struct lwp *); |
259 |
void updatertime(lwp_t *, const struct bintime *); |
260 |
void sched_idle(void); |
261 |
void suspendsched(void); |
262 |
|
263 |
int do_sched_setparam(pid_t, lwpid_t, int, const struct sched_param *); |
264 |
int do_sched_getparam(pid_t, lwpid_t, int *, struct sched_param *); |
265 |
|
266 |
#endif /* _KERNEL */ |
267 |
#endif /* _SYS_SCHED_H_ */ |