Птицы, Гидры, Компьютеры. Вдохновение CPU для нас

Операционная система Linux

Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Как птица, вы можете покакать во время еды? Для тех, кто выращивал попугаев, ответ - да.

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

Эта ситуация несколько неловко в некоторых примитивных видах. Например, Гидра, которая представляет собой коэлецена, воспроизводит асексуалы. Эти несколько слов довольно блефуют, но в его теле есть только одна полость. Где поесть, где есть.

Тот же вид на земле, в конечном счете, мы все еще его близкие родственники.

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

После того, как эта информация собрана, она отправляется в мозг для обработки. Это может быть как глубокое обучение, хранится куча весов, но как эта информация обрабатывается, мы пока не знаем.

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


Все мы знаем, что лучше сконцентрироваться на том, чтобы хорошо делать что-то одно, если нехорошо делать много дел. Это не означает, что один человек не может сделать все правильно, но переключение между разными вещами требует больших ресурсов.

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

Иногда, когда я пишу слишком много кода, я даже начинаю заикаться, когда говорю. Но он продолжал говорить об этом, а потом выздоровел.

Итак, все ненавидят разрозненные рабочие дела. Особенно ненавижу лидеров, которые продолжают давать вам мелочи, но не относящиеся к делу задачи.

В итоге чувствую, что сделал очень много, а результата нет вообще, и чувствую, что все бесполезно.

Не бойтесь, давайте посмотрим, как процессор справится с этим.


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

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

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

Для линукса. Во время выполнения программы обычно用户态а также内核态Два состояния, пара ЦП находится в состоянии ядра, которое далее подразделяется в соответствии с контекстом, поэтому существуют следующие три состояния:

  • Состояние ядра, работающее в контексте процесса, ядро ​​представляет собой процесс, работающий в пространстве ядра.
  • Режим ядра, работающий в контексте прерывания, ядро ​​работает в пространстве ядра от имени оборудования.
  • Пользовательский режим, работающий в пользовательском пространстве

Давайте посмотрим, как команда top в Linux отображает режим ядра и пользовательский режим.

Как показано выше, us означает пользователя, sy означает систему. Они представляют пользовательский режим и режим ядра соответственно.

Если использование sy слишком велико, может быть слишком много переключений контекста и прерываний.

Так что же такое контекст?

Так называемый контекст, грубо говоря, представляет собой среду. Например, вы идете в столовую с коробкой для завтрака, а в туалет — с туалетной бумагой. Если вы напортачите и пойдете в туалет с коробкой для завтрака, это будет ненормально. Операционная система выделяет такой контекст каждому процессу для хранения: кода, данных, пользовательского стека, разделяемой памяти, регистров, блоков управления процессом и т.д.

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

Эти столбцы, отображаемые командой vmstat, означают именно это. cs не является аббревиатурой csgo, ее полное написаниеcontext switch.

В каждом процессе также можно увидеть накопленное значение.

[root@localhost ~]# cat /proc/2788/status
...
voluntary_ctxt_switches: 93950
nonvoluntary_ctxt_switches: 171204

Если значение cs слишком велико, это означает, что открыто слишком много потоков или процессов.


Существует два типа переключения контекста.

Уступительное переключение контекста и упреждающее переключение контекста.

Давайте сначала поговорим о концессионном переключении контекста. Давайте посмотрим на операцию cas в Java.

В дополнение к касуcompare and switchВ дополнение к оригинальной поддержке инструкций для гарантии требуется цикл.

public final long getAndAddLong(Object var1, long var2, long var4) {
        long var6;
        do {
            var6 = this.getLongVolatile(var1, var2);
        } while(!this.compareAndSwapLong(var1, var2, var6, var6 + var4));
        return var6;
}

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

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

Так почему же поток Java быстрее, чем многопроцессорный? Потому что поток Java, по сути, является легковесным процессом, но его виртуальная память и другая информация являются общими, и ему нужно только переключать частные данные потока, регистры и другие данные, которые не являются общими. Даже в этом случае это займет много времени.

Это переключение контекста на процесс и количество также можно наблюдать с помощью команды perf. Например:

# 跟踪所有上下文切换,直到Ctrl-C:
perf record -e context-switches -c 1 -a

# 包括使用的原始设置(请参阅:man perf_event_open):
perf record -vv -e context-switches -a

# 使用堆栈跟踪的示例上下文切换,直到Ctrl-C:
perf record -e context-switches -ag

использоватьperf reportВы можете увидеть результаты.

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

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

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​