LINUX.ORG.RU
ФорумTalks

Вопрос о многопоточности


0

0

Помогите разобраться. Когда разные процессы, то они при одновременном исполнении раскидаются планировщиком на разные ядра.
Как же происходит при использовании потоков в пределах одного процесса? Напр. при создании 2 потоков средствами WINAPI с помощью CreateThread они будут исполнятся на 2-х ядрах одновременно?
Если да, то почему напр. Firefox нагружает только одно ядро, при рендере страниц в табах мы же можем работать с интерфейсом -> значит потоки Firefox использует?
И если потоки распределяются между ядрами тогда зачем придумывали OpenMP?
Вопрос по С++, но было бы интересно услышать как дело с этим обстоит в Java и C#

> средствами WINAPI

наверное, как бог/планировщик на душу положит, так они и будут перескакивать

и еще помни, что модель потоков в вендах и линуксах разная

stevejobs ★★★★☆
()

>Когда разные процессы, то они при одновременном исполнении раскидаются планировщиком на разные ядра.

Разве?

Hokum ☆☆☆☆
()
Ответ на: комментарий от Hokum

>Разве?
а разве нет?

потоки одного процесса в винде... а firefox скомпилирован с потокобезопасными версиями библиотек для винды?

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

мне казалось, что он работает по куда как более сложному алгоритму

Hokum ☆☆☆☆
()
Ответ на: комментарий от Hokum

ну если запустить два ресурсоёмких процесса, то будут загружены два ядра полностью, это упрощенно. вот один поток «прыгает» между ядрами в винде, но никогда не сможет загрузить их польностью и диспетчер задач будет показывать загрузку около 50%.

vovchik542
() автор топика
Ответ на: комментарий от dimon555

Так вот мне и интересно
1. при использовании потоков вызовом WINAPI CreateThread, будут ли они паралеллится между ядрами.
2. как устроена многопоточность в Firefox, может есть те кто в курсе

vovchik542
() автор топика
Ответ на: комментарий от vovchik542

это же нереальная ситуация - всего два ядра и два процесса. На практике есть ещё приоритеты, система, ну и т.д.

Hokum ☆☆☆☆
()
Ответ на: комментарий от vovchik542

почти наверняка многопоточность в FF сильно разная в венде и в линуксе :)

Hokum ☆☆☆☆
()

> Firefox нагружает только одно ядро

можно же выставить процессу affinity и привязать к какому-то одному процессору

stevejobs ★★★★☆
()

Кажется, вот самая релевантная беседа:

http://forum.codeby.net/lofiversion/index.php/t12890.html

ну и из нее,

1) SetThreadAffinityMask привязывыает к процессору,
2) а количество процессоров можно получить из вот этого ключа реестра: (http://technet.microsoft.com/en-us/library/cc976143.aspx)

stevejobs ★★★★☆
()
Ответ на: комментарий от frame

правда если только родительский процесс не прикреплён к какому-то конкретному ядру/ядрам

frame ★★★
()

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

т.е. при 2-х активных потоках в системе они скорее всего будут на разных ядрах/процессорах.

Pavval ★★★★★
()
Ответ на: комментарий от yoghurt

> > Стиви сечёт в винапи? :)

нет, это всё Гуголь и MSDN

stevejobs ★★★★☆
()

Так, с первым вопросом всё ясно: потоки распределяются между ядрами, что в винде, что в линуксе.
Как с этим делом обстоит у Java? Читал что Java до версии 1.2 использовала так называемые Green Threads, тоесть виртуальная машина работает в одном потоке и является планировщиком для потоков исполняемого java-байткода. После версии 1.2 Java стала использовать Native Threads. Так ли это сейчас?
Просто нету многоядерного камня под рукой чтобы проверить всё на практике.

vovchik542
() автор топика
Ответ на: комментарий от simple_best_world_web_master

а что хром под линуксом быстрее? :)

Hokum ☆☆☆☆
()
Ответ на: комментарий от vovchik542

google://java 2 наиболее полное руководство в подлиннике pdf -php

Страница 263 по 269. Хорошо описано всё, что связано с многопоточностью.

drakmail ★★★★
()
Ответ на: комментарий от vovchik542

> при использовании потоков вызовом WINAPI CreateThread, будут ли они паралеллится между ядрами

Успокойся, будут.

no-dashi ★★★★★
()

>И если потоки распределяются между ядрами тогда зачем придумывали OpenMP?

OpenMP придумали чтобы скрыть от тебя процесс порождения/уничтожения/синхронизации потоков «вручную» как это ты делал бы в случае CreateThread

Ну и заодно упростить управление потоками через аффинити-маски.

В OpenMP ты можешь выбрать как _именно_ соседние ветви цикла (например) будут укладываться на процессоры/ядра

то есть по сути OpenMP это системонезависимая (с точки зрения исходного кода) надстройка над инерфейсом нитей (что в Win, что в *NIX)

sS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.