Временная шкала прерывания для одного процесса, выполняющего вывод

Как отмечали другие, буферизация строк grep является очевидной причиной вашей проблемы.

Однако есть и другие не столь очевидные проблемы с тем, что вы делаете.

Для начала, похоже, что вы используете sed для добавления апострофов в начало и конец каждой выходной строки, чтобы вы могли передать их в xargs . В этом нет необходимости даже удаленно - xargs имеет параметр -d , который вы можете использовать, чтобы указать ему использовать символы новой строки в качестве разделителя: например, xargs -d '\ n' -r (параметр -r - убедиться, что xargs ничего не делает, если нет строк ввода)

Во-вторых , вы используете регулярные выражения для анализа данных json. Это ненадежно, чрезвычайно сложно или даже невозможно разобраться со сложными / вложенными структурами, хрупко и легко сломается по тем же причинам, по которым использование регулярных выражений для синтаксического анализа XML или HTML ненадежно, чрезвычайно сложно и хрупкий. Не анализируйте XML или HTML с помощью регулярных выражений . Это не работает . То же самое относится к json .

Вместо этого вы должны использовать что-то вроде jq или jsonpipe для извлечения полей из данных json.Например:

jq -c 'select(.twNotif.action == "add")' file.txt | 
  xargs -d'\n' -r -L 1 -P 5 ./testscript.sh

Если вы хотите передать значение поля действия по конвейеру xargs (без двойных кавычек), вы можете сделать это следующим образом:

jq 'select(.twNotif.action == "add") | .twNotif.action' file.txt | 
  sed -e 's/"//g' | 
  xargs -d'\n' -r -L 1 -P 5 ./testscript.sh

Использование jsonpipe и awk , вероятно, будет проще для такой работы:

jsonpipe < file.txt | 
  awk '$1 == "/twNotif/action" {gsub(/"/,""); print $2}' |
  xargs -d'\n' -r -L 1 -P 5 ./testscript.sh

(обратите внимание на перенаправление там, в отличие от jq , jsonpipe ] работает только со стандартным вводом).

Кстати, jsonpipe преобразует данные json в строчно-ориентированный формат, подходящий для использования с такими инструментами, как sed , grep , awk и т. Д. Например:

$ jsonpipe < file.txt
/   {}
/twNotif    {}
/twNotif/originator "api"
/twNotif/chain  "test"
/twNotif/txId   "08640-0050568a5514"
/twNotif/version    "1.0"
/twNotif/msgType    "api"
/twNotif/twData {}
/twNotif/twData/api {}
/twNotif/twData/api/hostId  "007bdcc5"
/twNotif/twData/api/user    "test"
/twNotif/twData/api/cmdTxt  "100599"
/twNotif/action "add"
/twNotif/store  "test"
/twNotif/msgTime    1467280648.971042

С ним проще работать, чем с jq , особенно если вам не нужен вывод в формате json.

Это также полезно для перечисления структуры и полей / элементов в json-файле в форме, которую можно легко использовать с jq . например:

$ jsonpipe 

3
08.03.2016, 22:12
3 ответа

Устройство ввода-вывода (контроллер) занято передачей данных из буфера устройства на устройство. Он переходит от простоя к передаче. Это пик для устройства ввода-вывода. По завершении передачи он возвращается в режим ожидания до следующего запроса.

Кривая ЦП показывает пик, когда передача выполняется, потому что ЦП уведомляется устройством (через прерывание).

3
27.01.2020, 21:22

График наглядно показывает соотношение состояний CPU и состояний выхода [устройства] с течением времени.

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

Спады в процессорном времени - это когда процессор получает уведомление от прерывания о том, что устройство закончило работу, чтобы приступить к созданию буферов для следующего раунда.

Пики в работе устройства - это время, когда оно простаивает в ожидании вывода, ожидая запросов ввода/вывода, а долины - когда контроллер устройства записывает буферы памяти независимо от CPU в реальное устройство. Часто эта запись выполняется через DMA. (Прямой доступ к памяти)

0
27.01.2020, 21:22

Давайте шаг за шагом посмотрим, что происходит.

Пояснение перед переходом к шагам :Процессор выполняет другие процессы пользователей. Устройство ввода/вывода находится либо в состоянии передачи данных, либо в состоянии ожидания. Как работает прерывание, из книги «Концепции операционной системы»

.

When the CPU is interrupted, it stops what it is doing and immediately transfers execution to a fixed location. The fixed location usually contains the starting address where the service routine for the interrupt is located. The interrupt service routine executes; on completion, the CPU resumes the interrupted computation.

Шаг 1:Устройство ввода-вывода получает запрос ввода-вывода. (Устройство ввода-вывода изначально находится в состоянии ожидания)

Шаг 2.:Устройство ввода-вывода начинает передачу данных и, следовательно, переходит в состояние передачи.

Шаг 3:Устройство ввода-вывода завершает свою работу по передаче данных и, следовательно, переходит в состояние ожидания. Далее он делает прерывание.

Шаг 4:ЦП получает прерывание и начинает выполнение процедуры обслуживания прерывания, что показано изменением ее выполнения.

Шаг 5:ЦП продолжает свое предыдущее выполнение.

Те же шаги выполняются для второй половины диаграммы.

Обратите внимание, что слово «состояние» устройства ввода-вывода используется только для ясного объяснения. Надеюсь это поможет.

2
16.01.2021, 13:42

Теги

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