Форум: "Потрепаться";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Внизмногопроцессорные системы Найти похожие ветки
← →
mph (2002-06-15 14:08) [0]Просветите меня, тёмного :)
Слышал, что в многопроцессорных системах используют такие же процессоры (например, Pentium),как и в обычных однопроцессорных.
Следовательно, и ассемблер тот же. А как тогда указывается с каким процессором мы работаем? Может, есть какие-то специальные команды?
← →
vuk (2002-06-15 14:20) [1]WinAPI SetThreadAffinityMask
← →
mph (2002-06-15 17:37) [2]vuk © (15.06.02 14:20)
спасибо, конечно :)
Но я не это имел в виду. Мне бы хотелось узнать, как это реально выполняется на уровне машинных команд. Какой из процессоров выбирает команды из памяти (наверное, параллельно?), и как указать, какой из процессоров будет выполнять какой кусок кода. И еще: можно ли в реальном режиме заставить работать такую систему?
Я думаю, мастера меня поправят, если я какую-то глупость сморозил :)
← →
Malder (2002-06-15 18:57) [3]По моему, сначала работает предпроцессор, который и разделяет все на подкоманды и каждому процессору дает свой кусок. Поэтому, если все команды последовательные и их нельзя выполнить по отдельности - то эффекта ноль.
Ну допустим есть последовательность комманд:
1) Записать в переменную X значение такое то
2) Сложить значение переменной X с переменной Y и записать в Z
3) Записать в переменную A значение 10
Как видно, комманду номер два не выполнишь без комманды первой. А вот третью команду можно выполнять даже до первой, ничего не изменится. Поэтому первые две команды можно одному процесору поручить, а третью сразу другому. Но это почти не очень эффективно, и как даже из упрощенной схемы при двух процессорах производительность не возрастет в два раза.
А вот если программа изначально разбита на потоки, то предпроцессору намного легкче. Выполнение одного потока 0 одному процессору, выполнение другого - другому. Поэтому стиль программирования для многопроцессорных систем немного меняется. Надо где только возможно разбивать вычисления на несколько параллельных.
А используются действительно обычные процессоры/
← →
wicked (2002-06-15 21:58) [4]предпроцессоры?... первый раз слышу....
а вообще-то разделением работ для процессоров занимается операционная система... она и определяет, на каком из процессоров будет исполняться тот или иной процесс/поток... правда, если программа может определить, что машина мультипроцессорная, то, соответственно, может и указать, на каком из процессоров исполнять определённый поток...
то есть, процессоры не выполняют одновременно команды одного потока - это просто нереально...
← →
IronHawk (2002-06-15 22:07) [5]
> Malder © (15.06.02 18:57)
> По моему, сначала работает предпроцессор, который и разделяет
> все на подкоманды и каждому процессору дает свой кусок.
>
NOT !
← →
Malder (2002-06-15 23:43) [6]процессоры не выполняют одновременно команды одного потока - это просто нереально...
а почему тогда программы, которые не используют разделение на потоки свои вычисления на многопроцессорной конфигурации работают быстрее (хоть и незначительно) ?
← →
stikriz (2002-06-16 04:00) [7]Привет.
Если бы ты писал с использованием множества нитей потока, то понял, что каждая нитка может исполняться на своем процессоре. Так они и работают. Никаких предпроцессоров нет. Есть некий бесконечный цикл, который раздает время ниткам в потоках. Поток - это нечто, вроде описания. В каждой программе есть один поток. У потоков есть по крайней мере одна нитка. Операционка определяет, какую нитку когда запускать на выполнение, в зависимости от приоритетов. Когда нитку нужно остановить, операционка (тут я не уверен) копирует некий дамп с значениями регистров, и т.д. запускает другую нитку, понятно, что восстановив регистры процессора. Там есть такие дескрипторы, с помощью которых организуется многозадачность. Ну, это совсем по простому так сказать. Но это совершенно не интересно для программиста, если только не пишешь операционку :-)
Николай.
← →
SPeller (2002-06-16 08:11) [8]2 stikriz (16.06.02 04:00)
> В каждой программе есть один поток. У потоков есть по крайней мере одна нитка.
Вроде бы приложение (процесс) может делится только на нити (они же потоки, для винды это thread). Нити же, на сколько я знаю, больше ни на что не делятся. А у вас аж три части: процесс-поток-нить. Или я что-то не так понял?
← →
mph (2002-06-16 11:01) [9]Господа, большое спасибо за присланные ответы.. но это не совсем то, что я бы хотел узнать.
Ведь функции SetTHreadAffinty итд как-то реализованы в ОС. Как именно(хотя бы примерно)? Я могу предполагать два варианта:
1) Действительно есть какой-то девайс, разделяющий работу между процессорами, причем он прозрачный для программиста, даже системного
2) Программист сам указывает с помощью ассемблерных команд, на каком процессоре выполнять какой код (реализаия функций типа SetTHreadAffinty). Но тогда такие команды должны быть и у обычных процессоров. Почему о них нигде не написано?
И еще: ведь у каждого процессора свои регистры. А в команде нельзя указать, для какого именно процессора эта команда. Значит, должно быть что-то вроде префиксов команд вроде "для процессора X", или команды call ... на процессоре X. И как обращаться к регистрам разных процессоров?
← →
evgeg (2002-06-16 11:23) [10]Вроде бы могут выполнятся на разных процессорах разные процессы, но не разные потоки одного процесса.
← →
wicked (2002-06-16 19:52) [11]2 Malder © (15.06.02 23:43)
а потому быстрее, что им не мешают другие процессы, исполняющиеся на другом процессоре...
← →
wicked (2002-06-16 20:06) [12]2 ~Rand~ ©
format yer head
← →
wicked (2002-06-16 21:59) [13]2 mph
найди информацию про поддержку многозадачности в интеловских системах... а в ней найди описание TSS (вроде так) и всего, что с ней связано... это и будет ответ на твой вопрос... ;)
← →
mph (2002-06-16 22:33) [14]Просто интересно, а почему столько ответов удалено модератором? Неужели тема такая неприличная? :)
← →
mph (2002-06-16 22:49) [15]to wicked © (16.06.02 21:59)
Извините, если я что-то не так понял, но в структуре TSS я не нашел полей, отвечающих за то, на каком процессоре должна выполняться задача. Как впрочем и ассемблерных команд, которые могли бы применяться для выбора процессора(кроме разве что префикса lock).
← →
wicked (2002-06-17 00:05) [16]2 mph
вот именно, но структура то и обьясняет, почему нельзя раскидывать команды одного потока (хоть и thread по английски, не приемлю слово "нить") по разным процессорам... ведь тогда при переключении задач что делать-то прикажете?... как собирать значения регистров из разных процессоров в один tss?...
← →
ФФФ (2002-06-17 10:17) [17]Один поток не может исполняться на нескольких процессорах. А вот разные потоки, даже одного процесса, могут исполняться на разных процессорах. За распределением потоков на процессорах следит операционная система. См. "Программирование под Windows", правда, не помню, кто автор.
← →
petr_v_a (2002-06-17 13:46) [18]Один поток(thread ) в данный момент времени ( в пределях отведенного ему кванта ) может выполняться только на одном процессоре, но потоки одного процесса( process ) могут выполняться на разных, и при выделении следующего кванта NT может перекинуть поток на другой процессор. Вообще в NT процесс - набор потоков, и не более того. Распределение процессорного времени происходит на уровне потоков, а управление памятью и атрибутами защиты - на уровне процессов. SetThreadAffinityMask - информация для планировщика ( который написан так, что может работать на любом процессоре и тоже является потоком ). На каждый процессор существует очередь выполнения, и переключение заключается в загрузке TSS селектора из соттв. очереди, а планирование - в формировании этих очередей
← →
mph (2002-06-17 21:00) [19]значит, если я правильно понял, то в реальном режиме (например, при использовании msdos) такая система вообще работать не будет? Или будет всегда использоваться какой-то один процессор, например, с номером 0? И все-таки: какие поля каких структур отвечают за номер процессора, на котором будет исполняться данный поток?
P.S. Господа,я еще не достал вас тупыми вопросами? :)
Может, кто-нибудь ссылку на документацию даст (только не www.intel.com, а что-нибудь более конкретное)?
← →
petr_v_a (2002-06-18 18:49) [20]Почитай Д.Соломон, Марк Руссинович, по-моему,"Внутренне устройство Windows2000" ( название точно не помню, толстая зеленая книга :), там достаточно подробно описана работа NT на многопроцессорных системах
← →
evgeg (2002-06-18 21:23) [21]Один поток(thread ) в данный момент времени ( в пределях отведенного ему кванта ) может выполняться только на одном процессоре, но потоки одного процесса( process ) могут выполняться на разных, и при выделении следующего кванта NT может перекинуть поток на другой процессор. Вообще в NT процесс - набор потоков, и не более того.
Могут ли потоки одного процесса выполнятся на разных процессорах в один и тот же момент времени?
← →
vuk (2002-06-18 21:28) [22]Проверять все это сейчас некогда, но поскольку при помощи SetThrteadAffinityMask маска устанавливается отдельно для потока, то да (IMHO). Для процесса целиком маска устанавливается при помощи SetProcessAffinityMask.
← →
evgeg (2002-06-18 22:34) [23]> vuk
Почему же тогда существует известная проблема с IB Superserver на многопроцессорных машинах?
← →
vuk (2002-06-18 22:42) [24]Что за проблема? Я не в курсе просто...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c