1. Несколько важных понятий о высокой параллелистике
1.1 синхронно и асинхронно
Прежде всего, упомянутые здесь синхронизация и асинхронные обращаются к аспектам вызова функции/метода.
Очевидно, что синхронный вызов будет ждать возврата метода, и асинхронный вызов вернется мгновенно, но асинхронный вызов мгновенно вернется, не означает, что ваша задача была выполнена. Он установит поток в фоновом режиме, чтобы продолжить задачу.
1.2 Параллелизм и параллелизм
Параллелизм и параллелизм похожи по внешнему внешнему виду. Как показано на рисунке, параллелизм - это когда две задачи выполняются одновременно, в то время как параллелизм - выполнять по одной задаче за раз, а затем переключаться на другую задачу. Следовательно, один процессор не может быть параллельным, это может быть только параллелизм.
1.3 Критическая зона
Критическая область используется для представления общественного ресурса или общих данных. Его можно использовать несколькими потоками, но только один поток может использовать его за раз. Как только ресурс критической области занят, другие потоки должны ждать, если они хотят использовать этот ресурс.
1.4 Блокировка и не блокировка
Блокировка и неблокировка обычно описывают взаимное влияние между несколькими нити. Например, если поток занимает ресурс критической области, то все остальные потоки, которые нуждаются в этом ресурсе, должны ждать в этой критической области, и ожидание приведет к тому, что поток будет зависать. Это блокировка. В настоящее время, если поток, который занимает ресурс, не желает выпускать ресурс, то все остальные потоки, блокирующие в этой критической области, не могут работать.
Не блокировка позволяет нескольким потокам входить в критическую зону одновременно
Следовательно, производительность блокировки, как правило, не очень хороша. Согласно общей статистике, если поток приостановлен на уровне операционной системы и сделала переключатель контекста, обычно для этого требуется 80 000 циклов.
1.5 тупик, голод, живой замок
Так называемый тупик относится к блокировке, вызванной конкурирующими ресурсами или общением друг с другом в процессе выполнения двух или более процессов. Без внешних сил они не смогут продвинуться. В настоящее время система называется тупиком или в системе есть тупик. Эти процессы, которые всегда ждут друг друга, называются процессами тупиков. Точно так же, как машины на рисунке ниже хотят двигаться вперед, но никто не может двигаться вперед.
Однако, хотя тупик является плохим явлением, это статическая проблема. После того, как наступит тупик, процесс застрял, и уровень занятости процессора также составляет 0. Он не будет занимать процессор, он будет вызван. Относительно говоря, это относительно легко обнаружить и проанализировать.
Соответствует тупику живой замок.
Live Lock означает, что вещи 1 могут использовать ресурсы, но это позволяет другим вещам использовать ресурсы в первую очередь; Вещи 2 могут использовать ресурсы, но это также позволяет другим вещам в первую очередь использовать ресурсы, поэтому оба были скромными и не могут использовать ресурсы.
Например, это похоже на то, как вы встречаетесь с кем-то на улице, который идет в противоположном направлении вас и встречаетесь с вами в лоб, вы все хотите отпустить друг друга. Вы двигались налево, и он двинулся налево, но они все еще не могли туда пойти. В это время вы двигаетесь вправо, и он движется вправо и продолжает таким образом.
Когда поток получает ресурс, он обнаруживает, что другие потоки также думают об этом ресурсе, потому что они не получили все ресурсы, поэтому, чтобы избежать смертоносного стока, они отказываются от всех ресурсов, которые они держат. Если другой поток делает то же самое, им нужны те же ресурсы, такие как удерживающий ресурс, B имеет ресурс B, и после отказа от ресурса A получает ресурс B, а B получает ресурс, и это повторяется, происходит живой блокировка.
Живые замки труднее обнаружить, чем тупики, потому что живые замки являются динамичным процессом.
Голод означает, что один или несколько потоков не могут получить необходимые ресурсы по разным причинам, что делает их неспособными выполнять.
1.6 Уровень параллелизма
Уровни параллелизма: блокировка и неблокировка (не блокировка делится на без барьеров, без блокировки и без ожидания)
1.6.1 Блокировка
Когда один поток входит в критический раздел, другие потоки должны ждать
1.6.2 Доступность
По сравнению с неблокирующим планированием, блокировка планирования является пессимистической стратегией, которая считает, что изменение данных, вероятно, сделает данные плохими. Вместо того, чтобы блокировать планирование, это оптимистическая стратегия, которая считает, что изменение данных не обязательно делает данные плохими. Тем не менее, это стратегия широкого входа и строгого выхода. Когда он обнаруживает, что процесс имеет конкуренцию и конфликты в критической области, метод планирования без барьеров откатится от данных.
В этом бесплатном методе планирования все потоки эквивалентны моментальному снимку системы. Они будут продолжать пытаться сделать снимки, пока они не станут действительными.
1.6.3 БЕССКОЕ
Это доступно
Убедитесь, что есть нить, которая может выиграть
По сравнению с доступностью, доступность не гарантирует, что операции могут быть завершены, когда есть конкуренция, потому что, если она найдет конфликты в каждой операции, она будет продолжать пытаться. Если потоки в критической области мешают друг другу, это приведет к тому, что все потоки застряли в критической области, а затем производительность системы окажет большое влияние.
Lockless добавляет новое условие, чтобы убедиться, что один поток может выиграть каждое соревнование, что решает проблему борьбы с барьером. По крайней мере, это гарантирует, что все потоки выполняются плавно.
Следующий код является типичным кодом расчета без блокировки в Java
Бесполюблен распространен в Java
while (! atomicvar.compareAndset (localvar, localvar+1)) {localvar = atomicvar.get (); }1.6.4 Нет ждать
Беззамажный
Все потоки должны быть завершены на ограниченном этапе
Нет голода
Прежде всего, предпосылка отсутствия ожидания находится на основе беззакония. Без блокировки гарантирует, что в критической области должен быть вход и выйти. Однако, если приоритет въезда очень высок, то некоторые нити с низким приоритетом в критической области могут быть голодными и не могут покинуть критическую область. Тогда нет никакого ожидания, чтобы решить эту проблему, которая гарантирует, что все потоки должны быть завершены в пределах ограниченного шага, и, естественно, нет голода.
Никакое ожидание является самым высоким уровнем параллелизма, который может позволить этой системе достичь оптимального состояния.
Типичные случаи, не ожидая:
Если есть только потоки чтения и нить нить, то это должно быть без ожидания.
Если есть как потоки чтения, так и потоки записи, и перед каждым потоком записи скопируйте данные, а затем измените копию вместо изменения исходных данных, поскольку в изменении копии нет конфликта, то процесс изменения также не ожидается. Окончательная синхронизация заключается только в том, чтобы перезаписать письменные данные.
Поскольку требование без ожидания относительно высокое, и его трудно реализовать, Free Free будет использоваться более широко.
2. два важных закона о параллелизме
Оба закона связаны с коэффициентом ускорения
2.1 Закон Амдала
Определить формулу расчета и теоретический верхний предел коэффициента ускорения после параллелизации последовательных систем
Определение коэффициента ускорения: Коэффициент ускорения = системное время, потребляемое до оптимизации / системного времени, потребляемого после оптимизации
Например:
Коэффициент ускорения = системное время, потребляемое до оптимизации / системного времени, потребляемого после оптимизации = 500/400 = 1,25
Эта теорема показывает, что увеличение числа процессоров процессора не обязательно играет эффективную роль в увеличении доли параллельных модулей в системе. Только путем разумного увеличения количества параллельных процессоров может быть получен максимальный коэффициент ускорения с наименьшими инвестициями.
2.2 Закон Густафсона
Объясните взаимосвязь между количеством процессоров, серийным соотношением и соотношением ускорения
Затем коэффициент ускорения = NF (N-1) // Процесс вывода пропущен
Пока есть достаточная параллелизация, коэффициент ускорения пропорционален количеству процессоров.