Издательский дом «Питер» предлагает вашему вниманию книгу — «Современные операционные системы. 4-е изд.».
По промокоду LinuxORG действует скидка 30 % на все книги издательства.
Также в подарок при покупке бумажной будет её электронная версия.
Предисловие
Четвертое издание этой книги во многом отличается от третьего. Поскольку развитие операционных систем не стоит на месте, приведение материала к современному состоянию потребовало внесения большого количества мелких изменений. Глава, посвященная мультимедийным операционным системам, была перемещена в Интернет, главным образом для освобождения места для нового материала и предотвращения разрастания книги до абсолютно неуправляемого размера. Глава, посвященная Windows Vista, удалена, поскольку Vista не оправдала возлагавшихся на нее компанией Microsoft надежд. Также была удалена глава, посвященная Symbian, поскольку эта система сейчас распространена далеко не так широко, как прежде. Материал о Vista был заменен сведениями о Windows 8, а материал о Symbian — информацией об Android. Кроме этого, появилась совершенно новая глава о виртуализации и облачных вычислениях. Далее приводится краткое описание внесенных изменений.
Глава 1 была существенно переработана и обновлена, но за исключением нового раздела о мобильных компьютерах никакие основные разделы не были добавлены или удалены.
Глава 2 обновлена за счет удаления устаревшего и добавления нового материала. К примеру, был добавлен новый примитив синхронизации фьютекс и раздел о том, как полностью избежать блокировки с помощью чтения — копирования — обновления.
Глава 3 стала более сконцентрированной на современном оборудовании и менее направленной на рассмотрение сегментации и MULTICS.
Из главы 4 убраны упоминания о компакт-дисках, поскольку они уже потеряли свою значимость, а их место заняли более современные решения (флеш-носители). Также к разделу, посвященному RAID-системам, добавлено описание RAID-массива уровня 6.
В главу 5 внесено множество изменений. Из нее убраны описания устаревших устройств, таких как ЭЛТ-дисплеи и приводы компакт-дисков, и добавлены устройства, разраюботанные по новым технологиям, такие как сенсорные экраны.
Глава 6 почти не изменилась. Тема взаимоблокировок, за исключением некоторых новых результатов, остается практически неизменной.
Глава 7 совершенно новая. Она посвящена важным темам виртуализации и облачных вычислений. В качестве тематического исследования к ней добавлен раздел о VMware.
Глава 8 представляет собой обновленную версию предыдущего материала по многопроцессорным системам. Теперь в ней больше внимания уделено мультиядерным и многоядерным системам, важность которых в последние несколько лет постоянно возрастает. Теперь здесь поднят ставший в последнее время более острым вопрос о согласованности данных кэша.
Глава 9 подверглась существенному пересмотру и реорганизации с добавлением большого объема нового материала об использовании ошибок кода, о вредоносных программах и соответствующих мерах защиты. Более подробно рассмотрены такие атаки, как разыменование нулевого указателя и переполнение буферов. Теперь дано подробное описание защитных механизмов, NX-бит и рандомизации адресного пространства, а также способов, с помощью которых злоумышленники пытаются их преодолеть.
Глава 10 претерпела значительные изменения. Был обновлен материал, касающийся Unix и Linux, но главным дополнением можно считать новый довольно объемный раздел, посвященный операционной системе Android, которая часто встречается на смартфонах и планшетных компьютерах.
Глава 11 в третьем издании была посвящена Windows Vista. Теперь она заменена главой, посвященной Windows 8, а точнее Windows 8.1. То есть теперь в главе рассматривается самая актуальная версия.
Глава 12 представляет собой пересмотренную версию главы 13 из прошлого издания.
Глава 13 — это существенно обновленный список предлагаемого к изучению материала. Кроме того, список ссылок пополнился 223 новыми ссылками на работы, опубликованные после выхода третьего издания этой книги.
Кроме всего, по всей книге обновлены разделы, где рассказывается об исследованиях, чтобы отразить все новейшие работы, касающиеся операционных систем. К тому же во все главы добавлены новые вопросы.
Дополнительные материалы для преподавателей (на английском языке) можно найти по адресу www.pearsonhighered.com/tanenbaum. Там есть схемы, выполненные в PowerPoint, программные средства для изучения операционных систем, лабораторные работы для студентов, симуляторы и дополнительные материалы для использования в ходе преподавания курса, посвященного операционным системам. Преподавателям, использующим данную книгу в своем курсе, стоит туда заглянуть.
В работе над четвертым изданием принимали участие множество людей. В первую очередь это профессор Херберт Бос из Свободного университета Амстердама, ставший соавтором книги. Он специалист по безопасности и UNIX и обладает обширными познаниями в области компьютерных систем, поэтому очень хорошо, что он составил мне компанию. Им написано много нового материала, за исключением того, о чем будет упомянуто далее.
Наш редактор Трейси Джонсон (Tracy Johnson) была, как обычно, на высоте, приводя все к общему виду, объединяя материал, сглаживая шероховатости и заставляя выдерживать график работы над проектом. Нам также повезло в том, что к нам вернулась долгое время работавшая с нами ранее литературный редактор Камиль Трентакосте (Camille Trentacoste). Ее обширные познания во многих областях не раз спасали положение. Мы рады снова работать с ней после нескольких лет ее отсутствия. Также замечательно справилась со своей работой по координации усилий привлеченных к работе над книгой людей Кэрол Снайдер (Carole Snyder).
Материал главы 7, касающийся VMware (раздел 7.12), написан Эдуардом Бюньоном (Edouard Bugnion) из Федеральной политехнической школы Лозанны (Швейцария). Эд — один из основателей компании VMware и знаком с этим материалом как никто другой. Мы горячо благодарим его за предоставление нам этого материала.
Ада Гавриловска (Ada Gavrilovska) из Технологического института Джорджии, специалист по внутреннему устройству Linux, обновила главу 10 из третьего издания, которую сама же и написала. Материал по операционной системе Android в главе 10 написан Дианой Хакборн (Dianne Hackborn) из компании Google. Она является одним из ключевых разработчиков Android, ведущей операционной системы для смартфонов,поэтому мы очень благодарны ей за помощь. Теперь материалы главы 10 стали весьма обширными и подробными, и любители UNIX, Linux и Android могут почерпнуть из нее много полезных сведений. Наверное, стоит упомянуть о том, что самая длинная и наиболее технически насыщенная глава книги была написана двумя женщинами. А мы лишь упростили материал.
И конечно же, мы не оставили без внимания Windows. Глава 11 из предыдущего издания книги обновлена Дэйвом Пробертом (Dave Probert) из компании Microsoft. Теперь в ней дается подробное описание операционной системы Windows 8.1. Дэйв очень хорошо разбирается в Windows, и у него достаточно широкий кругозор для того, чтобы показать разницу между теми местами, где специалисты Microsoft все сделали правильно, и теми местами, где они ошиблись. Любителям Windows эта глава, несомненно, понравится.
Вклад всех этих специалистов позволил книге стать значительно лучше. Мы еще раз хотим поблагодарить их за неоценимую помощь.
Нам также повезло с рядом рецензентов, прочитавших подготовленный к печати материал и предложивших новые вопросы для размещения в конце каждой главы. В их числе были Труди Левин (Trudy Levine), Шивакант Мишра (Shivakant Mishra), Кришна Сивалингам (Krishna Sivalingam) и Кен Вонг. Стив Армстронг создал PowerPoint-страницы для преподавателей, использующих в своих учебных курсах материалы книги.
Обычно технические редакторы и корректоры не удостаиваются особых благодарностей, но Боб Ленц (технический редактор) и Джо Раддик (корректор) отнеслись к своей работе с особой тщательностью. В частности, Джо с двадцати метров может заметить разницу между точками прямого и курсивного начертания. И тем не менее авторы несут полную ответственность за любые упущения в данной книге. Читатели, заметившие любые ошибки, могут обратиться к одному из авторов.
И наконец, последними по списку, но не по значимости идут Барбара и Марвин, которые каждый по-своему замечательны. Отличным дополнением нашей семьи стали Даниэль и Матильда, Арон и Натан, замечательные парнишки, и Оливия, просто сокровище. И, разумеется, мне хочется поблагодарить Сюзанну за ее любовь и терпение, не говоря уже о винограде, вишнях, апельсинах и других сельскохозяйственных продуктах.
Эндрю С. Таненбаум (Andrew S. Tanenbaum)
Ниже представлен отрывок из книги.
Взаимоблокировка
В компьютерных системах множество ресурсов, которые одновременно могут использоваться только одним процессом. Стоит лишь вспомнить принтеры, накопители на магнитной ленте для резервного копирования данных компаний и элементы во внутренних системных таблицах. Если два процесса одновременно выводят информацию на принтер, то получается полная тарабарщина. Если два процесса будут использовать один и тот же элемент таблицы файловой системы, то эта система непременно будет повреждена. Поэтому все операционные системы способны временно предоставлять процессу исключительные права доступа к конкретным ресурсам.
При работе многих приложений процессу нужен исключительный доступ не к одному, а сразу к нескольким ресурсам. Предположим, к примеру, что каждый из двух процессов захотел записать отсканированный документ на Blu-ray-диск. Процесс A запрашивает разрешение на использование сканера и получает его. Процесс B запрограмми- рован по-другому: сначала он запрашивает разрешение на использование пишущего привода Blu-ray-дисков и также получает это разрешение. Теперь A запрашивает разрешение на использование пишущего привода Blu-ray-дисков, но запрос отклоняется до тех пор, пока это устройство не будет освобождено процессом B. К сожалению, вместо того чтобы освободить привод, B запрашивает разрешение на использование сканера. И в этот момент оба процесса оказываются заблокированными навсегда. Такая ситуация называется тупиковой ситуацией (тупиком), или взаимоблокировкой (deadlock).
Взаимоблокировки могут случаться и между машинами. К примеру, многие офисы оборудованы локальной сетью, к которой подключено множество компьютеров. Довольно часто такие устройства, как сканеры, пишущие приводы Blu-ray-дисков и DVD, принтеры и приводы накопителей на магнитной ленте, подключены к сети в качестве ресурсов общего пользования, доступных любому пользователю на любой машине. Если эти устройства могут быть дистанционно зарезервированы (например, с домашнего компьютера пользователя), то может возникнуть взаимоблокировка, похожая на только что рассмотренную. При более сложных обстоятельствах во взаимоблокировку могут быть вовлечены три, четыре и более устройств и пользователей.
Взаимоблокировки могут возникать и при массе других обстоятельств. К примеру, в системах управления базами данных, во избежание попадания в состояние состязания программе может понадобиться блокировка нескольких используемых ею записей. Если процесс A блокирует запись R1, а процесс B блокирует запись R2, а затем каждый процесс пытается заблокировать запись другого процесса, то получается та же взаимоблокировка. Таким образом, взаимоблокировки могут появляться при работе как с аппаратными, так и с программными ресурсами.
В данной главе будут рассмотрены разновидности взаимоблокировок, условия их возникновения, а также некоторые пути предотвращения взаимоблокировок или уклонения от их возникновения. Хотя этот материал касается взаимоблокировок в контексте операционных систем, они также случаются в системах управления базами данных и во многих других компьютерных областях, поэтому приводимые здесь сведения применимы к широкому спектру многозадачных систем. На тему взаимоблокировок существует множество научных трудов. Библиографии по этой теме дважды публиковались в Operating Systems Review, и на них стоит обратить внимание в качестве источников справочной информации (Newton, 1979; Zobel, 1983). Хотя этим библиографиям уже много лет, основная часть работ по взаимоблокировкам была завершена до 1980 года, поэтому они все еще не утратили своей актуальности.
Ресурсы
Основная часть взаимоблокировок связана с ресурсами, к которым некоторым процессам были предоставлены исключительные права доступа. К их числу относятся устройства, записи данных, файлы и т. д. Чтобы придать рассмотрению взаимоблокировок как можно более универсальный характер, мы будем называть объекты, к которым предоставляется доступ, ресурсами. Ресурсами могут быть аппаратные устройства (например, привод Blu-ray-дисков) или какая-то часть информации (например, запись базы данных). Обычно у компьютера может быть множество ресурсов, которые могут быть предоставлены процессу. Некоторые ресурсы могут быть доступны в нескольких идентичных экземплярах, например три привода Blu-ray-дисков. Когда доступны несколько копий ресурса, то для удовлетворения любого запроса на ресурс может быть использован один из них. Короче говоря, под ресурсом понимается все, что должно предоставляться, использоваться и через некоторое время высвобождаться, поскольку в один и тот же момент времени может использоваться только одним процессом.
Выгружаемые и невыгружаемые ресурсы
Ресурсы бывают двух видов: выгружаемые и невыгружаемые. К выгружаемым относятся такие ресурсы, которые могут быть безболезненно отобраны у процесса, который ими обладает. Примером такого ресурса может послужить память. Рассмотрим систему, имеющую 1 Гбайт пользовательской памяти, один принтер и два процесса по 1 Гбайт, каждый из которых хочет что-то вывести на печать. Процесс A запрашивает и получает принтер, а затем начинает вычислять значение, предназначенное для вывода на печать. Но до завершения вычисления истекает выделенный ему квант времени, и он выгружается на диск.
Теперь запускается процесс B, безуспешно, как оказывается, пытаясь завладеть принтером. Потенциально возникает ситуация взаимоблокировки, поскольку у процесса A есть принтер, а у процесса B — память и ни один из них не может продолжить свою работу без ресурса, удерживаемого другим процессом.
К счастью, есть возможность отобрать память у процесса B, выгрузив этот процесс на диск, и загрузить оттуда процесс A. Теперь A может возобновить свою работу, выполнить распечатку и высвободить принтер. И никакой взаимоблокировки не возникнет.
А вот невыгружаемый ресурс нельзя отобрать у его текущего владельца, не вызвав потенциально сбоя в вычислениях. Если у процесса, который уже приступил к записи на Blu-ray-диск, внезапно отобрать пишущий привод и отдать его другому процессу, это приведет к порче Blu-ray-диска. Пишущие приводы Blu-ray-дисков нельзя отобрать в произвольный момент.
Выгружаемость ресурса зависит от контекста. На стандартном персональном компьютере память является выгружаемым ресурсом, поскольку страницы всегда могут быть выгружены на диск, чтобы нужный объем свободной памяти был восстановлен. А на смартфоне, не поддерживающем свопинг или страничную организацию памяти, простой выгрузкой взаимоблокировки из-за дефицита памяти избежать не удастся.
Как правило, во взаимоблокировках фигурируют невыгружаемые ресурсы. Обычно потенциальные взаимоблокировки с участием выгружаемых ресурсов могут быть устранены путем перераспределения ресурсов от одного процесса к другому. Поэтому наше внимание будет сконцентрировано на невыгружаемых ресурсах. В наиболее общем виде при использовании ресурса происходит следующая последовательность событий:
- Запрос ресурса.
- Использование ресурса.
- Высвобождение ресурса.
Если во время запроса ресурс недоступен, запрашивающий процесс вынужден перейти к ожиданию. В некоторых операционных системах при отказе в выделении запрошенного ресурса процесс автоматически блокируется, а когда ресурс становится доступен — возобновляется. В других системах отказ в выделении запрашиваемого ресурса сопровождается кодом ошибки, и принятие решения о том, что следует делать, немного подождать или попытаться снова получить ресурс, возлагается на вызывающий процесс.
Процесс, чей запрос на выделение ресурса был только что отклонен, обычно входит в короткий цикл: запрос ресурса, затем приостановка, — после чего повторяет попытку. Хотя этот процесс не заблокирован, но по всем показателям он является фактически заблокированным, поскольку не может выполнять никакой полезной работы. При дальнейшем рассмотрении вопроса мы будем предполагать, что при отказе в выделении запрошенного ресурса процесс впадает в спячку.
Особенности запроса ресурса существенно зависят от используемой системы. В некоторых системах для запроса предоставляется системный вызов request, позволяющий процессам запросить ресурс в явном виде. В других системах единственными ресурсами, о которых знает операционная система, являются специальные файлы, которые в конкретный момент времени могут быть открыты только одним процессом. Они открываются с использованием обычного вызова open. Если файл уже используется, вызывающий процесс блокируется до тех пор, пока файл не будет закрыт текущим владельцем.
Получение ресурса Для некоторых видов ресурсов, таких как записи в базе данных, управление использованием ресурсов зависит от самих пользовательских процессов, а не от системы. Один из способов, позволяющих ввести пользовательское управление ресурсами, заключается в присоединении семафора к каждому из ресурсов.
Все эти семафоры получают исходное значение, равное 1. С таким же успехом могут использоваться и мьютексы. Перечисленные ранее три этапа затем воплощаются в применение к семафору вызова down для получения ресурса, использование ресурса и, в завершение, применение вызова up при высвобождении ресурса. Эти этапы показаны в листинге 6.1, а.
Листинг 6.1. Использование семафоров для защиты: а — одного ресурса; б — двух ресурсов
typedef int semaphore; typedef int semaphore;
semaphore resource_1; semaphore resource_1;
semaphore resource_2;
void process_A(void) { void process_A(void) {
down(&resource_1); down(&resource_1);
use_resource_1( ); down(&resource_2);
up(&resource_1); use_both_resources( );
} up(&resource_2);
up(&resource_1);
}
a б
Иногда процессы нуждаются в двух и более ресурсах. Их можно получать последовательно, как показано в листинге 6.1, б. Если требуется больше двух ресурсов, их запрашивают непосредственно один за другим.
Пока все идет хорошо. Пока речь идет только об одном процессе, все работает нормально. Конечно, когда используется только один процесс, нет нужды в формальном получении ресурсов, поскольку нет соперничества за обладание ими.
Теперь рассмотрим ситуацию с двумя процессами — A и B — и двумя ресурсами. В листинге 6.2 показаны два сценария: а — оба процесса запрашивают ресурсы в одном и том же порядке; б — запрашивают ресурсы в разном порядке. Разница может показаться несущественной, но это не так.
Листинг 6.2. Код: а — не вызывающий взаимоблокировки; б — в котором кроется потенциальная возможность взаимоблокировки
typedef int semaphore;
semaphore resource_1; semaphore resource_1;
semaphore resource_2; semaphore resource_2;
void process_A(void) { void process_A(void) {
down(&resource_1); down(&resource_1);
down(&resource_2); down(&resource_2);
use_both_resources( ); use_both_resources( );
up(&resource_2); up(&resource_2);
up(&resource_1); up(&resource_1);
} }
void process_B(void) { void process_B(void){
down(&resource_1); down(&resource_2);
down(&resource_2); down(&resource_1);
use_both_resources( ); use_both_resources( );
up(&resource_2); up(&resource_1);
up(&resource_1); up(&resource_2);
} }
a б
В листинге 6.2, а один из процессов запрашивает первый ресурс раньше, чем это делает второй процесс. Затем этот же процесс успешно получает второй ресурс и выполняет свою работу. Если второй процесс попытается получить ресурс 1 до его высвобождения, то он будет просто заблокирован до тех пор, пока ресурс не станет доступен.
В листинге 6.2, б показана другая ситуация. Может случиться, что один из процессов получит оба ресурса и надежно заблокирует другой процесс до тех пор, пока не сделает свою работу. Но может случиться и так, что процесс A получит ресурс 1, а процесс B получит ресурс 2. Каждый из них теперь будет заблокирован при попытке получения второго ресурса. Ни один из процессов не возобновит свою работу. Плохо то, что воз- никнет ситуация взаимоблокировки.
Здесь мы видим, что происходит из-за небольшой разницы в стиле программирования: в зависимости от того, какой из ресурсов будет получен первым, программа либо работает, либо дает трудноопределимый сбой. Поскольку взаимоблокировки могут возникать столь просто, для борьбы с ними были проведены обширные исследования. В этой главе подробно рассматриваются взаимоблокировки и средства борьбы с ними.
Введение во взаимоблокировки
Взаимоблокировкам можно дать следующее формальное определение.
Взаимоблокировка в группе процессов возникает в том случае, если каждый процесс из этой группы ожидает события, наступление которого зависит исключительно от другого процесса из этой же группы.
Поскольку все процессы находятся в состоянии ожидания, ни один из них не станет причиной какого-либо события, которое могло бы возобновить работу другого процесса, принадлежащего к этой группе, и ожидание всех процессов становится бесконечным. В этой модели предполагается, что у процессов есть только один поток, а прерывания, способные возобновить работу заблокированного процесса, отсутствуют. Условие отсутствия прерываний необходимо, чтобы не позволить заблокированному по иным причинам процессу возобновить свою работу, скажем, по аварийному сигналу, после чего вызвать событие, освобождающее другие имеющиеся в группе процессы.
В большинстве случаев событием, наступления которого ожидает каждый процесс, является высвобождение какого-либо ресурса, которым на данный момент владеет другой участник группы. Иными словами, каждый процесс из группы, попавшей в ситуацию взаимоблокировки, ожидает ресурса, которым обладает другой процесс из этой же группы. Ни один из процессов не может работать, ни один из них не может высвободить какой-либо ресурс, и ни один из них не может возобновить свою работу. Количество процессов и количество и вид удерживаемых и запрашиваемых ресурсов не имеет значения. Этот результат сохраняется для любого типа ресурсов, включая аппаратные и программные ресурсы. Этот вид взаимоблокировки называется ресурсной взаимоблокировкой. Наверное, это самый распространенный, но далеко не единственный вид. Сначала мы рассмотрим ресурсную взаимоблокировку, а в конце этой главы вернемся к краткому обзору других видов взаимоблокировки.
Условия возникновения ресурсных взаимоблокировок
Коффман (Coffman et al., 1971) показал, что для возникновения ресурсных взаимоблокировок должны выполняться четыре условия:
- Условие взаимного исключения. Каждый ресурс либо выделен в данный момент только одному процессу, либо доступен.
- Условие удержания и ожидания. Процессы, удерживающие в данный момент ранее выделенные им ресурсы, могут запрашивать новые ресурсы.
- Условие невыгружаемости. Ранее выделенные ресурсы не могут быть принудительно отобраны у процесса. Они должны быть явным образом высвобождены тем процессом, который их удерживает.
- Условие циклического ожидания. Должна существовать кольцевая последовательность из двух и более процессов, каждый из которых ожидает высвобождения ресурса, удерживаемого следующим членом последовательности.
Для возникновения ресурсной взаимоблокировки должны соблюдаться все четыре условия. Если одно из них не соблюдается, ресурсная взаимоблокировка невозможна.
Следует заметить, что каждое условие относится к той политике, которой придерживается или не придерживается система. Может ли данный ресурс быть выделен одновременно более чем одному процессу? Может ли процесс удерживать ресурс и запрашивать другой ресурс? Может ли ресурс быть отобран? Может ли получиться циклическое ожидание? Чуть позже мы увидим, как взаимоблокировке может противостоять попытка устранения некоторых из этих условий.
Об авторах
Эндрю С. Таненбаум получил степень бакалавра в Массачусетском технологическом институте и степень доктора философии в Калифорнийском университете в Беркли. В настоящее время он занимает должность профессора информатики в университете Врийе (Vrije) в Амстердаме (Нидерланды). Прежде он был деканом межуниверситетской аспирантуры по компьютерной обработке данных и изображений (Advanced School for Computing and Imaging), где вел исследования в области передовых параллельных систем, распределенных систем и систем обработки изображений. Он также был профессором Королевской Нидерландской академии искусства и наук (Royal Netherlands Academy of Arts and Sciences), что, собственно, и спасло его от превращения в бюрократа. Кроме того, выиграл престижный грант Европейского совета по научным исследованиям (European Research Council Advanced Grant).
В прошлом он вел исследования в области компиляторов, операционных систем, сетевых технологий и распределенных систем. Сейчас в основном сосредоточился на исследованиях в области надежных и безопасных операционных систем. В результате этих исследований появилось более 175 рецензированных статей, опубликованных в журналах и обнародованных на конференциях. Кроме этого, профессор Таненбаум является автором или соавтором пяти книг, которые переведены на 20 языков, от баскского до тайского, и используются в университетах по всему миру. В целом существует 163 варианта изданий его книг (комбинаций язык + издание).
Профессор также разработал значительный объем программного обеспечения, в част-ности MINIX, небольшого клона UNIX. Эта программа стала непосредственным вдохновляющим фактором для создания Linux и той платформой, на которой перво- начально и разработана операционная система Linux. Текущая версия MINIX, которая носит название MINIX 3, в настоящий момент позиционируется как исключительно надежная и безопасная операционная система. Профессор Таненбаум будет считать свою работу завершенной, как только не останется ни одного пользователя, способного замыслить действия, приводящие к выходу операционной системы из строя. MINIX 3 — это развивающийся проект, находящийся в свободном доступе, и вас также приглашают к сотрудничеству по его развитию. Чтобы загрузить свободную копию и разобраться в ее работе, перейдите по адресу www.minix3.org. Загрузить можно версии как для x86, так и для ARM.
Аспиранты профессора Таненбаума, закончив учебу, добились больших успехов. И он ими очень гордится. В этом смысле он чем-то напоминает курицу-наседку.
Таненбаум является членом Ассоциации вычислительной техники (Association for Computing Machinery — ACM), Института инженеров по электротехнике и электронике (Institute of Electrical and Electronics Engineers — IEEE), Королевской Нидерландской академии искусства и наук. Он удостоен многочисленных научных наград от ACM, IEEE и USENIX. У него имеются две почетные докторские степени. Если вы заинтересовались ученым, зайдите на страницу о нем в «Википедии».
Херберт Бос получил степень магистра в университете Твенте, а степень доктора философии — в компьютерной лаборатории Кембриджского университета (Великобритания). С тех пор он упорно работал над созданием надежных и эффективных архитектур ввода-вывода для операционной системы Linux и проводил исследования систем, основанных на MINIX 3. В настоящее время является профессором кафедры компьютерных наук университета Врийе (Vrije) в Амстердаме (Нидерланды) и занимается вопросами безопасности систем и сетей. Со своими студентами он работает над новыми способами обнаружения и прекращения атак, анализа и расшифровки устройства вредоносных программ, а также фиксации ботов (вредоносных инфраструктур, которыми могут быть охвачены миллионы компьютеров). В 2011 году под свои исследования по расшифровке устройства вредоносных программ он получил начальный грант Европейского совета по научным исследованиям (ERC Starting Grant). Трое из его студентов получили премию имени Роджера Нидхэма (Roger Needham Award) за лучшие кандидатские диссертации по системам.