[МУЗЫКА] [МУЗЫКА] Добро пожаловать во второй модуль нашего курса. В этом модуле мы разберемся с понятиями, которые вы уже много раз слышали, но которые я не объяснял. И мы начнем знакомиться с основами использования OpenMP для написания параллельных программ. В этой лекции мы разберем два связанных понятия вычислительной техники: это «процесс» и «поток», а также разберемся с понятием «многопоточность». Давайте сначала рассмотрим понятие процесса. Процесс можно рассматривать как способ объединения родственных ресурсов в одну группу. У процесса есть адресное пространство, содержащее текст программы, и данные, а также другие ресурсы. Ресурсами являются открытые файлы, дочерние процессы, необработанные аварийные сообщения, обработчики сигналов, учетная информация и многое другое. Гораздо проще управлять ресурсами, объединив их в форме процесса. Разные процессы, как можно понять из их концепции, не имеют общих ресурсов. Процессы существуют в операционной системе и соответствуют тому, что пользователь видит как «программа» или «приложение». А что же тогда такое поток? Или более точно, поток выполнения? Поток выполнения, от английского thread, нить, — наименьшая единица обработки, исполнение которой может быть назначено ядром операционной системы. В большинстве случаев поток выполнения находится внутри процесса. Несколько потоков выполнения могут существовать в рамках одного и того же процесса и совместно использовать ресурсы, например, память. В частности, потоки выполнения разделяют инструкции процесса, то есть код программы и его контекст, то есть значения переменных. Поток имеет свой счетчик команд, отслеживающих порядок выполнения действий. В него входят регистры, в которых хранятся текущие переменные, а также есть стек, который содержит параметры всех функций, которые были вызваны, но еще не завершили свое выполнение, и локальные переменные. Концепция потока добавляет в модель процесса возможность в одной и той же среде процесса выполнение, условно говоря, нескольких программ, которые работают параллельно. Первое, что надо усвоить — процесс состоит хотя бы из одного потока: в операционной системе каждому процессу соответствует адресное пространство и обязательно один поток выполнения. Хотя поток должен исполняться внутри процесса, следует различать концепции потока и процесса. Процессы используются для группирования ресурсов, а потоки являются объектами, поочередно исполняющимися на центральном процессоре. В качестве аналогии нескольких потоков выполнения внутри одного процесса можно рассмотреть постройку дома. У нас есть общая задача — построить дом: есть расписанный порядок работ по строительству и отделке, то есть программа, а также у нас есть общие инструменты и материалы. А нашим адресным пространством будет строительная площадка. Все это есть процесс. А что же будет у нас потоками выполнения в данном случае? Я думаю, вы догадались, это будут рабочие, которые будут выполнять нашу программу. Каждый рабочий — это отдельный поток, причем есть главный поток — это прораб. В данном случае все потоки читают одну и ту же документацию и строят один и тот же дом. Но не обязательно они читают и выполняют действия с одной и той же страницы: они могут подключаться к строительству и завершать свое выполнение, если они все уже сделали, они могут работать параллельно, а иногда им потребуется согласовать свои действия, то есть, на языке программирования, провести синхронизацию. Некоторые работы нельзя проводить параллельно, а нужно проводить их последовательно. Итак, давайте зафиксируем основные моменты, касающиеся понятий «процесс» и «поток». Первое: процесс ничего не исполняет, он просто служит контейнером потоков. Второе: поток определяет последовательность исполнения кода в процессе. Третье: потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Четвертое: потоки могут исполнять один и тот же код и манипулировать одними и теми же данными. Пятое: отличие процессов от потоков состоит в том, что процессы изолированы друг от друга, а потоки могут выполняться в одном и том же пространстве внутри процесса, при этом выполняют действие, не мешая друг другу. Многопоточность — это свойство платформы или приложения, состоящее в том, что процесс, порожденный в операционной системе, может состоять из нескольких потоков, выполняющихся параллельно. При выполнении некоторых задач такое разделение позволит эффективно использовать ресурсы компьютера. Если сказать по-простому, то многопоточность означает, что внутри процесса могут быть несколько потоков. Многопоточность как доктрину программирования не следует путать ни с многозадачностью, ни с многопроцессорностью, несмотря на то, что операционные системы, реализующие многозадачность, как правило, реализуют и многопоточность. К достоинствам многопоточности в программировании можно отнести следующие. Во-первых, упрощение параллельной программы за счет использования общего адресного пространства и, как следствие, использование общих переменных для обмена информации. Во-вторых, меньшие временные затраты на создание потока относительно времени порождения нового процесса. В этой лекции мы с вами рассмотрели три важных понятия: процесс, поток и многопоточность. Как вы, наверное, уже поняли, многопоточное программирование возможно только на вычислительных системах с общей памятью, поэтому, рассматривая параллельное программирование с использованием OpenMP, мы всегда будем работать с системами с общей памятью. И в следующих лекциях мы приступим к изучения OpenMP. До встречи.