Научная статья на тему 'Головоломки для it'ишников?'

Головоломки для it'ишников? Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
160
19
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Головоломки для it'ишников?»

Головоломки для 1Т'ишников?

Н.В. Шилов, Институт систем информатики им. А.П. Ершова СО

РАН, с.н.с., shilov@iis. тк. 8и;

С.О. Шилова, Институт систем информатики им. А.П. Ершова СО

РАН, инженер, shilov61@inbox.ru;

«... вы

с уважением ощупаете их, как старое, но грозное оружие» В.В. Маяковский

Введение

Мир очень изменился за последние 40 лет. Век информационных технологий сменил век достижений технологий обычных. Проблема надёжности в 1Т-отрасли становится крайне актуальной.

Как происходят вычисления в компьютере? Ведь в вычислительных машинах нет действительных чисел, подчиняющихся хорошим математическим законам при вычислениях. И ошибки могут быть не только в вычислениях. Могут быть ошибки в алгоритме решения задачи. Могут быть ошибки в программной реализации алгоритма. Могут быть ошибки в системном программном обеспечении компьютера и протоколах передачи данных между компьютерами.

Однако проблема надёжности в 1Т-отрасли не сводится только к технической надёжности, но могут ошибаться и люди, вовлечённые в цикл разработки, производства и поддержки 1Т-продуктов. Этот человеческий фактор включает в себя как совокупность профессиональных навыков, так и творческий или интеллектуальный-инженерный8 потенциал. И если методы обучения и сертификации профессиональных навыков в 1Т-отрасли более или менее отлажены9, то (на наш взгляд) вопрос

Инженер - <а^етеш"» (фр.) - «изобретательный человек». Речь идёт только о существовании государственной системе подготовки 1Т-кадров (техникумы, вузы), тренингов у 1Т-компаний, государственных и международных образовательных стандартов, внутренних квалификационных требований 1Т-компаний, о существовании апробированных механизмах проверки соответствия квалификационным требованиям (тестах, экзаменах и т. п.). Но здесь не идёт речь об адекватности уровня этих систем, стандартов и

8

9

о способах развития и поощрения творческого потенциала стоит достаточно остро, по крайней мере в IT-образовании.

Такое утверждение основано на личном опыте преподавания ряда программистких предметов на Механико-математическом факультете (ММФ) и Факультете информационных технологий (ФИТ) Новосибирского государственного университета (НГУ), Факультете прикладной математики (ФПМ) Новосибирского государственного технического университета (НГТУ), факультетах Computer Science нескольких зарубежных университетов Азиатско-Тихоокеанского региона.

По нашему мнению, студенты IT-специальностей перегружены решением большого количества типовых задач по базовым предметам (по сравнению с математиками, например) и необходимостью приобретать большее количество конкретных профессиональных навыков в быстро развивающейся отрасли (по сравнению с инженерами-строителями). Поэтому для развития интеллектуально-инженерного потенциала остаются силы разве только у любителей олимпиад и конкурсов по программированию и информационным технологиям [1].

Однако существует старое и испытанное средство развития творческого потенциала в процессе подготовки специалистов - это использование образовательно-тематических головоломок. Здесь под «образовательно-тематическими головоломками» мы понимаем простые по формулировке (но с элементом парадоксальности), не требующие глубоких профессиональных знаний для понимания (но допускающие разные уровни сложности) вопросы, ответы на которые требует определённого творческого шага (но могут быть просто объяснены), однако эти ответы имею очень чёткий смысл (или интерпретацию) с точки зрения изучаемой темы.

На наш взгляд такого сорта головоломки достаточно широко используются только в преподавании функционального программирования [3] и формальных методов верификации [2]. В тоже время, по нашему убеждению, этот старый, но испытанный метод развития профессионально-творческого потенциала будущих IT-специалистов остаётся современной информационной технологией, и, более того, его значение в ИТ-образовании должна возрастать.

В коротком докладе мы не можем познакомить коллег со списком образовательно-тематических головоломок, используемых при преподавании различных курсов. Но мы хотим конспективно привести пример использования головоломки такого сорта, используемой в курсе «Программирование» (ММФ НГУ) для знакомства студентов-

механизмов потребностям сегодняшнего дня или ближайшего будущего.

первокурсников с основными понятиями такого актуального ныне направления как параллельное и распределенное программирование. Представленный в следующей части материал - это, фактически, обработанный конспект половины лекции №2 «Элементы архитектуры ЭВМ» курса «Программирование» первого автора данной работы.

О параллельном жаренье бифштексов

В параллельном программировании постановка задачи и ее решение предполагают, что несколько вычислительных потоков или/и процессов могут работать одновременно (как говорят «параллельно») с целью получить ускорение за счет использования имеющихся вычислительных ресурсов. Здесь «ускорение» - это «во сколько раз быстрее», а не «скорость прирастания скорости» как в физике. Для того, чтобы разобраться, с остальными понятиями в этом определении, нам пригодится следующая известная головоломка о бифштексах.

На сковородку помещается 2 бифштекса. Для того, что бы приготовить бифштекс его надо поджарить с двух сторон, а поджаривание каждого бифштекса с одной стороны занимает 5 минут. Сколько надо времени для того, что бы приготовить 3 бифштекса?

Самое первое решение - по очереди готовить все три бифштекса; тогда на приготовление каждого уйдет 10 минут (т. к. надо обжарить с двух сторон), а всего потребуется 30 минут. Более быстрое второе решение состоит в том, что сначала готовят синхронно (т. е. полностью одновременно) первую пару бифштексов, а потом отдельно - третий бифштекс; такой вариант займет 20 минут. Но есть еще одно третье решение. Для него предварительно дадим бифштексам имена «А», «Б» и «С», а их сторонам присвоим индексы «1» и «2»; мы считаем, что эта операция не заняла времени, но в ее результате мы можем говорить, например, о стороне «Б2», т. е. о второй стороне второго бифштекса. Далее алгоритм таков:

1: поджарим одновременно стороны «А1» и «Б1»;

2: поджарим одновременно стороны «Б2» и «В1»;

3: поджарим одновременно стороны «В2» и «А2».

Этот алгоритм как бы организует «конвейер» приготовления бифштексов: стороны бифштексов как бы лежат на ленте конвейера А1, Б2, Б2, В1, В2, А2, которая движется через сковородку:

(А1, Б1), Б2, В1, В2, А2 - первые 5 минут,

А1, Б1, (Б2, В1), В2, А2 - вторые 5 минут,

А1, Б1, Б2, В1, (В2, А2) - третьи 5 минут.

Он позволяет приготовить три бифштекса за 15 минут; следовательно, достигнуто ускорение по сравнению с первым решением 2 (= 30/15), а по сравнению со вторым решением (использующим син-хонное приготовление пары бифштексов) - примерно 1,33 (и 20/15).

Потоки на двухядерной сковородке

Поток или тред10 - это последовательность команд, которая «исполняется» вычислительным устройством «одновременно» с несколькими другими потоками над общей памятью; слова «исполняются» и «одновременно» взяты в кавычки, т. к. у вычислительного устройства может не хватать средств для одновременного исполнения всех потоков, просто потоки приняты к исполнению, а вычислительное устройство по очереди по частям выполняет все действия, предусмотренные в принятых к исполнению потоках 11. Частный случай многопоточного программирования - это обычное императивное программирование, когда единственное вычислительное устройство занято одним потоком.

Обычно многопотоковый алгоритм реализуется на «многоядерном процессоре» - вычислительном устройстве, состоящим из нескольких «ядер», т. е. обычных процессоров, работающих над общей памятью. При этом надо иметь ввиду, что одно ядро нужно для планировщика -алгоритма, который отвечает за загрузку других ядер (т. е. какому ядру какой поток и когда выполнять).

В терминах многопоточного параллельного программирования головоломку о бифштексах можно интерпретировать так: сковородка - это двухядерный процессор, а бифштексы - это три потока «А», «Б» и «С», каждый поток состоит из двух последовательных команд «поджарить со стороны 1» и «поджарить со стороны 2», а планировщик - это человек, который составляет алгоритм приготовления бифштексов. «Умный» планировщик - это алгоритм приготовления бифштексов на «двухядерной» сковородке за 15 минут, ну а если нам с планировщиком не повезло, то приготовление может занять и 20 или даже 30 минут.

Потоки могут разделяться и сливаться, обычно для этого используют конструкцию fork-join12 и разделитель «||». Например, описанный трёх-поточный алгоритм приготовления трёх бифштексов можно записать так: begin fork

поджарить А1 ; поджарить А2 || поджарить Б1 ; поджарить Б2 || поджарить С1 ; поджарить С2 join end

10 Thread - «нить» (англ.).

11 В таком случае говорят о «псевдопараллелизме», т. к. нет реального одновременного исполнения разных действий, или об «интерливингом параллелизме», используя кальку английского термина «interleave», означающего прокладывание между листами книги (гербария например).

12 Fork - «развилка», а join - «соединение» (англ.).

Чтобы процесс пошёл...

Теперь познакомимся с процессами. Процесс - это программный шаблон (или матрица), с которого можно сделать сколько угодно программ-копий, которые называются экземплярами процесса13. Каждый процесс имеет имя и две числовые характеристики: число ini экземпляров этого процесса, которые создаются при запуске параллельной программы, и максимальное число max, ограничивающее сверху число экземпляров процессов, которые могут существовать одновременно; если число ini не указано явно, то оно считается равным 1; если число max не указано явно, то считается, что одновременно могут существовать сколько угодно экземпляров этого процесса. Каждый экземпляр процесса получает свой уникальный адрес или пин14 и свою собственную память (недоступна другим экземплярам ни того же процесса, ни других процессов). Экземпляры процессов общаются между собой посредством обмена сообщениями: посылка сообщения происходит по пину (т. е. экземпляр-отправитель сообщения должен знать пин экземпляра-получателя) при помощи команды send 15, а получение сообщений не требует пина (т. е. экземпляр-получатель сообщения не знает пин конкретного экземпляра-отправителя) и осуществляется при помощи команды receive 16; каждый сеанс связи состоит в том, что экземпляр -отправитель отправляет сообщение, и экземпляр-получатель получает сообщение только одновременно, как бы во время рукопожатия или рандеву 17; если отправитель или получатель еще не готовы отправить или получить сообщение (не пришли на свидание) то партнер ждет; но сразу после успешного свидания оба участвовавших экземпляра продолжают работу по своей программе. Экземпляры процессов могут порождать новые экземпляры процессов по именам процессов при помощи команды create18. Предполагается, что каждый экземпляр любого процесса обязательно имеет несколько специальных переменных для пинов, среди которых обязательно есть переменные parent и offspring 19

13 Можно образно представить, что процесс - это чертеж робота, а экземпляры процесса - это роботы, изготовленные по данному чертежу.

14 Pin - process identification number - «идентификационный номер процесса» (англ.).

15 Send - «послать» или «отправить» (англ.).

16 Receive - «получить» (англ.).

17 Rendez-vous - «свидание» (франц.).

18 Create - «создать» (англ.).

19 Parent - «родитель» или «предок», а offspring - «отпрыск» или «потомок» (англ.).

для пина экземпляра процесса, его породившего, и пина последнего порожденного им самим экземпляра процесса.

Обычно процессный параллелизм реализуется в «многопроцессорной вычислительной среде» или «кластере»20 - совокупности процессоров или компьютеров, соединенных каналами для передачи сообщений, каждый из которых имеет свою собственную (локальную) память, причём один из этих процессоров осуществляет функции диспетчера по выделению пинов для процессов и реализует алгоритм планировщика загрузки процессоров (когда, кому и какой процесс выполнять), а еще несколько процессоров - маршрутизаторы сообщений (какое сообщение кому передать).

Ещё раз вернёмся к головоломке про бифштексы и дадим ей процессную интерпретацию. Теперь сковородка - это уже не двухядерный процессор, а вычислительная среда состоящая из двух отдельных процессоров, три бифштекса - это три экземпляра одного процесса «бифштекс», который состоит из двух последовательных команд «поджарить со стороны 1» и «поджарить со стороны 2», ну а планировщик - это как и прежде человек, который составляет алгоритм приготовления бифштексов. Псевдокод процесса «бифштекс» можно записать так: process бифштекс: ini=3, max=3 ; поджарить сторону 1 ; поджарить сторону 2 end.

Как и в многопотоковом случае, «умный» планировщик справится с приготовлением трёх бифштексов в «двухпроцессорной» сковородке за 15 минут.

Заключение

Выше мы перечислили несколько требований, которым должны удовлетворять головоломками, для того, чтобы их использовать как образовательно-тематические в IT-курсах. Это

91. простота формулировки (без специальной терминологии),

92. имеют элемент парадоксальности,

93. допускают разные уровни сложности,

94. требует определённого творческого шага при решении,

95. могут быть просто объяснены,

96. имею очень чёткий интерпретацию с точки зрения изучаемой темы. Мы надеемся, что во второй части нам удалось показать, что головоломка о бифштексах вполне удовлетворяет практически всем перечисленным требованиям, остаётся только показать, что эта головоломка допускает разные уровни сложности. Для этого мы приводим список

20 Cluster - «скопление» (англ.).

вопросов, которые предлагаются студентам для самостоятельного (по желанию) решения.

97. Можно ли приготовить три бифштекса быстрее чем за 15 минут, если каждый бифштекс надо поджарить с двух сторон, поджаривание каждого бифштекса с одной стороны занимает 5 минут, а на сковородку помещается только 2 бифштекса?

98. Каково будет ускорение ускорение по сравнению с синхронным попарным методом, если организовать конвейер для для приготовления N бифштексов при тех же условиях (т. е. каждый бифштекс надо обжарить с двух сторон, поджаривание каждого бифштекса с одной стороны занимает 5 минут, а на сковородку помещается только 2 бифштекса)? Является ли конвейер хорошо масштабируемым методом распараллеливания, т. е. сохраняет ускорение при росте N?

99. «Стихотворный» конкурс. Помните детскую загадку «А и Б сидели на трубе»? Если помните, то алгоритм приготовления бифштексов сам собой просится в стихи: «А и Б лежат в сковороде...» Так вот, объявляется конкурс на лучшее стихотворное переложение алгоритма приготовления бифштексов. Начало может быть любое (не обязательно «А и Б лежат в сковороде...»). Объем - не более 24 строк. Приз - три поджаренных бифштекса при личной встрече с авторами.

Но кроме вопросов и домашнего задания для студентов, у нас есть ещё вопросы и к коллегам-преподавателям, в частности тем, кто преподаёт параллельное программирование.

1. Как знакомить школьников с парадигмами параллельного программирования? Или головоломка о жарении бифштексов - это все, что у нас для этого в запасе? Кто предложит ещё что-нибудь?

2. Как знакомить с парадигмами параллельного программирования студентов разных специальностей: на формальных моделях параллельных вычислений, на уровне архитектурно-независимого «универсального языка параллельного программирования», или расширяя базовые языки последовательного программирования библиотеками поддержки параллелизма, или сразу учить параллельному программированию на конкретной платформе?

3. Могут ли помочь олимпиады и конкурсы по параллельному программированию популяризации параллельного программирования? Каков должен быть регламент таких «пара»-олимпиад в сравнении с ACM ICPC?

4. С какой формальной моделью параллельного программирования должен быть знаком каждый молодой математик-вычислитель,

системный и прикладной программист, системотехник и т. д.: сети Петри, алгебры процессов Бергсты и Клопа, алгебру и исчисление CSP Хоара, исчисление CCS и я-исчисление Милнера, исчисление окружений (ambient) Кардели, ... 5. Что такое «теория параллельного программирования»: формальные модели параллелизма + вычислительные методы + ...? Формальная семантика, спецификация и верификация параллельных алгоритмов и программ: диссертационный Клондайк для теоретиков или магистральный путь развития надежного и безопасного программирования?

Авторы будут рады, если эти вопросы вызовут отклик. В частности -за новые образовательно-тематические головоломки для 1Т'ишников вообще и «параллельщиков» в частности.

Литература

1. Бодин Е.В., Городняя Л.В., Шилов Н.В. По какому предмету олимпиада? // Сборник трудов II Международной научно-практической конференции «Современные информационные технологии и ИТ-образование». - М.: МАКС Пресс, 2006. - С. 226-233.

2. Карпов Ю.Г. Model Checking. Верификация параллельных и распределенных программных систем. Спб.: БХВ-Петербург, 2009.

3. Хювёнен Э., Септянен И. Мир Лиспа. 2 т. М.: Мир, 1990.

i Надоели баннеры? Вы всегда можете отключить рекламу.