Параллельное и распределенное программирование на С++ - [39]
• задачи, которые выполняют наложение теней: затенение отдельных пикселей; затенение изображения в целом.
Разбиение задач по категориям позволяет нашей программе приобрести более общий характер. Процессы при необходимости создают другие процессы, предназначенные для выполнения действий только определенной категории. Например, если нашей программе предстоит визуализировать лишь один объект, а не всю сцену, то нет никакой необходимости порождать процесс, который выполняет удаление скрытых поверхностей; вполне достаточно будет удаления невидимых поверхностей (одного объекта). Если объект не нужно затенять, то нет необходимости порождать задачу, выполняющую наложение тени; обязательным остается лишь линейное преобразование при решении задачи растеризации. Для запуска программы с использованием третьего способа можно использовать родительский процесс или сценарий оболочки. Родительский процесс может определить, какой нужен тип визуализации, и передать соответствующую информацию каждому из специализированных процессов, чтобы они «знали», какие процессы им следует порождать. Эта информация может быть также перенаправлена каждому из специализированных процессов из сценария оболочки. Реализация третьего способа представлена в листинге 3.6.
// Листинг 3.6. Использование третьего метода для
// создания процессов. Задачи запускаются из
// родительского процесса
>#include
>#include
>#include
>#include
>#include
>#include
>int main(void) {
>posix_spawnattr_t Attr;
>posix_spawn_file_actions_t FileActions;
>pid_t Pid;
>int stat;
>//•••
>system(«Task1 ...»);// Выполняется безотносительно к типу используемой визуализации.
>//определяем, какой нужен тип визуализации. Это можно
>// сд елать, получив информацию от пользователя или
>// выполнив специальный анализ.
>// затем сообщаем о результате другим задачам с помощью
>// аргументов.
>char *const argv4[] = {«TaskType4»,...,NULL};
> char *const argv5[] = {«TaskType5»,...,NULL};
>char *const argv6[] = {«TaskType6»,...,NULL}
>system(«TaskType2 . . . ");
>system(«TaskType3 . . . ");
>// Инициализируем структуры.
>posix_spawnattr_init(&Attr) ;
>posix_spawn_file_actions_init (&FileActions) ;
>posix_spawn(&Pid, «TaskType4», &FileActions,&Attr,argv4, NULL);
>posix_spawn(&Pid, «TaskType5», &FileActions,&Attr,argv5, NULL);
>if(Y){
> posix_spawn(&Pid,«TaskType6»,&FileActions,&Attr, argv6,NULL);
>}
>// Подобно хорошему родителю, ожидаем возвращения // своих «детей».
>wait(&stat);
>wait(&stat);
>wait(&stat);
>return(0);
>}
>// Все TaskType-задачи должны быть аналогичными. //.. .
>int main(int argc, char *argv[]){
>int Rt; //. . .
>if(argv[1] == X){
> // Инициализируем структуры.
> posix_spawn(&Pid,«TaskTypeX»,&FileActions,&Attr,..., NULL);
>else{
>// Инициализируем структуры.
>//.. •
>posix_spawn(&Pid,«TaskTypeY», &FileActions,&Attr, ...,NULL);
>}
>wait(&stat); exit(0);
>}
В листинге 3.6 тип каждой задачи (а следовательно, и тип порождаемого процесса) определяется на основе информации, передаваемой от родительского процесса или сценария оболочки.
Линии видимого контура
Порождение процессов, как показано в листинге 3.7, возможно с помощью функций, вызываемых из функции main ().
>// Листинг 3.7. Стержневая ветвь программы, из которой // вызывается функция, порождающая процесс
>int main(int argc, char *argv[]) {
>Rt = funcl(X, Y, Z); //.. .
>}
>// Определение функции.
>int funcl(char *M, char *N, char *V) {
>//.. .
> char *const args[] = {«TaskX»',M,N,V,NULL};
> Pid = fork();
>if(Pid == 0) {
> exec(«TaskX»,args);
>}
>if(Pid > 0) {
>//.. .
>}
>wait(&stat);
>}
В листинге 3.7 функция funcl () вызывается с тремя аргументами. Эти аргументы передаются порожденному процессу.
Процессы также могут порождаться из методов, принадлежащих объектам. Как показано в листинге 3.8, объекты можно объявить в любом процессе.
// Лист инг 3.8. Объявление объекта в процессе //-••
my_pbject MyObject; //-••
// Объявление и определение класса.
class my_object {
public: //...
int spawnProcess(int X); //...
};
int my_object::spawnProcess(int X) {
//.. .
// posix__spawn() или system() //.. .
}
Как показано в листинге 3.8, объект может создавать любое количество процессов из любого метода.
Резюме
Параллелизм в С++-программе достигается за счет ее разложения на несколько процессов или несколько потоков. Процесс- это «единица работы», создаваемая операционной системой. Если программа- это артефакт (продукт деятельности) разработчика, то процесс - это артефакт операционной системы. Приложение может состоять из нескольких процессов, которые могут быть не связаны с какой-то конкретной программой. Операционные системы способны управлять сотнями и даже тысячами параллельно загруженных процессов.
Некоторые данные и атрибуты процесса хранятся в блоке управления процессами (process control block - PCB), или БУП, используемом операционной системой для идентификации процесса. С помощью этой информации операционная система Управляет процессами. Многозадачность (выполнение одновременно нескольких процессов) реализуется путем переключения контекста. Текущее состояние выполняемого процесса и его контекст сохраняются в БУП-блоке, что позволяет успешно возобновить этот процесс в следующий раз, когда он будет назначен центральному процессору. Занимая процессор, процесс пребывает в состоянии выполнения, а когда он ожидает использования ЦП, - то в состоянии готовности (ожидания). Получить информацию о процессах, выполняющихся в системе, можно с помощью утилиты
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.