Измерение накладных расходов без pthread в C

Я хотел бы поделиться тестовым вопросом, который я недавно встретил, и обсудить его:

Напишите программу на C, которая грубо измеряет накладные расходы на переключение контекста между ядром и пользовательским пространством в системе UNIX/Linux (без использования >pthread API). Укажите, на каких предположениях основана ваша приблизительная оценка.

Я хотел бы обсудить с более продвинутыми программистами на C различные варианты этой проблематики.

У меня ограниченные знания в программировании на C, и я задокументировал себя, чтобы дать приемлемый ответ:

https://eli.thegreenplace.net/2018/measuring-context-switching-and-memory-overheads-for-linux-threads/

https://www.researchgate.net/post/How_can_I_measure_thread_creation_and_destruction

https://github.com/eliben/code-for-blog/blob/master/2018/threadoverhead/thread-pipe-msgpersec.c

Я быстро понял, несмотря на свои ограниченные знания, двусмысленность вопроса. Действительно, в вопросе не оговаривается, следует ли давать ответ в единицах времени или памяти.

Лично я решил развивать свои рассуждения об измерении времени с помощью библиотеки time.h и очень простого фрагмента кода. Результат нужно разделить на 1 000 000.

Имеет ли смысл мой ответ, или я полностью упускаю суть?

#include<time.h>
#include<stdio.h>
int main(){
    clock_t begin=clock();

    int i;
    for(i=0;i<1000000;i++){
        printf("%d",i);
    }
    clock_t end=clock();
    printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

person Charles Julien    schedule 06.02.2019    source источник
comment
В контрольном вопросе используется неверная терминология. Переключение между режимом ядра и пользовательским режимом технически не называется переключением контекста. Это называется переключатель режимов. Вы можете измерить накладные расходы на переключение режима, сравнив минимальные системные вызовы. См. этот вопрос: stackoverflow.com/questions/23599074/system-calls-overhead /   -  person PSkocik    schedule 07.02.2019
comment
Что, если ваш цикл будет прерван другим несвязанным процессом? Вы рискуете принять во внимание время, потраченное на этот другой процесс, не так ли?   -  person Yugo Amaryl    schedule 13.07.2019


Ответы (2)


Вы должны попробовать другой подход.

Как было сказано, вы пытаетесь измерить

накладные расходы на переключение контекста> между ядром и пользовательским пространством

Переключение контекста с пользователя на ядро ​​осуществляется через syscall. Наверняка printf ниже использует системный вызов write, но этот системный вызов слишком тяжелый, чтобы получить достоверную оценку. Чтобы улучшить эту оценку, вы должны ответить на вопрос - какой самый быстрый системный вызов в Linux? И ответ - системный вызов с неверным параметром.

P.S. Не забывайте о точности измерений. Также вы должны разделить результат на 2, потому что системный вызов — это циклический обход.

person Alex Hoppus    schedule 07.02.2019

Удивительно, но ответ, который я дал выше, был принят как правильный в этом тесте.

Однако для оптимизации точности мы должны исключить метод «printf» и использовать либо системный вызов с недопустимым параметром, как упоминал Алекс Хоппус, либо пустой метод.

В конце результат должен быть разделен на 2, как сказал Алекс Хоппус.

person Charles Julien    schedule 27.02.2019