Межпроцессный обмен
Насколько я понял из МСДН, дочернему процессу нельзя унаследовать дескрипторы от функций LocalAlloc, GlobalAlloc, HeapCreate, HeapAlloc. Это означает, что никак нельзя сделать некоторую память общей для всех процессов? Просто не хотелось гонять данные через трубопровод или другие средства, т.к. на этом теряется скорость работы. Может есть какие-то способы без передачи данных? Конечно можно использовать один процесс и потоки в нем, вместо дочерних процессов, но хотелось бы сделать первый вариант...
FileMapping?
через общую секцию памяти в загружаемой процессами DLL-ке, файлы, пайпы, сокеты, оконные сообщения, ...
и ещё вариант : через реестр!
Надо написать некую библиотеку, что-то вроде MPI, но не для кластера, а для многопроцессорных систем. В MPI обмен информации происходит через сокеты (если процессы на разных машинах) или с помощью системных средств (если процессы на одной машине), поэтому об общей памяти и речи быть не может, нужно всегда что-то передавать и что-то принимать. А на мультипроцессорных машинах такое возможно, если создать несколько потоков в одном процессе, тогда не придется "гонять" память. Так вот, хотелось бы это реализовать не на потоках, а на процессах. Т.е. смысла нет использовать сокеты,пайпы и др., такая библиотека уже существует :)
Цитата: ahilles
c DLL врядли такая штука пройдёт.....
Пройдет точно. У Рихтера вроде был пример.
Цитата: vAC
Боюсь все эти методы не подойдут..Поясню в чем дело:
Надо написать некую библиотеку, что-то вроде MPI, но не для кластера, а для многопроцессорных систем. В MPI обмен информации происходит через сокеты (если процессы на разных машинах) или с помощью системных средств (если процессы на одной машине), поэтому об общей памяти и речи быть не может, нужно всегда что-то передавать и что-то принимать. А на мультипроцессорных машинах такое возможно, если создать несколько потоков в одном процессе, тогда не придется "гонять" память. Так вот, хотелось бы это реализовать не на потоках, а на процессах. Т.е. смысла нет использовать сокеты,пайпы и др., такая библиотека уже существует :)
Надо написать некую библиотеку, что-то вроде MPI, но не для кластера, а для многопроцессорных систем. В MPI обмен информации происходит через сокеты (если процессы на разных машинах) или с помощью системных средств (если процессы на одной машине), поэтому об общей памяти и речи быть не может, нужно всегда что-то передавать и что-то принимать. А на мультипроцессорных машинах такое возможно, если создать несколько потоков в одном процессе, тогда не придется "гонять" память. Так вот, хотелось бы это реализовать не на потоках, а на процессах. Т.е. смысла нет использовать сокеты,пайпы и др., такая библиотека уже существует :)
На одной машине вроде тоже сокеты. О каких системных средствах речь??
Цитата: GENA_DJ
На одной машине вроде тоже сокеты. О каких системных средствах речь??
Скорей всего пайпы, т.к. там есть вариант обмениваться данными на одной машине через TCP/IP, либо, указав что машина одна, используются другие средства. Первый вариант намного тормознутее получался, чем второй.
Посмотрите статью
даже если система многопроцессорная все равно все методы которые мы описали все пойдут потому что память то одна!, но даже если что тоне пойдёт, то через реестр или файлы 100% попрёт
Цитата: GENA_DJ
Посмотрите статью
http://msdn2.microsoft.com/en-us/library/ms686958.aspx
Возможно это и есть решение Вашей проблемы
http://msdn2.microsoft.com/en-us/library/ms686958.aspx
Возможно это и есть решение Вашей проблемы
Да, пожалуй это пока единственное подходящее решение, которое предлагал HarryAxe. Буду пробовать на практике...сравню мультипоточный вариант с мультипроцессным, использующим мапинг.
Цитата: ahilles
даже если система многопроцессорная все равно все методы которые мы описали все пойдут потому что память то одна!, но даже если что тоне пойдёт, то через реестр или файлы 100% попрёт
Я говорил не подойдут, а не не пойдут. Безусловно проблем не будет с реализацией этих методов, но мне нужен такой, чтобы отсутствовала передача данных, а были адреса в виртуальном пространстве на одну и ту же область памяти.
Да, работает все просто замечательно. Тестировал на больших буфферах (~500 MB) из чисел с плавающей точкой, делая арифметические операции со значениями в нем. Распараллелил на двухядерный процессор, получился коэффициент увеличения производительности 1.98, именно такой получался на многопоточном приложении. Всем спасибо!