Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-47467
Dave
2002-07-03 16:08
2002.07.15
Системная палитра Windows


1-47403
sokoloff
2002-07-02 16:13
2002.07.15
record в property


3-47086
id_privin
2002-06-20 13:29
2002.07.15
DBF


1-47520
dihlos
2002-07-04 14:50
2002.07.15
Осциллограф


8-47606
Alexandr_
2002-03-05 13:53
2002.07.15
Как нарисовать элипс на канвасе, но....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский