LINUX.ORG.RU

нужны ли потоки?

 , ,


0

1

Раньше я как-то неправильно представлял себе абстракции параллельного выполнения. Я думал как-то так: либо у нас есть абстракция потока, либо есть акторы, которые инкапсулируют потоки. Таким образом, нам сначала нужны, например, сопрограммы, которые будут реализовывать потоки, затем уже все остальное поверх этого.

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

Чтобы иметь конкурентность, потоки вообще не нужны. И легкие нити тоже не нужны. Нам просто надо убрать, по возможности, все блокирующие операции. Если мы это сделаем, у нас уже будет конкурентное исполнение. Уже поверх этого мы можем реализовать синхронизацию событий, и тогда у нас родится абстракция потока. То есть все наоборот — сначала конкурентность, а уже поверх нее потоки. В итоге, в одном единственном ивентлупе мы имем 100-процентный параллелизм, полную абстрагированность от порядка выполнения.

может я чего-то не понял, но если у меня 8 ядер и один поток, то откуда возмется параллелизм?

anonymous
()
Ответ на: не понял от anonymous

хорошо, пусть нет потоков, что есть тогда, процессы? если у меня 8 ядер и один процесс, каким образом появится парралелизм? например мне нужно решето эратосфена распаралелить, как это можно будет сделать?

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

подал ты питание на процессор. сколько у тебя потоков? а процессов? у тебя есть физические вычислители, делай с ними что хочешь. потоки — виртуальные вычислители.

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

подал ты питание на процессор. сколько у тебя потоков? а процессов? у тебя есть физические вычислители, делай с ними что хочешь. потоки — виртуальные вычислители.

В случае с x86 у тебя 1 поток и 1 процесс пока ты не сделаешь с этим что-нибудь (а точнее — запустишь ещё потоки на остальных ядрах). И да, поток инструкций + стек это уже тред. А по-другому ты ничерта не придумаешь.

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

действительно, зачем мьютекс, если, например, в Plan 9 и Inferfno всё рулится каналами (между корутинами) и пламбингом (между процессами)?

А что, каналы реализуются без мютексов?

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

начнём с простого: какой pid у этого процесса?

устройство, способное исполнять команды и обращаться к памяти (стек здесь не нужен) — это вычислитель.

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

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

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

1. это анонiмус таблетки забыл принять, отсюда и «метафизика»

2. «с точки зрения конечного пользователя» в продвинутых ос (windows, macosx/ios, freebsd) есть что-то похожее на его хотелки реализованное точно так же как и pthread в user-space.

anonymous
()
Ответ на: комментарий от x3al

И в итоге у plan9 копирование там, где в прочих ОС — разделяемая память между потоками?

Почему сразу копирование? Можно и указатель передавать, если нужно. Впрочем, анонимус выше уже намекнул на разницу в производительности и я погуглил об этом, так что вопрос снят.

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

А что, каналы реализуются без мютексов?

Ну, допустим, в Plan 9, поскольку это просто сишная либа, то да, доступ к реализации прост, но в Limbo, насколько я понимаю, каналы являются примитивами языка, поэтому доступа к их реализации может и не быть, т.е. каналы будут самым нижним уровнем абстракции. Ну, т.е. сишные модули для Inferno фактически писать можно, и там уж наверняка есть доступ к, но допустим, что нельзя.

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

действительно, зачем мьютекс, если, например, в Plan 9 и Inferfno всё рулится каналами (между корутинами) и пламбингом (между процессами)?

А что, каналы реализуются без мютексов?

Ну, допустим, в Plan 9, поскольку это просто сишная либа, то да, доступ к реализации прост

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

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

каналы между процессами - просто нет. Т.е. вообще.

Гм... Но я и не писал про каналы между процессами. Plumbing --- это не каналы. Хотя, возможно, по способу использования, похоже.

Если каналы между корутинами, наверное, можно реализовать без мютексов

Не вникал в это, но например в Go'шных каналах вполне себе мьютекс. Если только они этим словом не называют что-то другое. Т.е., я не спорю, что можно, но, видимо, не имеет особого смысла.

korvin_ ★★★★★
()
Последнее исправление: korvin_ (всего исправлений: 2)
Ответ на: комментарий от korvin_

каналы между процессами - просто нет. Т.е. вообще.

Гм... Но я и не писал про каналы между процессами.

Понимаешь, фраза «в Plan 9 и Inferfno всё рулится каналами (между корутинами) и пламбингом (между процессами)», если понимать ее буквально, совершенно бессмысленна. Ну да, наверное, в Plan9 можно сделать процесс с корутинами и передавать данные между ними через каналы, но причем тут сам Plan9? Если под «каналом» имеются в виду средства ОС Plan9 - назови системный вызов или бибилиотечную функцию, которыми они создаются (и вызов создания того, что ты называешь корутинами).

Plumbing --- это не каналы.

Гм... Ты хочешь сказать, что данные между процессами, созданными rfork(RFMEM) используют plumber?

например в Go'шных каналах вполне себе мьютекс. Если только они этим словом не называют что-то другое. Т.е., я не спорю, что можно, но, видимо, не имеет особого смысла.

Ну вот для этого и нужны мютексы - реализовывать каналы.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Понимаешь, фраза «в Plan 9 и Inferfno всё рулится каналами (между корутинами) и пламбингом (между процессами)», если понимать ее буквально, совершенно бессмысленна.

Почему? Это просто констатация факта.

но причем тут сам Plan9?

Наверное при том, что в его API сущность «мьютекс» не используется? О чём и спрашивал x3al.

Если под «каналом» имеются в виду средства ОС Plan9 - назови системный вызов или бибилиотечную функцию, которыми они создаются (и вызов создания того, что ты называешь корутинами).

Под каналами имеются в виду те же каналы, что в Go, что в Limbo --- средство взаимодействия (синхронизации) корутин.

Гм... Ты хочешь сказать, что данные между процессами, созданными rfork(RFMEM) используют plumber?

Я хочу сказать, что межпроцессное взаимодействие осуществляется постредством отдельного сервиса --- пламбимнга, а не каналами, которые «существуют» в рамках своего одного процесса. Можешь считать пламбинг-сервис чем-то вроде очереди сообщений MQ (может внутри Plan 9-новый пламбер не является очередью сообщений, но интерфейс примерно тот же с точки зрения пользователя). Других способов межпроцессного взаимодействия в Plan 9/Inferno нет. 9P/Styx везде. Т.е. можно без пламбинга просто писать/читать (псевдо-)файлы того же Acme или Rio; plumber дополнительно играет роль «ассоциатора», т.е. то что в винде и линуксе делается через настройку ассоциации файлов (чтобы картинки открывались в просмотрщике картинок и т.п.) в Plan 9/Inferno делается через пламбер. Пример: (файл-)браузер отправляет во входной псевдофайл пламбера текстовое сообщение, а тот по правилам определяет какому процессу это сообщение передать, т.е. грубо говоря, если подпадает под правило «начинается на http://», то оно передаётся веб-браузеру. Разница между «ассоциациями» файлов в более гибком поведении, на Ютубе вроде есть видео-туториал по acme от Расса Кокса, там есть примеры.

Ну вот для этого и нужны мютексы - реализовывать каналы.

Но это детали реализации. Для использования абстракции знать детали её реализации не нужно, иначе это протекающая абстракция.

korvin_ ★★★★★
()
Последнее исправление: korvin_ (всего исправлений: 1)
Ответ на: комментарий от korvin_

Понимаешь, фраза «в Plan 9 и Inferfno всё рулится каналами (между корутинами) и пламбингом (между процессами)», если понимать ее буквально, совершенно бессмысленна.

Почему?

Я написал, почему.

Это просто констатация факта.

Без ссылки на libthread это обычное умничание.

Ты хочешь сказать, что данные между процессами, созданными rfork(RFMEM) используют plumber?

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

Я об этом не спрашивал.

но причем тут сам Plan9?

Наверное при том, что в его API сущность «мьютекс» не используется?

Это не имеет никакого значения, поскольку в самом Plan9 мютексы используются.

И если уж зашла речь об API Plan9 - может, ты дашь ссылку на функции создания корутин?

Ну вот для этого и нужны мютексы - реализовывать каналы.

Но это детали реализации. Для использования абстракции знать детали её реализации не нужно

Я говорил не о том, зачем нужны знания, а о том, зачем нужны мютексы.

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

И если уж зашла речь об API Plan9 - может, ты дашь ссылку на функции создания корутин?

Ну ты же сам написал название библиотеки. http://man.cat-v.org/plan_9/2/thread

там threadcreate

Если тебя смущает слово thread, то там же:

Scheduling The threads in a proc are coroutines, scheduled non- preemptively in a round-robin fashion.

korvin_ ★★★★★
()

В итоге, в одном единственном ивентлупе мы имем 100-процентный параллелизм, полную абстрагированность от порядка выполнения.

...на одном единственном ядре CPU

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

там threadcreate

Насколько я понимаю, thread может создаваться и вызовом procfork.

Если тебя смущает слово thread, то там же:

Scheduling The threads in a proc are coroutines, scheduled non- preemptively in a round-robin fashion.

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

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