进程调度(进程优先级和nice值)


基本概念:

进程优先级是一个数值,它通过动态的优先级和静态的优先级来决定进程被CPU处理的顺序。一个拥有更高进程优先级的进程拥有更大的机率得到处理器的处理。


内核根据进程的行为和特性使用试探算法,动态地调整调高或调低动态优先级。一个用户进程可以通过使用进程的nice值间接改变静态优先级。一个拥有更高静态优先级的进程将会拥有更长的时间片(进程能在处理上运行多长时间)。


Linux支持从19(最低优先级)到-20(最高优先级)的nice值。默认值为0。


进程可以通过调整nice值选择以更低优先级运行。

GETPRIORITY(2)                                           Linux Programmer's Manual                                           GETPRIORITY(2)

NAME
       getpriority, setpriority - get/set program scheduling priority

SYNOPSIS
       #include <sys/time.h>
       #include <sys/resource.h>

       int getpriority(int which, int who);
       int setpriority(int which, int who, int prio);


例子,调整nic值,比较相同的任务两个进程的耗时。gcc nice.c

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


int main()
{
    time_t t1, t2, t3;
    time(&t1);


    int i = 0;
    int num = 10000;


    pid_t pid = fork();


    if (pid == 0) {
        int nice = getpriority(PRIO_PROCESS, 0);
        printf("parent nice = %d\n", nice);
        for (i; i<num; --i)
            ;
        time(&t2);
        printf("parent pay %ld sec\n", t2-t1);
    } else if (pid > 0) {
        setpriority(PRIO_PROCESS, 0, 19);
        int nice = getpriority(PRIO_PROCESS, 0);
        printf("child nice = %d\n", nice);
        for (i; i<num; --i)
            ;
        time(&t3);
        printf("child pay %ld sec\n", t3-t1);
    } else {
        perror("fork fail");
        return -1;
    }

    sleep(20);
    return 0;
}

在centos 7运行,有效:



在unubtu 14运行,有效:



通过top命令可以看到当前进程的nice值:



End;

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我明白了。对于这个问题,我可以提供一些思路。 进程调度是操作系统的一个重要功能,它负责决定哪些进程可以占用 CPU,以及在何时执行。在 Linux 中,进程调度是由调度器(scheduler)来实现的。Linux 采用了多种调度策略来满足不同的需求,其中包括时间片轮转调度和静态优先级调度。 时间片轮转调度是一种常见的调度策略,它基于每个进程被分配一定的时间片(通常为几十毫秒),然后按照时间片的顺序轮流执行。当一个进程的时间片用完时,调度器会将 CPU 分配给下一个进程,并将当前进程放回就绪队列的末尾。这种调度策略可以确保所有进程都能够获得一定的 CPU 时间,避免了某些进程长时间占用 CPU 的情况。 静态优先级调度是另一种调度策略,它基于为每个进程分配一个固定的优先级,并按照优先级的顺序执行。在 Linux 中,进程优先级范围是 0 到 139,其中 0 表示最高优先级,139 表示最低优先级。调度器会根据进程优先级来决定哪个进程应该先执行。这种调度策略适合于对实时性要求比较高的应用程序,但可能会导致优先级较低的进程长时间得不到执行。 在 Linux 中,可以通过修改调度器的行为来实现不同的调度策略。例如,可以使用 CFS(Completely Fair Scheduler)来实现时间片轮转调度,或者使用 O(1) 调度器来实现静态优先级调度。此外,还可以使用调度策略和优先级来控制进程的调度行为,例如使用 nice 命令来调整进程优先级。 希望这些信息能够帮助你理解如何在 Linux 中设计一个进程调度系统,包括时间片轮转调度和静态优先级调度。如果你有任何疑问或者需要更详细的信息,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值