Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270

Разделения вычислений между несколькими процессами

17.03.2015, 15:34. Показов 1726. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать задание, с учетом разделения вычислений между несколькими процессами. Для обмена информацией между процессами использовать неименованные каналы.

Само задание: Вычислить сумму тех целых чисел из интервала (А, В), которые равны двойке в произвольной целой степени. Входные данные: натуральное число А, натуральное число Б>А
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2015, 15:34
Ответы с готовыми решениями:

Работа с несколькими процессами
Разработать программу, вычисляющую значение плотности лог-нормального распределения в точке х (x>0) по формуле...

Работа с несколькими одноименными процессами
В силу своей неопытности, не первый день ломаю голову по реализации задачи. Имеется 10 одноименных процессов, раз в 2-3 часа на каждом из...

Одновременное использование процессора несколькими процессами
Добрый день. Меня интересует следующий вопрос : пусть, например, в данный момент имеется 10 процессов. Каждому процессу соответствует...

13
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
17.03.2015, 15:56
Вопрос в чем заключается?
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
17.03.2015, 18:20  [ТС]
Velesthau,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
 
using namespace std;
 
bool proverkastepeni (int n)
{
return !(n&(n-1));
}
 
int main ()
{
int fd[2];
double s=0;
int a, b;
if (pipe(fd) < 0)
{
cout << "Ошибка создания канала!" << endl;
return 0;
}
cout << "Введите число A: " << endl;
cin >> a;
cout << "Введите число B: " << endl;
cin >> b;
for (int i = a; i <= b; i++)
if (proverkastepeni(i))
s+=i;
cout << "Ответ: " << s << endl;
return 0;
}
Вот что я смог сделать, теперь не совсем понимаю как дальше то сделать задание? А точнее разделить между несколькими процессами

Добавлено через 1 час 24 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
 
using namespace std;
 
bool proverkastepeni (int n)
{
return !(n&(n-1));
}
 
int main ()
{
int fd[2];
double s=0;
int a, b;
if (pipe(fd) < 0)
{
cout << "Ошибка создания канала!" << endl;
return 0;
}
cout << "Введите число A: " << endl;
cin >> a;
cout << "Введите число B: " << endl;
cin >> b;
if (fork() ==0)
{
for (int i = a; i <= b; i++)
if (proverkastepeni(i))
s+=i;
write(fd[1],&s, sizeof(s));
return 0;
}
 
read (fd[0], &s, sizeof(s));
cout << "Ответ: " << s << endl;
close (fd[0]);
close (fd[1]);
return 0;
}
Написал сам, теперь прошу проверить на правильность. Правильно ли я сделал или нет?
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
17.03.2015, 18:28
Цитата Сообщение от VitekSR Посмотреть сообщение
с учетом разделения вычислений между несколькими процессами
У тебя вычисления не разделены. Ты просто вынес цикл в отдельный процесс. В другом процессе ничего не вычисляется.
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
17.03.2015, 19:55  [ТС]
Velesthau, в таком случае вот так сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
 
using namespace std;
 
bool proverkastepeni (int n)
{
return !(n&(n-1));
}
 
int main ()
{
int fd[2];
double s=0;
int a, b;
if (pipe(fd) < 0)
{
cout << "Ошибка создания канала!" << endl;
return 0;
}
cout << "Введите число A: " << endl;
cin >> a;
cout << "Введите число B: " << endl;
cin >> b;
if (fork() ==0)
{
write(fd[1],&s, sizeof(s));
return 0;
}
 
read (fd[0], &s, sizeof(s));
for (int i = a; i <= b; i++)
if (proverkastepeni(i))
s+=i;
cout << "Ответ: " << s << endl;
close (fd[0]);
close (fd[1]);
return 0;
}
Добавлено через 1 час 18 минут
Или тогда я совсем не понимаю, прошу помочь
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
17.03.2015, 20:17
Цитата Сообщение от VitekSR Посмотреть сообщение
Или тогда я совсем не понимаю, прошу помочь
Организуй одновременные вычисления в разных процессах. Ввел тебе пользователь два числа. Тебе нужно посчитать сумму. Считай ее в двух процессах одновременно, результаты объединишь и получишь конечный.
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
17.03.2015, 20:30  [ТС]
Цитата Сообщение от Velesthau Посмотреть сообщение
Ввел тебе пользователь два числа. Тебе нужно посчитать сумму.
Задание другое.
Цитата Сообщение от Velesthau Посмотреть сообщение
Организуй одновременные вычисления в разных процессах.
Даже если так сделаю то все равно не правильно же?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (fork() ==0)
{
for (int i = a; i <= b; i++)
if (proverkastepeni(i))
s+=i;
write(fd[1],&s, sizeof(s));
return 0;
}
 
read (fd[0], &s, sizeof(s));
for (int i = a; i <= b; i++)
if (proverkastepeni(i))
s+=i;
cout << "Ответ: " << s << endl;
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
17.03.2015, 20:32
Цитата Сообщение от VitekSR Посмотреть сообщение
Задание другое.
А, по-моему, такое.
Цитата Сообщение от VitekSR Посмотреть сообщение
Даже если так сделаю то все равно не правильно же?
Конечно. Ты считаешь одно и то же в разных процессах. Почему ты не почитаешь сумму одной части интервала в одном процессе, а другую в другом? Результат сложить.
Тебе указано "разделить вычисления". Раздели их. Один вычисляет одно, другой - другое.
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
18.03.2015, 09:07  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (fork() ==0)
{
for (int i = a; i <= b/2; i++)
if (proverkastepeni(i))
s+=i;
write(fd[1],&s, sizeof(s));
return 0;
}
 
read (fd[0], &s, sizeof(s));
for (int i = b/2; i <= b; i++)
if (proverkastepeni(i))
s2+=i;
s3 = s +s2;
cout << "Ответ: " << s3 << endl;
Посмотри теперь..

Добавлено через 55 минут
Velesthau, глянь

Добавлено через 11 часов 17 минут
UP!
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
18.03.2015, 10:05
Да, почти верно, но, мне думается, что у тебя получится так: запустится дочерний процесс, а родительский будет висеть на read и ждать, пока ему туда дочерний запишет число. А потом только начнет свой цикл. А надо одновременно считать, а потом объединить результаты.
Ну и число b/2 будет встречаться в первом и втором интервалах (в конце первого, начале второго).
А так, ты уже близок
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
18.03.2015, 12:38  [ТС]
Velesthau, помоги в реализации, пожалуйста, тогда
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
19.03.2015, 00:27
VitekSR, read поставь после цикла. Тогда вычисления будут идти параллельно.

И
Цитата Сообщение от VitekSR Посмотреть сообщение
for (int i = a; i <= b/2; i++)
Если я введу интервал a=10, b=14, то цикл будет:
for (int i = 10; i <= 7; i++)
что сам понимаешь, неправильно.
надо делать до a+(b-a)/2
а второй начинать с a+(b-a)/2 + 1
Только напиши это по-нормальному.
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
19.03.2015, 20:39  [ТС]
Velesthau, глянь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (fork() ==0)
{
for (int i = a; i <= a+(b-a)/2; i++)
if (proverkastepeni(i))
s+=i;
write(fd[1],&s, sizeof(s));
return 0;
}
 
 
for (int i = a+(b-a)/2 + 1; i <= b; i++)
read (fd[0], &s, sizeof(s));
if (proverkastepeni(i))
s2+=i;
s3 = s +s2;
cout << "Ответ: " << s3 << endl;
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
20.03.2015, 10:11
Лучший ответ Сообщение было отмечено VitekSR как решение

Решение

VitekSR, read должен быть после цикла, а не в нем. В цикле так же должно считаться. Как у тебя твой код последний вообще работает?
Блин. Вот у тебя был такой код:
C
1
2
3
4
read (fd[0], &s, sizeof(s));
for (int i = b/2; i <= b; i++)
if (proverkastepeni(i))
s2+=i;
Поставить read после цикла, это:
C
1
2
3
4
for (int i = b/2; i <= b; i++)
    if (proverkastepeni(i))
        s2+=i;
read (fd[0], &s, sizeof(s));
Ну и условия для выхода из цикла ты уже переписал выше. Тогда будет правильно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2015, 10:11
Помогаю со студенческими работами здесь

Функции CreateFile и для ReadFileEx для чтения несколькими процессами из текстового файла
Привет, просьба подсказать одну вещь. Чтобы было ясно где используется, кратко опишу: мне необходимо в одной программе взять путь к...

Количество способов разделения книг между студентами
Сколькими способами 25 различных книг можно поделить поровну между 5 студентами?

Канал между процессами
Задача у программы такова. Имеется основная программа(main) и две дополнительных(prc1 и prc2). В prc1 и prc2 стоит прогресс бар, который...

Переключение между процессами
Здравствуйте! У меня вознкла проблемка с процесами. Стоит такая задачка: Процесс 1 открывает файл, создает процесс 2, посылает...

Семафоры. Работа между процессами
Пишу программу писатель-читатель на posix семафорах. Запускаю первый процесс, получаю на первой итерации w_sem = 0 и r_sem = 1 и процесс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru