Вход/Регистрация
Параллельное и распределенное программирование на С++
вернуться

Хьюз Камерон

Шрифт:

//определяем, какой нужен тип визуализации. Это можно

// сд елать, получив информацию от пользователя или

// выполнив специальный анализ.

// затем сообщаем о результате другим задачам с помощью

// аргументов.

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), или БУП, используемом операционной системой для идентификации процесса. С помощью этой информации операционная система Управляет процессами. Многозадачность (выполнение одновременно нескольких процессов) реализуется путем переключения контекста. Текущее состояние выполняемого процесса и его контекст сохраняются в БУП-блоке, что позволяет успешно возобновить этот процесс в следующий раз, когда он будет назначен центральному процессору. Занимая процессор, процесс пребывает в состоянии выполнения, а когда он ожидает использования ЦП, - то в состоянии готовности (ожидания). Получить информацию о процессах, выполняющихся в системе, можно с помощью утилиты ps.

  • Читать дальше
  • 1
  • ...
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: