Cobalt/POSIX 进程调度。
title: Cobalt/Process scheduling
int sched_get_priority_max (int policy)
获取指定调度策略的最大优先级。
该服务返回调度策略 policy 的最大优先级。
参数:
返回值:
标签:
thread-unrestricted,switch-secondary注意:
获取 SCHED_FIFO、SCHED_RR 或任何 xkernel 特定策略的最大优先级级别不会导致模式切换。policy 的任何其他值可能会将调用者切换到次级模式。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <errno.h>
int main() {
int policy = SCHED_FIFO; // 可以选择 SCHED_OTHER, SCHED_RR, SCHED_FIFO
int max_priority;
// 获取指定调度策略的最大优先级
max_priority = sched_get_priority_max(policy);
// 检查返回值
if (max_priority == -1) {
perror("sched_get_priority_max");
exit(EXIT_FAILURE);
}
printf("The maximum priority for policy %d is: %d\n", policy, max_priority);
return 0;
}
int sched_get_priority_max_ex (int policy)
获取指定调度策略的扩展最大优先级。
该服务返回调度策略 policy 的最大优先级,反映任何 Cobalt 对标准类的扩展。
参数:
返回值:
标签:
thread-unrestricted示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <errno.h>
int main() {
int policy = SCHED_FIFO; // 可以选择 SCHED_OTHER, SCHED_RR, SCHED_FIFO
int max_priority;
// 获取指定调度策略的最大优先级
max_priority = sched_get_priority_max_ex(policy);
// 检查返回值
if (max_priority == -1) {
perror("sched_get_priority_max_ex");
exit(EXIT_FAILURE);
}
printf("The maximum priority for policy %d is: %d\n", policy, max_priority);
return 0;
}
int sched_get_priority_min (int policy)
获取指定调度策略的最小优先级。
该服务返回调度策略 policy 的最小优先级。
参数:
返回值:
标签:
thread-unrestricted,switch-secondary注意:
获取 SCHED_FIFO、SCHED_RR 或任何 xkernel 特定策略的最小优先级级别不会导致模式切换。policy 的任何其他值可能会将调用者切换到次级模式。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <errno.h>
int main() {
int policy = SCHED_FIFO; // 可以选择 SCHED_OTHER, SCHED_RR, SCHED_FIFO
int min_priority;
// 获取指定调度策略的最大优先级
min_priority = sched_get_priority_min(policy);
// 检查返回值
if (min_priority == -1) {
perror("sched_get_priority_min");
exit(EXIT_FAILURE);
}
printf("The minimum priority for policy %d is: %d\n", policy, min_priority);
return 0;
}
int sched_get_priority_min_ex (int policy)
获取指定调度策略的扩展最小优先级。
该服务返回调度策略 policy 的最小优先级,反映任何 Cobalt 对标准类的扩展。
参数:
返回值:
标签:
thread-unrestricted示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <errno.h>
int main() {
int policy = SCHED_FIFO; // 可以选择 SCHED_OTHER, SCHED_RR, SCHED_FIFO
int min_priority;
// 获取指定调度策略的最大优先级
min_priority = sched_get_priority_min_ex(policy);
// 检查返回值
if (min_priority == -1) {
perror("sched_get_priority_min_ex");
exit(EXIT_FAILURE);
}
printf("The minimum priority for policy %d is: %d\n", policy, min_priority);
return 0;
}
ssize_t sched_getconfig_np (int cpu, int policy, union sched_config *config, size_t *len_r)
检索特定 CPU 的调度策略设置。
配置严格地局限于目标 cpu,并且可能与其他处理器不同。
参数:
SCHED_TP 和 SCHED_QUOTA 是有效输入。SCHED_TP 具体细节:
成功返回时,config->quota.tp 包含 cpu 上活动的 TP 调度。
SCHED_QUOTA 具体细节:
进入时,config->quota.get.tgid 必须包含要查询的线程组标识符。
成功退出时,config->quota.info 包含与 config->quota.get.tgid 引用的线程组相关的信息。
参数:
返回值:
SCHED_QUOTA 时,如果执行操作所需的组标识符无效(即 config->quota.get.tgid 无效)。标签:
thread-unrestricted,switch-primary示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <cobalt/sched.h>
void *thread_function(void *arg) {
int cpu = 0; // 目标 CPU
union sched_config config;
size_t len;
// 设置 TP 调度窗口
config.tp.op = sched_tp_install;
config.tp.nr_windows = 1;
// 配置1个时间窗口
config.tp.windows[0].offset.tv_sec = 0;
config.tp.windows[0].offset.tv_nsec = 10000000;
config.tp.windows[0].duration.tv_sec = 0;
config.tp.windows[0].duration.tv_nsec = 10000000; // 10ms
config.tp.windows[0].ptid = 2;
len = sizeof(config.tp);
// 设置 SCHED_TP 配置
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np");
exit(EXIT_FAILURE);
}
// 检索 SCHED_TP 配置
len = sizeof(config);
if (sched_getconfig_np(cpu, SCHED_TP, &config, &len) < 0) {
perror("sched_getconfig_np");
exit(EXIT_FAILURE);
}
printf("Successfully retrieved SCHED_TP configuration for CPU %d\n", cpu);
printf("Number of windows: %d\n", config.tp.nr_windows);
// 打印每个时间窗口的信息
for (int i = 0; i < config.tp.nr_windows; i++) {
printf("Window %d:\n", i);
printf(" Offset: %ld.%09ld\n",
config.tp.windows[i].offset.tv_sec,
config.tp.windows[i].offset.tv_nsec);
printf(" Duration: %ld.%09ld\n",
config.tp.windows[i].duration.tv_sec,
config.tp.windows[i].duration.tv_nsec);
printf(" Partition ID: %d\n", config.tp.windows[i].ptid);
}
// 启动 TP 调度
config.tp.op = sched_tp_start;
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np (start)");
exit(EXIT_FAILURE);
}
printf("Thread running with PID: %d\n", getpid());
for (int i = 0; i < 3; i++) {
printf("Thread: %d\n", i);
sleep(1);
}
//停止TP调度并卸载
config.tp.op = sched_tp_stop;
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np (start)");
exit(EXIT_FAILURE);
}
config.tp.op = sched_tp_uninstall;
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np (start)");
exit(EXIT_FAILURE);
}
pthread_exit(0);
}
int main() {
pthread_t thread;
// 创建线程
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
perror("pthread_create");
return EXIT_FAILURE;
}
// 等待线程结束
pthread_join(thread, NULL);
printf("Thread finished.\n");
return EXIT_SUCCESS;
}
int sched_setconfig_np (int cpu, int policy, const union sched_config *config, size_t len)
为特定 CPU 设置调度策略配置。
配置严格地局限于目标 cpu,并且可能与其他处理器不同。
参数:
此调用根据请求的操作控制 cpu 的时间分区。
注意:
此调用管理在 cpu 上运行的线程组,定义每组的配额以限制其 CPU 消耗。
参数:
返回值:
标签:
thread-unrestricted,switch-primary示例代码
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <cobalt/sched.h>
void *thread_function(void *arg) {
int cpu = 0; // 目标 CPU
union sched_config config;
size_t len;
// 设置 TP 调度窗口
config.tp.op = sched_tp_install;
config.tp.nr_windows = 1;
// 配置1个时间窗口
config.tp.windows[0].offset.tv_sec = 0;
config.tp.windows[0].offset.tv_nsec = 0;
config.tp.windows[0].duration.tv_sec = 0;
config.tp.windows[0].duration.tv_nsec = 10000000; // 10ms
config.tp.windows[0].ptid = 1;
len = sizeof(config.tp);
// 设置 SCHED_TP 配置
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np");
exit(EXIT_FAILURE);
}
printf("Successfully set SCHED_TP configuration for CPU %d\n", cpu);
// 启动 TP 调度
config.tp.op = sched_tp_start;
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np (start)");
exit(EXIT_FAILURE);
}
printf("Started SCHED_TP scheduling on CPU %d\n", cpu);
printf("Thread running with PID: %d\n", getpid());
for (int i = 0; i < 3; i++) {
printf("Thread: %d\n", i);
sleep(1);
}
// 停止TP调度并卸载
config.tp.op = sched_tp_stop;
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np (start)");
exit(EXIT_FAILURE);
}
config.tp.op = sched_tp_uninstall;
if (sched_setconfig_np(cpu, SCHED_TP, &config, len) < 0) {
perror("sched_setconfig_np (start)");
exit(EXIT_FAILURE);
}
pthread_exit(0);
}
int main() {
pthread_t thread;
// 创建线程
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
perror("pthread_create");
return EXIT_FAILURE;
}
// 等待线程结束
pthread_join(thread, NULL);
printf("Thread finished.\n");
return EXIT_SUCCESS;
}
int sched_getscheduler (pid_t pid)
获取指定进程的调度策略。
该服务检索由 pid 标识的 Cobalt 进程的调度策略。
如果 pid 未标识现有的 Cobalt 线程/进程,则该服务回退到常规的 sched_getscheduler() 服务。
参数:
返回值:
标签:
thread-unrestricted示例代码
#include <stdio.h>
#include <sched.h>
#include <stdlib.h>
#include <errno.h>
int main() {
// 获取当前进程的调度策略
int policy = sched_getscheduler(0);
if (policy == -1) {
perror("sched_getscheduler failed");
exit(EXIT_FAILURE);
}
// 根据获取的策略打印对应的调度策略名称
switch (policy) {
case SCHED_OTHER:
printf("Current policy: SCHED_OTHER\n");
break;
case SCHED_FIFO:
printf("Current policy: SCHED_FIFO\n");
break;
case SCHED_RR:
printf("Current policy: SCHED_RR\n");
break;
default:
printf("Current policy: Unknown (%d)\n", policy);
break;
}
return 0;
}
int sched_getscheduler_ex (pid_t pid, int *policy_r, struct sched_param_ex *param_ex)
获取进程的扩展调度策略。
该服务是 sched_getscheduler() 服务的扩展版本,支持 Cobalt 特定和/或主机 Linux 环境不可用的附加调度策略。它检索由 pid 标识的 Cobalt 进程/线程的调度策略及相关的调度参数(例如优先级)。
参数:
返回值:
标签:
thread-unrestricted示例代码
#include <stdio.h>
#include <sched.h>
#include <stdlib.h>
#include <errno.h>
#include <cobalt/sched.h>
int main() {
struct sched_param_ex param;
int policy;
// 获取当前进程的调度策略和参数
sched_getscheduler_ex(0,&policy,¶m);
if (policy == -1) {
perror("sched_getscheduler failed");
exit(EXIT_FAILURE);
}
// 根据获取的策略打印对应的调度策略名称
switch (policy) {
case SCHED_OTHER:
printf("Current policy: SCHED_OTHER\n");
break;
case SCHED_FIFO:
printf("Current policy: SCHED_FIFO\n");
break;
case SCHED_RR:
printf("Current policy: SCHED_RR\n");
break;
default:
printf("Current policy: Unknown (%d)\n", policy);
break;
}
// 打印当前进程的调度优先级
printf("Current priority: %d\n", param.sched_priority);
return 0;
}
int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param)
设置指定进程的调度策略和参数。
该服务将由 pid 标识的 Cobalt 进程的调度策略设置为 policy,并将其调度参数(即优先级)设置为 param 指向的值。
如果传递当前的 Linux 线程 ID(参见 gettid(2)),该服务会将当前的常规 POSIX 线程转换为 Cobalt 线程。如果 pid 既不是当前线程的标识符,也不是现有 Cobalt 线程的标识符,则该服务回退到常规的 sched_setscheduler() 服务。
参数:
SCHED_FIFO、SCHED_RR 或 SCHED_OTHER 之一;返回值:
CONFIG_XENO_OPT_SYS_HEAPSZ;注意:
sched_setscheduler_ex()。标签:
thread-unrestricted,switch-secondary,switch-primary示例代码
#include <stdio.h>
#include <sched.h>
#include <stdlib.h>
#include <errno.h>
int main() {
// 获取当前进程的调度策略
int policy = sched_getscheduler(0);
if (policy == -1) {
perror("sched_getscheduler failed");
exit(EXIT_FAILURE);
}
// 获取当前进程的调度参数
struct sched_param param;
if (sched_getparam(0, ¶m) == -1) {
perror("sched_getparam failed");
exit(EXIT_FAILURE);
}
printf("Befor-Set : policy[%d] priority[%d]\n",policy, param.sched_priority);
param.sched_priority = 15;
if (sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) {
perror("sched_getparam failed");
exit(EXIT_FAILURE);
}
policy = sched_getscheduler(0);
if (policy == -1) {
perror("sched_getscheduler failed");
exit(EXIT_FAILURE);
}
// 获取当前进程的调度参数
if (sched_getparam(0, ¶m) == -1) {
perror("sched_getparam failed");
exit(EXIT_FAILURE);
}
printf("After-Set : policy[%d] priority[%d]\n",policy, param.sched_priority);
return 0;
}
int sched_setscheduler_ex (pid_t pid, int policy, const struct sched_param_ex *param_ex)
设置进程的扩展调度策略。
该服务是 sched_setscheduler() 服务的扩展版本,支持 Cobalt 特定和/或主机 Linux 环境不可用的附加调度策略。它将由 pid 标识的 Cobalt 进程/线程的调度策略设置为 policy 的值,并将其调度参数(例如优先级)设置为 param_ex 指向的值。
如果传递当前的 Linux 线程 ID 或零(参见 gettid(2)),该服务可能会将当前的常规 POSIX 线程转换为 Cobalt 线程。
参数:
SCHED_WEAK、SCHED_FIFO、SCHED_COBALT、SCHED_RR、SCHED_SPORADIC、SCHED_TP、SCHED_QUOTA 或 SCHED_NORMAL 之一。当启用 CONFIG_XENO_OPT_SCHED_WEAK 时,SCHED_WEAK 在 [0..99] 范围内(包括 0 和 99)展示优先级级别。否则,对于 SCHED_WEAK 策略,sched_priority 必须为零。
返回值:
CONFIG_XENO_OPT_SYS_HEAPSZ;注意:
sched_setscheduler()。标签:
thread-unrestricted,switch-secondary,switch-primary示例代码
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cobalt/sched.h>
int main() {
struct sched_param param;
int policy;
// 获取当前进程的调度策略和参数
sched_getscheduler_ex(0,&policy,¶m);
if (policy == -1) {
perror("sched_getscheduler failed");
exit(EXIT_FAILURE);
}
printf("Befor-Set : policy[%d] priority[%d]\n",policy, param.sched_priority);
param.sched_priority = 15;
if (sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) {
perror("sched_getparam failed");
exit(EXIT_FAILURE);
}
sched_getscheduler_ex(0,&policy,¶m);
if (policy == -1) {
perror("sched_getscheduler failed");
exit(EXIT_FAILURE);
}
printf("After-Set : policy[%d] priority[%d]\n",policy, param.sched_priority);
return 0;
}
int sched_yield (void)
让出处理器。
此函数将当前线程移动到其优先级组的末尾。
返回值:
标签:
thread-unrestricted,switch-primary引用 XNRELAX 和 XNWEAK。
被 pthread_yield() 引用。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>
#define NUM_THREADS 3
void* thread_function(void* arg) {
int thread_id = *((int*)arg);
for (int i = 0; i < 5; ++i) {
printf("Thread %d: working...\n", thread_id);
// 模拟工作
usleep(100000); // 睡眠 100 毫秒
// 调用 sched_yield() 放弃 CPU
printf("Thread %d: yielding...\n", thread_id);
sched_yield();
}
return NULL;
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
// 创建多个线程
for (int i = 0; i < NUM_THREADS; ++i) {
thread_ids[i] = i + 1;
if (pthread_create(&threads[i], NULL, thread_function, &thread_ids[i]) != 0) {
perror("Failed to create thread");
exit(EXIT_FAILURE);
}
}
// 等待所有线程完成
for (int i = 0; i < NUM_THREADS; ++i) {
pthread_join(threads[i], NULL);
}
printf("All threads have finished.\n");
return 0;
}