Изменение приятного значения процесса не имеет никакого эффекта в Linux

Я читал о 3-м APUE, 8.16. Планирование процессов. Есть пример, написанный для проверки того, что изменение значения процесса будет влиять на его приоритет, я переписываю код, как показано ниже:

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

И результат примера показан ниже:
NZERO = 20
родитель хороший: 20
ребенок хороший:20, с поправкой на 0
ребенок сейчас хорош: 20
количество родителей:601089419
количество детей:603271014
Похоже, что на дочерний процесс не было никакого влияния, почему? И как сделать результат так, как я ожидаю?
(моя платформа: Linux liucong-dell 4.4.0-93-generiC#116~14.04.1-Ubuntu SMP понедельник, 14 августа 16:07:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)

1 ответ

Решение

Ваш многоядерный процессор может успешно запускать и родительский и дочерний процесс одновременно. Пока оба могут работать, их относительные приоритеты не имеют значения.

Чтобы увидеть эффект niceВы должны загрузить свою машину так, чтобы всегда был процесс, готовый и ожидающий запуска. Самый простой способ - сделать ваш тест многопоточным. Спаун (после fork) несколько рабочих потоков как в parend, так и в child, заставьте их все увеличить счетчик (сделать его атомарным или локальным для потока) и посмотреть, что произойдет.

Другие вопросы по тегам