새 리눅스 커널 스케줄러를 만드는 방법
스케줄러 소스 코드(2.6.34, kernel/sched.c)를 보면 "플러그블" 스케줄러가 어떻게 사용되는지 알 수 있고, 구현해야 할 인터페이스를 이해하고 있다고 생각합니다.제가 아직 이해할 수 없는 것은 제 코드를 커널에 내장하는 방법입니다.적어도 다른 사이트에 대한 조언은 감사히 받겠습니다.
지금은 커널 소스 트리에서 SCHED_FIFO, SCHED_RR, SCHED_NORMAL을 grepping하고 있어서 정말 더 통찰력 있는 방법을 찾고 있습니다 :-)
편집: 배경으로서, 저는 FreeB를 매우 잘 알고 있습니다.SD 스케줄러(및 FreeB)일반적으로 SD 커널)을 사용하기 때문에 프로세스/스레드 레벨 스케줄링 방법에 대한 포인터를 찾고 있지 않습니다.일반 리눅스 스케줄러와 함께 나만의 스케줄러를 추가하는 방법을 찾고 있습니다(SCHED_FIFO와 유사).
편집 #2: 아래의 BFS 포인터는 좋은 시작이지만, 여전히 커널에서 CFS를 제거합니다.sched.cow는 다음과 같습니다.
#ifdef CONFIG_SCHED_BFS
#include "sched_bfs.c"
#else
// original sched.c
#endif // CONFIG_SCHED_BFS
이를 조금 더 잘 수행하는 방법에 대한 답변이나 포인터를 보고 싶습니다(즉, 적어도 현재는 CFS를 유지합니다).
편집 #3: 저는 아래의 질문에 답했습니다. 저는 그것을 알아냈다고 생각합니다.
제 질문에 대한 답을 알아냈기 때문에 여기에 추가하려고 생각했습니다.아래는 2.6.34 바닐라 커널에 새 스케줄러를 추가하는 패치입니다.지금은 커널만 정리했습니다.이 RECTURE 패치로 시스템을 실행하면 시스템이 중단될 것으로 예상합니다. 따라서 위험을 무릅쓰고 사용하십시오. :-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 2b7b81d..a2a2b21 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -37,6 +37,7 @@
#define SCHED_RR 2
#define SCHED_BATCH 3
/* SCHED_ISO: reserved but not implemented yet */
+#define SCHED_NEW 4 /* Stealing from SCHED_ISO */
#define SCHED_IDLE 5
/* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */
#define SCHED_RESET_ON_FORK 0x40000000
diff --git a/init/Kconfig b/init/Kconfig
index eb77e8c..0055d26 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -23,6 +23,11 @@ config CONSTRUCTORS
menu "General setup"
+config SCHED_NEW
+ bool "NEW cpu scheduler"
+ ---help---
+ Brand new scheduler
+
config EXPERIMENTAL
bool "Prompt for development and/or incomplete code/drivers"
---help---
diff --git a/kernel/sched.c b/kernel/sched.c
index 3c2a54f..588960d 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1931,6 +1931,7 @@ static void deactivate_task(struct rq *rq, struct task_struct *p, int sleep)
#include "sched_idletask.c"
#include "sched_fair.c"
+#include "sched_new.c"
#include "sched_rt.c"
#ifdef CONFIG_SCHED_DEBUG
# include "sched_debug.c"
diff --git a/kernel/sched_new.c b/kernel/sched_new.c
new file mode 100644
index 0000000..c2e269e
--- /dev/null
+++ b/kernel/sched_new.c
@@ -0,0 +1,140 @@
+#ifdef CONFIG_SCHED_NEW
+
+/*
+ * Starting with a simple, 1 runq per cpu scheduler. Don't care
+ * about fairness for right now. Just get it up and running to
+ * verify that we have the interface correct
+ */
+
+static void
+enqueue_task_new(struct rq *rq, struct task_struct *p, int wakeup, bool head)
+{
+}
+
+static void dequeue_task_new(struct rq *rq, struct task_struct *p, int sleep)
+{
+}
+
+static void yield_task_new(struct rq *rq)
+{
+}
+
+static void check_preempt_curr_new(struct rq *rq, struct task_struct *p, int flags)
+{
+}
+
+static struct task_struct *pick_next_task_new(struct rq *rq)
+{
+}
+
+static void put_prev_task_new(struct rq *rq, struct task_struct *p)
+{
+}
+
+#ifdef CONFIG_SMP
+static int select_task_rq_new(struct task_struct *p, int sd_flag, int flags)
+{
+}
+static void pre_schedule_new(struct rq *rq, struct task_struct *prev)
+{
+}
+
+static void post_schedule_new(struct rq *rq)
+{
+}
+
+static void task_woken_new(struct rq *rq, struct task_struct *p)
+{
+}
+
+static void task_waking_new(struct rq *this_rq, struct task_struct *task)
+{
+}
+static void set_cpus_allowed_new(struct task_struct *p,
+ const struct cpumask *new_mask)
+{
+}
+/* Assumes rq->lock is held */
+static void rq_online_new(struct rq *rq)
+{
+}
+
+/* Assumes rq->lock is held */
+static void rq_offline_new(struct rq *rq)
+{
+}
+#endif /* COMFIG_SMP */
+
+static void set_curr_task_new(struct rq *rq)
+{
+}
+
+
+static void task_tick_new(struct rq *rq, struct task_struct *p, int queued)
+{
+}
+
+static void task_fork_new(struct task_struct *p)
+{
+}
+static void switched_from_new(struct rq *rq, struct task_struct *p,
+ int running)
+{
+}
+static void switched_to_new(struct rq *this_rq, struct task_struct *task,
+ int running)
+{
+}
+static void prio_changed_new(struct rq *rq, struct task_struct *p,
+ int oldprio, int running)
+{
+}
+static unsigned int get_rr_interval_new(struct rq *rq, struct task_struct *task)
+{
+}
+
+
+
+static const struct sched_class new_sched_class = {
+ .next = &fair_sched_class,
+ .enqueue_task = enqueue_task_new,
+ .dequeue_task = dequeue_task_new,
+ .yield_task = yield_task_new,
+
+ .check_preempt_curr = check_preempt_curr_new,
+
+ .pick_next_task = pick_next_task_new,
+ .put_prev_task = put_prev_task_new,
+
+#ifdef CONFIG_SMP
+ .select_task_rq = select_task_rq_new,
+
+ .pre_schedule = pre_schedule_new,
+ .post_schedule = post_schedule_new,
+
+ .task_waking = task_waking_new,
+ .task_woken = task_woken_new,
+
+ .set_cpus_allowed = set_cpus_allowed_new,
+
+ .rq_online = rq_online_new,
+ .rq_offline = rq_offline_new,
+#endif
+
+ .set_curr_task = set_curr_task_new,
+ .task_tick = task_tick_new,
+ .task_fork = task_fork_new,
+
+ .switched_from = switched_from_new,
+ .switched_to = switched_to_new,
+
+ .prio_changed = prio_changed_new,
+
+ .get_rr_interval = get_rr_interval_new,
+#ifdef CONFIG_FAIR_GROUP_SCHED
+ .moved_group = NULL
+#endif
+};
+
+#endif /* CONFIG_SCHED_NEW */
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index b5b920a..aaf4beb 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -1731,7 +1731,11 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task)
}
static const struct sched_class rt_sched_class = {
+#ifdef CONFIG_SCHED_NEW
+ .next = &new_sched_class,
+#else
.next = &fair_sched_class,
+#endif /* CONFIG_SCHED_NEW */
.enqueue_task = enqueue_task_rt,
.dequeue_task = dequeue_task_rt,
.yield_task = yield_task_rt,
Embedded.com 에는 간단한 실시간 스케줄러를 구현하는 3부 항목이 있습니다.
다른 답변과는 달리, 이 답변은 자습서로 작성됩니다.
[...] 문헌에서 Linux의 새로운 스케줄링 정책을 구현하는 방법을 설명하는 문서를 찾을 수 없었습니다.
[...]
본 문서에서는 새로운 스케줄링 정책을 구현하는 데 필요한 모든 단계를 [sic] depth description으로 제시했습니다.
[...]
이것은 그 스케줄링 알고리즘의 간단한 구현입니다.그러나 몇 가지를 언급하자면, 중단, 타이머 및 멀티프로세서 시스템과 같은 고급 문제는 이 기사의 범위를 벗어납니다.
Con Kolivas Brainfuck Scheduler.구글 검색으로 찾은 겁니다.시작하는 것이 예가 될 수 있습니다.
언급URL : https://stackoverflow.com/questions/3086864/how-to-create-a-new-linux-kernel-scheduler
'programing' 카테고리의 다른 글
언로드 전 팝업에 사용자 지정 메시지를 표시할 수 있습니까? (0) | 2023.09.16 |
---|---|
C 표준 라이브러리의 심볼은 C++에 예약되어 있습니까? (0) | 2023.09.16 |
리프 서명을 확인할 수 없습니다. (0) | 2023.09.16 |
자바스크립트에서 날짜에서 분을 빼려면 어떻게 해야 합니까? (0) | 2023.09.16 |
STATION에서 모음(즉, a, e, i, o 또는 u)으로 시작하는 CITY 이름 목록 쿼리 (0) | 2023.09.16 |