Действительно ли возможно создать потоки без системных вызовов в блоке Linux x86 GAS?

Стилизованные компоненты позволят вам использовать переменные внутри вашего CSS-кода.

Посмотрите на: Стилизованные компоненты

35
задан Ciro Santilli 新疆改造中心法轮功六四事件 11 November 2015 в 13:45
поделиться

6 ответов

Короткий ответ: вы не можете. Когда вы пишете ассемблерный код, он выполняется последовательно (или с ветвями) в одном и только одном логическом (то есть аппаратном) потоке. Если вы хотите, чтобы часть кода выполнялась в другом логическом потоке (будь то на том же ядре, на другом ядре, на том же ЦП или даже на другом ЦП), вам необходимо, чтобы ОС настроила указатель инструкций другого потока ( CS: EIP ), чтобы указать на код, который вы хотите запустить. Это подразумевает использование системных вызовов, чтобы заставить ОС делать то, что вы хотите.

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

Изменить: Объединение ответа Иры Бакстера с Парлансом . Если вы убедитесь, что в вашей программе есть поток, запущенный в каждом логическом потоке с самого начала, тогда вы можете создать свой собственный планировщик, не полагаясь на ОС. В любом случае вам понадобится планировщик для обработки перехода от одного потока к другому. Между вызовами планировщика нет специальных инструкций сборки для обработки многопоточности. Сам планировщик не может полагаться на какую-либо специальную сборку, а скорее на соглашения между частями планировщика в каждом потоке.

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

а скорее о соглашениях между частями планировщика в каждом потоке.

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

а скорее о соглашениях между частями планировщика в каждом потоке.

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

24
ответ дан 27 November 2019 в 07:09
поделиться

Реализуйте поточную обработку непривилегированного режима.

Исторически, модели потоков обобщены как N:M, который должен сказать что потоки непривилегированного режима N, работающие M образцовые ядром потоки. Современный useage 1:1, но он не всегда был похож на это, и он не должен быть похожим на это.

Вы свободны поддержать в единственном потоке ядра произвольное число потоков непривилегированного режима. Это просто, что именно Ваша обязанность переключаться между ними достаточно часто все это выглядит параллельным. Ваши потоки являются, конечно, совместными, а не приоритетными; Вы в основном исполняли "скат" урожай () вызовы всюду по Вашему собственному коду, чтобы гарантировать, что регулярное переключение происходит.

7
ответ дан 27 November 2019 в 07:09
поделиться

Если вы хотите повысить производительность, вам придется использовать потоки ядра. Только ядро ​​может помочь вам запустить код одновременно на более чем одном ядре процессора. Если ваша программа не связана с вводом / выводом (или выполняет другие операции блокировки), выполнение кооперативной многопоточности в пользовательском режиме (также известной как волокон ) не принесет вам никакой производительности. Вы просто будете выполнять дополнительные переключения контекста, но один ЦП, на котором работает ваш реальный поток, все равно будет работать на 100% в любом случае.

Системные вызовы стали быстрее. Современные процессоры поддерживают команду sysenter , которая значительно быстрее, чем старая инструкция int . См. Также эту статью , чтобы узнать, как Linux выполняет системные вызовы максимально быстрым способом.

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

5
ответ дан Adam Rosenfield 27 November 2019 в 07:09
поделиться

Системные вызовы теперь не такие медленные, с syscall или sysenter вместо int . Тем не менее, при создании или уничтожении потоков будут накладные расходы. После запуска системные вызовы отсутствуют. Потоки пользовательского режима на самом деле вам не помогут, поскольку они работают только на одном ядре.

3
ответ дан Zifre 27 November 2019 в 07:09
поделиться

Сначала вы должен научиться использовать потоки в C (pthreads, POSIX theads). В GNU / Linux вы, вероятно, захотите использовать потоки POSIX или потоки GLib. Затем вы можете просто вызвать C из кода сборки.

Вот несколько указателей:

3
ответ дан Soleil 27 November 2019 в 07:09
поделиться

«Доктор, доктор, мне больно, когда я это делаю». Доктор: «Не делайте этого».

Короткий ответ: вы можете выполнять многопоточное программирование без вызов дорогостоящих примитивов управления задачами ОС. Просто игнорируйте ОС для потока планирование операций. Это означает, что вам нужно написать свой собственный поток планировщик, и просто никогда не передавайте управление обратно ОС. (И вы должны быть как-то умнее в отношении накладных расходов на поток чем довольно умные ребята из ОС). Мы выбрали этот подход именно потому, что windows process / thread / оптоволоконные вызовы были слишком дорогими для поддержки вычислений зерна из нескольких сотен инструкций.

Наш язык программирования PARLANSE - это язык параллельного программирования: См. http://www.semdesigns.com/Products/Parlanse/index.html

PARLANSE работает под Windows, предлагает параллельные «зерна» в качестве абстрактного параллелизма. построить и составить график таких зерен с помощью комбинации высокоэффективных настроенный рукописный планировщик и код планирования, сгенерированный Компилятор PARLANSE, учитывающий контекст зерна минимизировать накладные расходы на планирование. Например, компилятор гарантирует, что регистры зерна не содержат информации в точке где может потребоваться планирование (например, "ждать"), и, следовательно, код планировщика должен только сохранить ПК и SP. По факту, очень часто код планировщика вообще не управляется; в раздвоенном зерне просто хранятся PC и SP, переключается на стек, предварительно выделенный компилятором, и переходит к зерну код. Завершение зерна перезапустит вилочный механизм.

Обычно есть блокировка для синхронизации зерна, реализованная компилятором с использованием собственных инструкций LOCK DEC, которые реализуют что составляет подсчет семафоров. Приложения может логически разветвлять миллионы зерен; ограничения планировщика родительские зерна от создания дополнительной работы, если работа стоит в очереди достаточно длинные, поэтому дополнительная работа бесполезна. Планировщик реализует кражу работы, чтобы позволить процессорам, страдающим от нехватки работы, захватить готовые зерна образуют соседние рабочие очереди ЦП. Это реализована поддержка до 32 процессоров; но мы немного волнуемся что поставщики x86 могут фактически заменить использование более чем что в ближайшие несколько лет!

PARLANSE - зрелый язык; пользуемся с 1997 года, и реализовали в нем параллельное приложение на несколько миллионов строк.

14
ответ дан 27 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

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