Должны ли быть разные начальные точки для функции C times () в 32- и 64-битных процессах? - PullRequest
4 голосов
/ 03 апреля 2019

Следующее относится к SuSE 11.4 Linux.

Когда мое многопроцессорное программное обеспечение запускается на сервере, возвращаемое значение функции C times () сохраняется как целое число вОбщая память.(Это нормально, потому что мы до C11.) Позже, вызовы times () сделаны, чтобы получить время начала и окончания для задач.Например, время начала вычисляется как количество времени с момента первоначального вызова times () , а время окончания вычисляется аналогичным образом.Позже можно вычислить разницу между временем начала и окончания, чтобы вычислить продолжительность задачи.

Раньше мы использовали только 32-битные процессы.В следующем выпуске мы планируем запускать 32- и 64-разрядные процессы на одном сервере.Однако, похоже, что конфликтующие результаты получены из times () .

Согласно документации, times () возвращает продолжительность с произвольной точки в прошлом.Я обнаружил, что начальная точка прошлого отличается в зависимости от того, был ли процесс построен как 32- или 64-разрядный исполняемый файл.

Рассмотрим следующий код:

#include <time.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <unistd.h>

clock_t getTimes()
{
    clock_t c = times(0);
    int64_t c_int64_t = (int64_t)c & 0x00000000FFFFFFFF;
    printf("c_int64_t is [%" PRId64 "]\n", c_int64_t);
    return c;
}

int main(void)
{
    printf("sizeof(clock_t) is [%d]\n", sizeof(clock_t));

    clock_t c1 = getTimes();
    printf("sleeping for 2 seconds...\n");
    sleep(2);
    clock_t c2 = getTimes();

    double elapsedTime = ((double) (c2 - c1)) / (double)sysconf(_SC_CLK_TCK);
    printf("elapsedTime is [%f]\n", elapsedTime);
    return 0;
}

Я компилирую это следующим образом:

$ gcc -m32 -oa.32.out clock.c
$ gcc –m64 -oa.64.out clock.c

Обратите внимание, что происходит, когда я запускаю его 4 раза:

$ for i in a.32.out a.64.out a.32.out a.64.out
> do
> echo " "
> ./${i}
> done

sizeof(clock_t) is [4]
c_int64_t is [2286152112]
sleeping for 2 seconds...
c_int64_t is [2286152312]
elapsedTime is [2.000000]

sizeof(clock_t) is [8]
c_int64_t is [2286295196]
sleeping for 2 seconds...
c_int64_t is [2286295396]
elapsedTime is [2.000000]

sizeof(clock_t) is [4]
c_int64_t is [2286152512]
sleeping for 2 seconds...
c_int64_t is [2286152712]
elapsedTime is [2.000000]

sizeof(clock_t) is [8]
c_int64_t is [2286295597]
sleeping for 2 seconds...
c_int64_t is [2286295797]
elapsedTime is [2.000000]

Как я надеюсь, ясно из результатов, 32-битный и 64-битный-битные процессы каждый согласованны между собой.Но они отличаются друг от друга примерно на 142885 единиц (или 1429 секунд).В результате мое программное обеспечение не может разделять «базовое время» между 64- и 32-разрядными процессами.

Является ли это поведение times () нормальным иожидается?

...