Как заставить все команды (включая многие параллельные команды) в скрипте выполняться на нескольких определенных ядрах?

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

.
  • Он обеспечивает быстрый доступ, который всегда есть. Вам не нужно беспокоиться о навигации назад, чтобы добраться до вещей. Взгляните на меню приложений, которое большинство рабочих столов имеет по умолчанию для другого примера.
  • Это устраняет необходимость хранить элементы в виде реальных файлов (подумайте, например, о корзине/корзине, на самом деле это специальная ссылка почти на всех рабочих столах, которая объединяет данные из нескольких источников ).
  • На самом деле это во многих отношениях значительно упрощает реализацию (рисование в фоновом режиме обычно намного сложнее, чем рисование в окне,поэтому регулярная перерисовка рабочего стола (для управления изменением каталогов будет несколько трудной для эффективного выполнения ).
  • Это совпадает с парадигмой, которую большинство людей интуитивно ожидает, основываясь на названии. Процесс открытия традиционного файла на столе работает почти так же, как щелчок по папке на рабочем столе компьютера, вы в конечном итоге видите этот файл/папку поверх того, что уже было там, а не вместо него.

Были некоторые системы, которые обрабатывали это по-разному, хотя на протяжении многих лет, например, AmigaOS (и AROS ). В AmigaOS «рабочий стол» на самом деле представляет собой специальное окно файлового менеджера, которое было настроено так, чтобы открывать все, что вы щелкаете, как новое окно и всегда находиться внизу стека окон. Это поведение имеет некоторые проблемы (, в первую очередь то, что вы можете переместить «рабочий стол» достаточно далеко от экрана, чтобы вы не могли вернуть его обратно без перезапуска графического интерфейса ), но на самом деле оно было скопировано в несколько иной форме. некоторыми средами рабочего стола UNIX (, которые часто используют общий код между своим файловым менеджером и фактической программой рабочего стола ).

0
02.10.2019, 16:05
1 ответ

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

Например, учитывая:

  • Сеанс screen, запущенный с использованиемtaskset 4 screen

  • В сеансе screenзапущено 3 экземпляра top

Когда я просматриваю (в другом терминале )статус topэкземпляров:

 for pid in $(ps aux|grep -i top|grep -v grep|awk '{print $2}') ; do taskset -p ${pid} ; done
pid 2505's current affinity mask: 4
pid 2515's current affinity mask: 4
pid 2525's current affinity mask: 4

Вот пример скрипта bash, выполняющего эту работу:

#!/bin/bash

echo "Setting CPU affinity..."
# Bind to a given CPU
taskset  -p 4 $$

# Verify it worked
taskset -p $$

echo "Launching background jobs..."
# Now, launch several background jobs
for i in $(seq 0 10) ; do 
    tail -f /dev/null &
done

echo "Checking..."
# Now for each instance of background jobs, check CPU affinity
for pid in $(pidof tail) ; do
    taskset -p ${pid}
done

sleep 1

killall tail

И результирующий вывод:

Setting CPU affinity...
pid 4313's current affinity mask: f
pid 4313's new affinity mask: 4
pid 4313's current affinity mask: 4
Launching background jobs...
Checking...
pid 4327's current affinity mask: 4
pid 4326's current affinity mask: 4
pid 4325's current affinity mask: 4
pid 4324's current affinity mask: 4
pid 4323's current affinity mask: 4
pid 4322's current affinity mask: 4
pid 4321's current affinity mask: 4
pid 4320's current affinity mask: 4
pid 4319's current affinity mask: 4
pid 4318's current affinity mask: 4
./test.sh: line 24:  4317 Terminated              tail -f /dev/null
./test.sh: line 24:  4318 Terminated              tail -f /dev/null
./test.sh: line 24:  4319 Terminated              tail -f /dev/null
./test.sh: line 24:  4320 Terminated              tail -f /dev/null
./test.sh: line 24:  4321 Terminated              tail -f /dev/null
./test.sh: line 24:  4322 Terminated              tail -f /dev/null
./test.sh: line 24:  4323 Terminated              tail -f /dev/null
./test.sh: line 24:  4324 Terminated              tail -f /dev/null
./test.sh: line 24:  4325 Terminated              tail -f /dev/null
./test.sh: line 24:  4326 Terminated              tail -f /dev/null
./test.sh: line 24:  4327 Terminated              tail -f /dev/null
1
28.04.2021, 23:29

Теги

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