SCHED_IDLE是否实际上会阻止在非空闲内核上执行?

R .. GitHub停止帮助ICE:

我正在尝试使用,在没有优先级继承互斥体的情况下实现无限制的优先级倒置的无特权测试用例SCHED_IDLE该测试适用于SCHED_FIFO不同的实时优先级(非PI互斥锁解除锁定,立即使用PI互斥锁进行解析),但是为了将其包含在无需实时特权即可运行的测试集中,我想使用SCHED_IDLE“中等”和“高”优先级线程都使用SCHED_OTHER(在这种情况下,它并不是真正的优先级“倒置”,但是该概念仍然有效-“中” 线程应禁止执行“低” 线程)。

不幸的是,该测试无法区分PI和非PI互斥锁。无论哪种方式,它都能取得进步。显然,SCHED_IDLE即使有另一个可运行的任务,任务仍在运行。已设置CPU亲和力以将它们全部绑定到同一内核,以便低优先级任务无法迁移到其他内核以运行。而且我知道SCHED_IDLE应该在内核空间中以较高的特权运行任务,以防止内核空间优先级倒置,因此我尝试通过使“低”线程不会进入用户空间来使其进入用户空间的繁忙循环,从而确保其不会进入内核空间,并且strace没有显示它在不应该前进的时间内正在进行系统调用的迹象。

SCHED_IDLE当内核实际上不处于空闲状态时,Linux是否仅允许运行空闲任务?还是我可能会缺少的东西?

这是测试代码,稍作修改后可以在实时模式下运行SCHED_IDLE

#define _GNU_SOURCE
#include <pthread.h>
#include <sched.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <semaphore.h>

sem_t sem;

void *start1(void *p)
{
    pthread_mutex_lock(p);
    sem_post(&sem);
    sem_post(&sem);
    usleep(100000);
    pthread_mutex_unlock(p);
    return 0;
}

void *start2(void *p)
{
    sem_wait(&sem);
    time_t t0 = time(0);
    while (pthread_mutex_trylock(p)) {
        if (time(0)>t0+5) return 0;
    }
    pthread_mutex_unlock(p);
    return 0;
}

void *start3(void *p)
{
    sem_wait(&sem);
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    ts.tv_sec += 5;
    int r;
    if (r=pthread_mutex_timedlock(p, &ts)) {
        printf("failed: %d %s\n", r, strerror(r));
    } else {
        pthread_mutex_unlock(p);
    }
    return 0;
}

int main(int argc, char **argv)
{
    int policy = argc>1 ? SCHED_IDLE : SCHED_FIFO;
    int a = sched_get_priority_min(policy);
    pthread_attr_t attr;
    pthread_t t1,t2,t3;
    struct sched_param param = {0};

    cpu_set_t set = {0};
    CPU_ZERO(&set);
    CPU_SET(0, &set);
    pthread_setaffinity_np(pthread_self(), sizeof set, &set);

    pthread_attr_init(&attr);
    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
    pthread_attr_setschedpolicy(&attr, policy);

    pthread_mutexattr_t ma;
    pthread_mutexattr_init(&ma);
    pthread_mutexattr_setprotocol(&ma, PTHREAD_PRIO_INHERIT);
    pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK);
    pthread_mutex_t mtx;
    pthread_mutex_init(&mtx, &ma);

    sem_init(&sem, 0, 0);

    param.sched_priority = a+1;
    pthread_attr_setschedparam(&attr, &param);
    if (pthread_create(&t2, policy==SCHED_IDLE ? 0 : &attr, start2, &mtx)) return 1;

    param.sched_priority = a+2;
    pthread_attr_setschedparam(&attr, &param);
    if (pthread_create(&t3, policy==SCHED_IDLE ? 0 : &attr, start3, &mtx)) return 1;

    param.sched_priority = a;
    pthread_attr_setschedparam(&attr, &param);
    if (pthread_create(&t1, &attr, start1, &mtx)) return 1;

    pthread_join(t1, 0);
    pthread_join(t2, 0);
    pthread_join(t3, 0);
    return 0;
}
咖啡馆:

SCHED_IDLE当内核实际上不处于空闲状态时,Linux是否仅允许运行空闲任务?还是我可能会缺少的东西?

这是对的。SCHED_IDLE使任务的加权很低但不为零 -比19任务少CPU时间约70%。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SneakyThrows是否实际上阻止了异常的传播?

SELECT .... FOR UPDATE是否实际上会延迟读取?

AWS-Elastic Load Balancing是否实际上阻止LOAD BALANCER故障转移?

在 postgres 循环中,删除实际上会在循环结束时执行吗?

TensorFlow网站上用于降低学习率的示例是否实际上会降低学习率?

为什么queryForObject Kotlin扩展func返回可为空的T?是否实际上会抛出EmptyResultDataAccessException?

对于非Facebook品牌的应用程序,Facebook Graph API read_stream权限实际上已被阻止?

Java内核实际上存在吗?

为什么在Ubuntu 16.04上安装节点6.x实际上会安装节点4.2.6?

实际上阻止此页面创建对话框

使用Goroutine实际上需要更长的时间才能执行

延迟LINQ查询执行实际上如何工作?

按元素运算实际上是执行矩阵运算

Swift 认为非 nil 值实际上是 nil

实际上是Python中的非连续子数组

Javafx WebEngine:后台工作者实际上会发生什么?UI挂在loadContent(大HTML文档)上

C#在属性类上使用[System.Diagnostics.Conditional]属性实际上会做什么

如何检查Uri创建的BitmapImage是否实际上是图像?

AWS Application Load Balancer是否实际上支持压缩?

如何检查Spark是否实际上使工作并行化?

文件实际上是否包含文件结尾(EOF)字符?

Java实际上是否并行运行线程

如何检测长类型是否实际上为NULL?

检查文件是否实际上是一个zipfile

实际上,unordered_map是否比地图快?

如何检查上传的图像是否实际上是图像

实际上是否有处理错误的最佳方法?

如何检查输入是否实际上在熊猫的列中?

serde skip属性实际上会跳过枚举变量吗?