2. Основные понятия
• Мультипроцессирование - использование нескольких процессоров для
одновременного выполнения задач.
• Мультипрограммирование - одновременное выполнение нескольких
задач на одном или нескольких процессорах.
4. SMP
Shared Memory Processor или Symmetric MultiProcessor
В таких компьютерах несколько процессоров
подключены к общей оперативной памяти и имеют к
ней равноправный и конкурентный доступ. По мере
увеличения числа процессоров производительность
оперативной памяти и коммутаторов, связывающих
процессоры с памятью, становится критически
важной. Обычно в SMP используются 2-8 процессоров;
реже число процессоров достигает десятков.
Взаимодействие одновременно выполняющихся
процессов осуществляется посредством
использования общей памяти, к которой имеют
равноправный доступ все процессоры
8. Процессы и потоки
• Программа (program) – это последовательность команд, реализующая алгоритм
решения задачи.
• Процесс (process) – это программа (пользовательская или системная) в ходе
выполнения.
• В современных операционных системах процесс представляет собой объект – структуру
данных, содержащую информацию, необходимую для выполнения программы. Объект
"Процесс" создается в момент запуска программы (например, пользователь дважды
щелкает мышью на исполняемом файле) и уничтожается при завершении программы.
• Процесс может содержать один или несколько потоков (thread) – объектов, которым
операционная система предоставляет процессорное время. Сам по себе процесс не
выполняется – выполняются его потоки. Таким образом, машинные команды,
записанные в исполняемом файле, выполняются на процессоре в составе потока. Если
потоков несколько, они могут выполняться одновременно.
31. Потоконебезопасный код
Example105_RaceCondition
void add_function( long * number){
for( long i=0;i<1000000000L;i++) (*number)++;}
void subst_function( long * number){
for( long i=0;i<1000000000L;i++) (*number)--;}
int main() {
long number = 0;
{
Scoped_Thread th1(std::move(std::thread(add_function,&number)));
Scoped_Thread th2(std::move(std::thread(subst_function,&number)));
}
// Результат неопределен!
std::cout << "Result:" << number << std::endl;
return 0;
}
34. Замки
lock_guard
Example110_LockGuard
1. Захват в конструкторе
2. Освобождение в деструкторе
3. Используются методы мьютексов
◦ Захват: void lock();
◦ Освободить: void unlock();
unique_guard
Example111_UniqueLock
1. То же, что lock_guard
2. Используются методы мьютексов
◦ Попытаться захватить: bool
try_lock();
◦ Захват с ограничением: void
timed_lock(...);
3. + Дополнительные функции
получения мьютекса, проверки
«захваченности»...