Использовать parallel для ускорения функции max рекурсивной оболочки?

тл;др; протокол X11 не имеет понятия о процессах, сигналах или каких-либо IPC; и сервер, и любой из его клиентов могут находиться на разных машинах и в разных операционных системах, которые могут просто не иметь представления о процессах вообще (во время разработки протокола X11 машины на Лиспе все еще существовали ). Сам протокол X11 может работать поверх сокетов unix, tcp/ip или туннелироваться через ssh и т. д.

Существует 3 способа «закрыть» окно X11:

  1. Отправить событие ClientMessageс атомом WM_DELETE_WINDOWв это окно.Приложение, создавшее это окно, может воздействовать на него (, например. xclock, xeyesпросто выйдут; другие могут закрыть это окно и продолжить работу )или проигнорировать его. Это то, что обычно происходит, когда вы нажимаете кнопку Xили нажимаете какую-либо «стандартную» комбинацию клавиш, например Alt-F4.

  2. Принудительно уничтожьте это окно с помощью XDestroyWindow. Приложение может не ожидать этого и может игнорировать любое событие DestroyNotifyи по-прежнему пытаться выполнять операции с этим окном, как если бы оно все еще существовало, что приведет к получению XErrorEventс кодом, установленным на BadWindow. Обработчик ошибок по умолчанию из Xlib (, установленный с XSetErrorHandler), выведет сообщение об ошибке и в этом случае выполнит очистку exit(3).

  3. Вызовите XKillClientв этом окне, что принудительно закроет создавшего его клиента (вместо окна можно использовать любой ресурс X11, например. XIDрастрового изображения ). Это то, что xkill(1)делает [1]. Это не имеет ничего общего с kill(2)или kill(1)и не отправляет никакого сигнала какому-либо процессу. Если клиент не принял специальных мер, (см.XSetCloseDownMode(3))все созданные им ресурсы (окна, растровые изображения, графические контексты )будут уничтожены. Опять же, обработчик ошибок Xlib io по умолчанию (, установленный с помощью XSetIOErrorHandler), выведет сообщение об ошибке и выполнит очистку exit(3)и в этом случае. Отличие от пт. 2. заключается в том, что обработчик, установленный с помощью XSetIOErrorHandler, может не возвращать .

Некоторые приложения довольно раздражающе воспринимают 2. и 3. как «сбой» (, например. firefox, который покажет свое печально известное сообщение «Ну, это смущает» при следующем запуске, если только browser.sessionstore.resume_from_crashне установлено в false ).

Кроме того, приложение не может узнать, было ли оно удалено с сервера с помощью XKillClientили сам сервер неожиданно закрылся или произошел сбой.

Еще один момент, который стоит повторить, заключается в том, что протокол X11 кооперативный по замыслу; между клиентами X11 нет барьеров и проверок;любой клиент может выгнать любого другого клиента с помощью XKillClient, уничтожить его окна или изменить их размер, полностью захватить клавиатуру или мышь, установить флаг переопределения перенаправления, чтобы убрать оконный менеджер с дороги, и т. д.

[1] Если вы не используете reparenting wm, вы должны использовать xkill -frame, чтобы он работал.

0
20.02.2021, 20:31
1 ответ

Ваша функция maxвыполняется за O (n^2 )для первых 500 значений в Bash. Скорее всего, это связано с тем, что вы вызвали maxс оставшимися значениями. Таким образом, эти значения должны быть скопированы.

mmax() {
    max $(seq $1)
}

seq 10000 | env_parallel --joblog bash.log mmax
(echo '#Bash';echo '#JobRuntime in seconds';field 10,4 < bash.log |sort -n) |
  head -n 1000 | plotpipe

enter image description here

Для первых 1000 значений картина немного более мутная:

enter image description here

Для kshпервые 500 значений не очень понятны:

enter image description here

Но для 1000 значений это также выглядит как O (n^2):

enter image description here

kshвылетает на 1237:

enter image description here

(plotpipeи fieldиз :https://gitlab.com/ole.tange/tangetools).

2
18.03.2021, 22:29

Теги

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