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;
}