newsmode
search
Меню
arrow_back Назад

OMSCS CS6200 (Introduction to OS) Review and Tips

auto_awesomeКраткое саммари

Юджин Ян (Зию Ян) рассказывает о CS6200 «Introduction to Operating Systems» — последнем курсе своей трёхлетней программы OMSCS в Georgia Tech, который он закончил осенью 2019 года. Он намеренно выбрал тему, в которой не разбирался: проекты на C и C++ по многопоточному программированию, межпроцессному взаимодействию и распределённым сервисам через RPC. По рейтингам OMS Central курс получил 4.4 балла, сложность 3.6 и около 17 часов в неделю, хотя у автора первый проект занял около 60 часов и был выполнен лишь на 80%. Оценка складывалась из трёх основных проектов (40%), промежуточного (25%) и финального (30%) экзаменов, участия (5%) и опционального проекта (бонус 4%); проекты охватывали передачу данных через сокеты, разделяемую память и gRPC, вплоть до построения распределённой файловой системы вроде DropBox. Несмотря на крутую кривую обучения, автор настоятельно рекомендует курс тем, кто хочет понять основы работы операционных систем, оговариваясь, что базовое знание C желательно.

OMSCS CS6200 (Introduction to OS): обзор и советы

[ omscs learning engineering ] · 7 мин чтения

Возможно, вам также будет интересен этот OMSCS FAQ, который я написал после выпуска. Или посмотрите все материалы, связанные с OMSCS, здесь: omscs.

Осенью 2019 года я наконец завершил OMSCS своим последним курсом. Это был полноценный марафон длиной в три года, в течение которого я изучал основы машинного обучения, разработки ПО и создания ориентированных на пользователя продуктов в структурированной учебной среде вместе с коллегами со всего мира.

Для последнего курса мне хотелось чего-то, в чём у меня не было опыта, чего-то отличного от моей повседневной работы и выводящего меня из зоны комфорта.

И вот — CS6200, Introduction to Operating Systems. В описании курса упоминаются конкурентность, синхронизация, управление ресурсами и распределённые сервисы, а также проекты по многопоточному программированию, межпроцессному взаимодействию и распределённым взаимодействиям через RPC. Проекты предполагались на C и C++. Я мало что знал об этих темах и о C/C++ — идеально.

Рейтинги на OMS Central были превосходными: рейтинг курса 4.4, сложность 3.6 и около 17 часов в неделю. Кроме того, я слышал только хорошие отзывы от тех, кто его проходил. (К слову, я нашёл сложность сопоставимой с ML, RL и AI (4.1 – 4.3), а трудозатраты — чуть выше, около 20 – 30 часов в неделю, особенно на первых проектах.)

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

Что ж, меня ждал сюрприз (читай: шок).

Уже на первой неделе первого проекта я понял, что попал в беду. Я либо переоценил свою способность освоить C, либо недооценил сложность проектов, либо и то, и другое.

В первом проекте нам нужно было пересылать изображения между процессами на уровне байтов (то есть в цикле по всем байтам) и реализовывать многопоточные серверы и клиенты — это было мне совершенно не по зубам. Я выполнил его лишь на 80%.

Тем не менее по ходу проектов и занятий я обнаружил, что мне нравится ломать голову над материалом. От проектирования серверов и клиентов, общающихся через разделяемую память, до изучения API синхронизации и межпроцессного взаимодействия/gRPC и их применения, до понимания того, как работают CPU, память и диск в распределённых процессах — оглядываясь назад, это было очень увлекательно.

В целом, это курс, который я настоятельно рекомендую, хотя у студентов должно быть базовое понимание C.

Что представляет собой курс?

Половина обучения приходится на практическую реализацию. Было три основных проекта (40%) и один опциональный дополнительный проект (бонус 4%). У основных проектов схожая тема: Перемещение данных между процессами в многопоточном режиме.

Проекты 1 и 3 — на C, а проект 4 — на C++ и использует gRPC и protocol buffers. Если вы приходите на курс без каких-либо знаний C, могут возникнуть «болезни роста».

Проект 1 заключался в отправке сообщений и файлов через сокеты. Он начинается неспешно: студенты реализуют заданный протокол и отправляют простые строки (в качестве разминки). Затем эти строковые сообщения используются как запросы клиента на файлы, на которые сервер должен ответить, отправив файл (то есть изображение) через сокет. В качестве финала всё это нужно сделать многопоточным, и пропускная способность реализации тестируется. Многопоточность включала работу с конструкциями синхронизации, такими как мьютексы и условные переменные. Этот проект занял у меня около 60 часов, и мне удалось выполнить его лишь на 80%.

Заранее заданный протокол для взаимодействия клиента и сервера

Проект 2 был опциональным проектом, дававшим до 4% дополнительных баллов. Результатом была статья о том, как тестировать производительность многопоточных сервера и клиента, реализованных в проекте 1 (например, как масштабируется производительность при увеличении числа потоков?). Реализация не требовалась, но нужно было детально проработать методологию эксперимента. Этот проект оценивается только в конце курса для студентов, находящихся близко к порогам оценок (например, между A и B или между B и C).

Проект 3 заключался в передаче файлов через разделяемую память. Основная его часть состояла в том, чтобы продумать дизайн сервера и клиента, которые общаются через разделяемую память и очереди сообщений, и как использовать конструкции синхронизации для предотвращения состояний гонки. Это может быть пугающим для студентов с небольшим предыдущим опытом в ОС и инженерии. К счастью, рядом были TA и однокурсники, готовые дать советы и направить. После крутой кривой обучения проекта 1 я нашёл проект 2 чуть проще. На полное выполнение ушло 30 – 40 часов.

Построение кэширующего сервера на основе разделяемой памяти

Проект 4 заставил нас разбираться с передачей файлов через удалённые вызовы процедур, а именно gRPC. На высоком уровне мы строили DropBox, который синхронизировал бы файлы между клиентами через центральный сервер. Для начала мы реализовали RPC, позволяющие клиентам получать, сохранять, удалять и перечислять файлы на сервере. Затем эти RPC использовались для построения распределённой файловой системы, синхронизирующей файлы между клиентами через сервер. То есть, если новый файл добавлялся на клиенте 1, он должен был автоматически загружаться на сервер и реплицироваться на других клиентах.

Экзамены составляли большую часть оценки: промежуточный — 25%, а финальный — 30%. Финальный экзамен некумулятивный (то есть охватывает только материал после промежуточного). Экзамены в основном проверяют понимание содержания лекций и статей и состоят из вопросов с выбором ответа и вычислений. Если вы понимаете основы содержания курса и вычисления из лекций (то есть можете их воспроизвести, а не только на уровне «на пальцах»), вы должны справиться достаточно хорошо.

Обсуждения в классе проходили в Piazza и Slack. 5% выделялось на баллы за участие, хотя, как и проект 2, это оценивалось только для студентов на границе между порогами оценок. По словам TA, это около 2-3% студентов в каждом потоке.

Форум Piazza был вполне стандартным. Профессор Ada и TA активны на нём и делятся там важной информацией.

Каналы в Slack заслуживают особого упоминания. TA и студенты были гораздо активнее в Slack. TA в основном применяли сократический (хотя это может восприниматься как троллинг) подход к советам, который во многом сводился к задаванию вопросов, чтобы помочь студентам глубже задуматься о своём дизайне и реализации. Многие студенты приписывают успешное завершение проектов руководству со стороны TA и однокурсников в Slack, где прошлые советы и подсказки легко найти поиском. Тем не менее временами это может быть как пожарный шланг — я просыпался и обнаруживал 600+ новых сообщений за ночь (учитывая разницу во времени).

Как выразился один отмеченный наградой TA, Piazza — это аудитория, а Slack — фойе класса.

Чему я научился?

Вспоминая, как я только начинал CS6200, я проделал большой путь и многому научился — во многом потому, что изначально у меня не было соответствующих знаний и опыта.

Что касается языков программирования, я освоился с C и C++ — строго типизированными компилируемыми языками, которые требуют самостоятельного управления памятью. Хотя у меня (пока?) нет квалификации писать код продакшен-уровня, я могу читать и понимать пакеты, построенные на C/C++, и, может быть, собирать небольшие прототипы.

По материалу курса я вынес большее понимание межпроцессного взаимодействия и синхронизации. Было откровением строить клиенты и серверы, которые перемещают данные на уровне байтов через сокеты, разделяемую память и RPC. Курс также дал более глубокое понимание доступных конструкций синхронизации, таких как мьютексы, спин-локи, семафоры и т. д.

Для тех, кому интересно, вот несколько отличных ресурсов по Linux API для межпроцессного взаимодействия и gRPC. В целом, я настоятельно рекомендую этот курс всем, кто хочет получить базовое понимание того, как работают операционные системы.

Если этот материал оказался вам полезен, пожалуйста, цитируйте его так:

Yan, Ziyou. (Dec 2019). OMSCS CS6200 (Introduction to OS) Review and Tips. eugeneyan.com. https://eugeneyan.com/writing/omscs-cs6200-introduction-to-operating-systems/.

или

@article{yan2019ios, title = {OMSCS CS6200 (Introduction to OS) Review and Tips}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2019}, month = {Dec}, url = {https://eugeneyan.com/writing/omscs-cs6200-introduction-to-operating-systems/} }



Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.