На что похож многоядерный ассемблер?

Нет, JSON.NET - это сериализатор JSON. Это не дезинфицирующее средство XSS. Вы можете взглянуть на библиотеку AntiXSS от Microsoft. Вот статья на MSDN о его использовании (немного устаревшая, но все еще актуальная).

231
задан Ciro Santilli 新疆改造中心法轮功六四事件 6 May 2018 в 22:22
поделиться

7 ответов

This isn't a direct answer to the question, but it's an answer to a question that appears in the comments. Essentially, the question is what support the hardware gives to multi-threaded operation.

Nicholas Flynt had it right, at least regarding x86. In a multi threaded environment (Hyper-threading, multi-core or multi-processor), the Bootstrap thread (usually thread 0 in core 0 in processor 0) starts up fetching code from address 0xfffffff0. All the other threads start up in a special sleep state called Wait-for-SIPI. As part of its initialization, the primary thread sends a special inter-processor-interrupt (IPI) over the APIC called a SIPI (Startup IPI) to each thread that is in WFS. The SIPI contains the address from which that thread should start fetching code.

This mechanism allows each thread to execute code from a different address. All that's needed is software support for each thread to set up its own tables and messaging queues. The OS uses those to do the actual multi-threaded scheduling.

As far as the actual assembly is concerned, as Nicholas wrote, there's no difference between the assemblies for a single threaded or multi threaded application. Each logical thread has its own register set, so writing:

mov edx, 0

will only update EDX for the currently running thread. There's no way to modify EDX on another processor using a single assembly instruction. You need some sort of system call to ask the OS to tell another thread to run code that will update its own EDX.

141
ответ дан 23 November 2019 в 03:37
поделиться

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

Синхронизация выполняется ОС. Как правило, каждый процессор выполняет свой процесс для ОС, поэтому многопоточность операционной системы отвечает за принятие решения о том, какой процесс коснется какой памяти и что делать в случае конфликта памяти.

42
ответ дан 23 November 2019 в 03:37
поделиться

Если вы писали оптимизацию компилятор / байт-код ВМ для многоядерной CPU, что вам нужно знать конкретно про, скажем, x86, чтобы сделать он генерирует код, который работает эффективно во всех ядрах?

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

Вам не нужно ничего знать конкретно о x86, чтобы заставить его генерировать код, который эффективно работает во всех ядра.

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

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

Есть и другие вещи, для которых это было бы полезно. вы должны узнать:

Вы должны узнать о возможностях ОС (Linux, Windows или OSX), которые позволяют запускать несколько потоков.

10
ответ дан 23 November 2019 в 03:37
поделиться

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

Также нет дополнительных инструкций, доступных только для операционной системы. Эти ядра идентичны одноядерным чипам. Каждое ядро ​​запускает часть операционной системы, которая будет обрабатывать связь с общими областями памяти, используемыми для обмена информацией, чтобы найти следующую область памяти для выполнения.

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

9
ответ дан 23 November 2019 в 03:37
поделиться

Ассемблерный код преобразуется в машинный код, который будет выполняться на одном ядре. Если вы хотите, чтобы он был многопоточным, вам придется использовать примитивы операционной системы, чтобы запускать этот код на разных процессорах несколько раз или разные фрагменты кода на разных ядрах - каждое ядро ​​будет выполнять отдельный поток. Каждый поток будет видеть только одно ядро, на котором он сейчас выполняется.

5
ответ дан 23 November 2019 в 03:37
поделиться

Что было добавлено в каждую архитектуру с возможностью многопроцессорной обработки по сравнению с однопроцессорными вариантами, которые были до них, так это инструкции для синхронизации между ядрами. Кроме того, у вас есть инструкции для работы с согласованностью кеша, очисткой буферов и аналогичными низкоуровневыми операциями, с которыми приходится иметь дело ОС. В случае одновременных многопоточных архитектур, таких как IBM POWER6, IBM Cell, Sun Niagara и Intel «Hyperthreading», вы также обычно видите новые инструкции для определения приоритетов между потоками (например, установка приоритетов и явная передача процессора, когда нечего делать) .

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

0
ответ дан 23 November 2019 в 03:37
поделиться

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

  • они совместно используют физическое адресное пространство. Аппаратное обеспечение обеспечивает согласованность кэша, поэтому один ЦП записывает в адрес памяти, который читает другой.

  • они совместно используют APIC (программируемый контроллер прерываний). Это память, отображаемая в физическое адресное пространство, и может использоваться одним процессором для управления другими процессорами, их включения или выключения, отправки прерываний и т. Д.

http://www.cheesecake.org/sac/smp. html - хорошая ссылка с глупым URL-адресом.

3
ответ дан 23 November 2019 в 03:37
поделиться
Другие вопросы по тегам:

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