更改进程的 nice 值对 Linux 没有影响
Changing nice value of a process has no effect in Linux
我看了APUE 3rd, 8.16 Process Scheduling, 有一个例子来验证改变一个进程的nice值会影响它的优先级,我重写了如下代码:
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
long long count;
struct timeval end;
static void check_time(const char* str);
int main(int argc, char* argv[])
{
pid_t pid;
char* s;
int nzero, ret;
int adj = 0;
setbuf(stdout, NULL);
#if defined(NZERO)
nzero = NZERO;
#elif defined(_SC_NZERO)
nzero = sysconf(_SC_NZERO);
#else
#error NZERO undefined
#endif
printf("NZERO = %d\n", nzero);
if (argc == 2)
adj = strtol(argv[1], NULL, 10);
gettimeofday(&end, NULL);
end.tv_sec += 10;
if ((pid = fork()) < 0) {
perror("fork error");
return -1;
} else if (pid == 0) {
s = "child";
printf("child nice:%d, adjusted by %d\n", nice(0) + nzero, adj);
errno = 0;
if ((ret = nice(adj)) == -1 && errno != 0) {
perror("nice error");
return -1;
}
printf("child now nice:%d\n", ret + nzero);
} else {
s = "parent";
printf("parent nice:%d\n", nice(0) + nzero);
}
while (1) {
if (++count == 0) {
printf("count overflow\n");
return -1;
}
check_time(s);
}
return 0;
}
static void check_time(const char* str)
{
struct timeval tv;
gettimeofday(&tv, NULL);
if (tv.tv_sec >= end.tv_sec && tv.tv_usec >= end.tv_usec) {
printf("%s count:%lld\n", str, count);
exit(0);
}
}
示例结果如下:
零 = 20
parentnice:20
child nice:20, 调整0
child现在nice:20
parentcount:601089419
childcount:603271014
看起来 child 进程没有受到影响,为什么?以及如何使结果符合我的预期?
(我的平台是:Linux liucong-dell 4.4.0-93-generic #116~14.04.1-Ubuntu SMP Mon Aug 14 16:07:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)
您的 multi-core CPU 可以愉快地 运行 同时 parent 和 child。只要两者都可以 运行,它们的相对优先级并不重要。
为了查看 nice
的效果,您必须加载您的计算机,以便始终有一个进程准备就绪并等待 运行。最简单的方法是让你的测试多线程。在 parend 和 child 中产生(after fork
)几个工作线程,使它们都递增计数器(使其成为原子或线程本地),看看会发生什么。
我看了APUE 3rd, 8.16 Process Scheduling, 有一个例子来验证改变一个进程的nice值会影响它的优先级,我重写了如下代码:
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
long long count;
struct timeval end;
static void check_time(const char* str);
int main(int argc, char* argv[])
{
pid_t pid;
char* s;
int nzero, ret;
int adj = 0;
setbuf(stdout, NULL);
#if defined(NZERO)
nzero = NZERO;
#elif defined(_SC_NZERO)
nzero = sysconf(_SC_NZERO);
#else
#error NZERO undefined
#endif
printf("NZERO = %d\n", nzero);
if (argc == 2)
adj = strtol(argv[1], NULL, 10);
gettimeofday(&end, NULL);
end.tv_sec += 10;
if ((pid = fork()) < 0) {
perror("fork error");
return -1;
} else if (pid == 0) {
s = "child";
printf("child nice:%d, adjusted by %d\n", nice(0) + nzero, adj);
errno = 0;
if ((ret = nice(adj)) == -1 && errno != 0) {
perror("nice error");
return -1;
}
printf("child now nice:%d\n", ret + nzero);
} else {
s = "parent";
printf("parent nice:%d\n", nice(0) + nzero);
}
while (1) {
if (++count == 0) {
printf("count overflow\n");
return -1;
}
check_time(s);
}
return 0;
}
static void check_time(const char* str)
{
struct timeval tv;
gettimeofday(&tv, NULL);
if (tv.tv_sec >= end.tv_sec && tv.tv_usec >= end.tv_usec) {
printf("%s count:%lld\n", str, count);
exit(0);
}
}
示例结果如下:
零 = 20
parentnice:20
child nice:20, 调整0
child现在nice:20
parentcount:601089419
childcount:603271014
看起来 child 进程没有受到影响,为什么?以及如何使结果符合我的预期?
(我的平台是:Linux liucong-dell 4.4.0-93-generic #116~14.04.1-Ubuntu SMP Mon Aug 14 16:07:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)
您的 multi-core CPU 可以愉快地 运行 同时 parent 和 child。只要两者都可以 运行,它们的相对优先级并不重要。
为了查看 nice
的效果,您必须加载您的计算机,以便始终有一个进程准备就绪并等待 运行。最简单的方法是让你的测试多线程。在 parend 和 child 中产生(after fork
)几个工作线程,使它们都递增计数器(使其成为原子或线程本地),看看会发生什么。