Узнать разрешение таймера в старых и новых системах Linux

Dado que es una propiedad de cada archivo, debe calcular JOBIDal procesar la primera línea de cualquier archivo, es decir, cuando FNRes 1:

awk -F";" 'BEGIN { OFS = FS }
FNR == 1 { JOBID=substr(FILENAME, match(FILENAME, "[0-9]{8}"), 8); print }
FNR > 1 { print $0, JOBID }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head

Hay varias formas de extraer una coincidencia para una expresión regular; Por lo general, matchen una matriz:

awk -F";" 'BEGIN { OFS = FS }
FNR == 1 { match(FILENAME, "([0-9]{8})", a); JOBID = a[1]; print }
FNR > 1 { print $0, JOBID }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head

idealmente con algún manejo de errores. Esto usa matchpara buscar coincidencias de texto [0-9]{8},y extrae cualquier valor coincidente en la matriza(matchbusca grupos, de ahí los paréntesis agregados ).

Otro enfoque que debería funcionar en cualquier implementación de AWK es dividir el nombre del archivo en guiones bajos:

awk -F";" 'BEGIN { OFS = FS }
FNR == 1 { split(FILENAME, a, "_"); JOBID = a[2]; print }
FNR > 1 { print $0, JOBID }' \
Event_42417555_2018-05-23_16\:45\:28-log.txt | head

La salida duplicada en su versión ocurre porque JOBID=substr(FILENAME,match(FILENAME,"[0-9]{8}"),8)es una expresión completa con el mismo peso que cualquier otra en su programa AWK, con un bloque implícito (, es decir,print); siempre coincide, porque JOBIDsiempre no -está vacío y no es un valor numérico igual a cero, por lo que su bloque siempre se procesa.

2
14.06.2019, 17:56
2 ответа

Мой (больший )опыт связан с BSD, и их наносонсоответствует POSIX.1 (IEEE Std 1003.1 -2008 ). Похоже, что это связано с libc. Так что (даже в Linux )вы могли бы найти некоторые подсказки в time.h. Вы вполне можете найти некоторые указатели на (высокоточные )таймеры, которые вы ищете. У меня нет под рукой ящика с линуксом. Так что я не могу подтвердить. Но ХТХ!:)

0
27.01.2020, 22:26

Минимальное время ожидания с помощью nanosleep()зависит от нескольких факторов:

  1. задержка таймера
  2. контекст -переключение время
  3. точность и точность таймера

При значении резерва таймера по умолчанию, равном 50 мкс , даже при вызове nanosleep с длительностью 0 нс или 1 нс вы фактически ожидаете 50 мкс или около того по умолчанию, если ваш процесс работает в нормальном режиме (ДРУГОЕ )планирование.

Вы можете отключить механизм резерва таймера с помощью вызова prctl()или запустив процесс в классе планирования в реальном времени.

Тем не менее, вызов nanosleep по-прежнему приводит к добровольному переключению контекста, что занимает около 3 мкс, в зависимости от вашего оборудования.

На самом деле не существует прямого способа запросить точность/точность таймера, используемого наносном. POSIX указывает, что nanosleep должен сравниваться с CLOCK_REALTIME, и вы можете запросить его разрешение с помощьюclock_getres(). Однако точность/точность таймера может быть ниже этого.

Но вы можете просто косвенно запросить точность/точность nanosleep, вызвав его для некоторых небольших значений с несколькими повторениями, при запуске программы, например. 1 нс, 1 мкс, 10 мкс, и измерьте его реальное время выполнения по сравнению с clock_gettime(CLOCK_REALTIME)или по сравнению с ЦП TSC .

0
31.08.2021, 11:02

Теги

Похожие вопросы