root / lab4 / .minix-src / include / sys / sched.h @ 14
History | View | Annotate | Download (9.04 KB)
1 | 13 | up20180614 | /* $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_ */ |