Linux:如何使用 FIFO 调度器找到两个进程之间的抢占时间

问题描述

我目前正在尝试使用 Linux FIFO 调度程序。

其实我想找到两个进程之间的抢占时间。为此,我的计划是创建两个进程,一个优先级较低,另一个优先级较高。然后在 FIFO 调度程序中,我将首先运行较低优先级的进程,当该进程正在执行时,我也将开始运行较高优先级的进程。现在,较高优先级的进程应该抢占较低优先级的进程,我将计算抢占时间。在低优先级进程和高优先级进程中,都会有一个 while 循环将时间戳存储在一个数组中。让 t1 和 t2 是较低和较高优先级进程实际开始运行时的时间戳,td 是我给出运行这两个进程的命令之间的持续时间。那么抢占时间应该是tp = t2 - t1 - td.

这是shell脚本。

gcc -Wall -Wextra -g -o lower_priority_process lower_priority_process.c
gcc -Wall -Wextra -g -o higher_priority_process higher_priority_process.c
sudo taskset --cpu-list 0 chrt -f 30 ./lower_priority_process &
sleep 0.0001
sudo taskset --cpu-list 0 chrt -f 50 ./higher_priority_process &
sleep 30
exit

这是lower_priority_process.c的代码

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <sched.h>


int main(int argc,char *argv[])
{
    long long int j = 0;
    long long int a[1000000] = {0};
    struct timeval timer_usec; 
    long long int timestamp_usec; /* timestamp in microsecond */
    while(i<500000){
            if (!gettimeofday(&timer_usec,NULL)) {
                timestamp_usec = ((long long int) timer_usec.tv_sec) * 1000000ll + (long long int) timer_usec.tv_usec;
            }
            else {
                timestamp_usec = -1;
            }
            a[j] = timestamp_usec;
            j++;
    }
    FILE *fp;
    fp = fopen("f1.txt","a+");
    for(int k=0; k<1000000; k++){
        if(a[k] == 0) break;
        fprintf("Process A: %lld\n",a[k]);
        fflush(stdout);
    }
    return 0;
}

类似于lower_priority_process.c,这里是higher_priority_process.c的代码

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <sched.h>


int main(int argc,"a+");
    for(int k=0; k<1000000; k++){
        if(a[k] == 0) break;
        fprintf("Process B: %lld\n",a[k]);
        fflush(stdout);
    }
    return 0;
}

现在我也在这里问过类似的问题:Linux: FIFO scheduler isn't working as expected。这里我面临的问题是两个进程的时间戳交错出现。 (这个问题中的代码有点不同)。在那里的答案中,我指出 I/O 操作被阻塞,因此在等待 IO 操作完成时进程被抢占。有人建议我在共享内存上进行非阻塞写入,但在此之前,为了交叉检查我将所有时间戳存储在一个数组中,并且仅在进程结束时进行 IO 操作。因此,当前代码中的循环是非阻塞的,时间戳不应交错。但这不是正在发生的事情。

正如这里的答案所给出的,有人认为问题是由于代码之间存在阻塞 IO 操作。所以在实现非阻塞 IO 之前,我尝试将所有 IO 放在函数的末尾,以检查 IO 操作是否真的是这里唯一的罪魁祸首。所以我所做的是将中间的时间戳存储在一个数组中,然后最后打印该数组。由于循环是非阻塞部分,因此在其执行期间不应该有任何上下文切换,因此我最终应该得到非隔行输出。然而,这不是我发现的。我发现时间戳是隔行的,这仍然让我很困惑。

以下是交错的样子:

Process A: 1613841162546322
Process A: 1613841162546323
Process B: 1613841162546323
Process A: 1613841162546324
Process B: 1613841162546325
Process A: 1613841162546326
Process B: 1613841162546326

请帮助我理解为什么会发生这种情况,并告诉我我找到两个进程之间抢占时间的方法是否正确。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)