kernel: Scheduler rewrite
This replaces the existing scheduler (but not priority handling) implementation with a somewhat simpler one. Behavior as to thread selection does not change. New features: + Unifies SMP and uniprocessing selection code (with the sole exception of the "cache" trick not being possible in SMP). + The old static multi-queue implementation is gone and has been replaced with a build-time choice of either a "dumb" list implementation (faster and significantly smaller for apps with only a few threads) or a balanced tree queue which scales well to arbitrary numbers of threads and priority levels. This is controlled via the CONFIG_SCHED_DUMB kconfig variable. + The balanced tree implementation is usable symmetrically for the wait_q abstraction, fixing a scalability glitch Zephyr had when many threads were waiting on a single object. This can be selected via CONFIG_WAITQ_FAST. Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
parent
c0ba11b281
commit
1acd8c2996
10 changed files with 600 additions and 484 deletions
47
include/sched_priq.h
Normal file
47
include/sched_priq.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (c) 2018 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef _sched_priq__h_
|
||||
#define _sched_priq__h_
|
||||
|
||||
#include <misc/util.h>
|
||||
#include <misc/dlist.h>
|
||||
#include <misc/rb.h>
|
||||
|
||||
/* Two abstractions are defined here for "thread priority queues".
|
||||
*
|
||||
* One is a "dumb" list implementation appropriate for systems with
|
||||
* small numbers of threads and sensitive to code size. It is stored
|
||||
* in sorted order, taking an O(N) cost every time a thread is added
|
||||
* to the list. This corresponds to the way the original _wait_q_t
|
||||
* abstraction worked and is very fast as long as the number of
|
||||
* threads is small.
|
||||
*
|
||||
* The other is a balanced tree "fast" implementation with rather
|
||||
* larger code size (due to the data structure itself, the code here
|
||||
* is just stubs) and higher constant-factor performance overhead, but
|
||||
* much better O(logN) scaling in the presence of large number of
|
||||
* threads.
|
||||
*
|
||||
* Each can be used for either the wait_q or system ready queue,
|
||||
* configurable at build time.
|
||||
*/
|
||||
|
||||
struct k_thread;
|
||||
|
||||
struct k_thread *_priq_dumb_best(sys_dlist_t *pq);
|
||||
void _priq_dumb_remove(sys_dlist_t *pq, struct k_thread *thread);
|
||||
void _priq_dumb_add(sys_dlist_t *pq, struct k_thread *thread);
|
||||
|
||||
struct _priq_rb {
|
||||
struct rbtree tree;
|
||||
int next_order_key;
|
||||
};
|
||||
|
||||
void _priq_rb_add(struct _priq_rb *pq, struct k_thread *thread);
|
||||
void _priq_rb_remove(struct _priq_rb *pq, struct k_thread *thread);
|
||||
struct k_thread *_priq_rb_best(struct _priq_rb *pq);
|
||||
|
||||
#endif /* _sched_priq__h_ */
|
Loading…
Add table
Add a link
Reference in a new issue