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) Review and Tips

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

[ omscs learning engineering ] · 7 min read

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

You might also be interested in this OMSCS FAQ I wrote after graduation. Or view all OMSCS related writing here: omscs.

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

Over Fall 2019, I finally completed OMSCS with my last course. It has been a fulfilling marathon over three years learning about the fundamentals of machine learning, software engineering, and building user-centric products in a structured learning environment with peers from all over the world.

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

For my last course, I wanted something I had no experience in, something different from my day-to-day work, and something out of my comfort zone.

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

Enter CS6200, Introduction to Operating Systems. The course description mentions concurrency, synchronization, resource management, and distributed services, with projects on multithreaded programming, inter-process communication, and distributed interactions via RPC. The projects would be in C and C++. I knew little about these topics and C/C++—perfect.

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

The ratings on OMS Central were excellent, with a class rating of 4.4, difficulty of 3.6, and about 17 hours per week. In addition, I have only heard good reviews from others who have taken it. (As an aside, I found the difficulty to be on par with ML, RL, and AI (4.1 – 4.3), and the effort to be slightly higher at about 20 – 30 hours a week, especially for the initial projects.)

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

Seems like a great last course (or so I thought). As I confirmed my course selection, I rationalized that it would be useful to gain knowledge and familiarity at the OS level, though I’m not sure how it’ll be applied in my work (as a data scientist).

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

Well was I in for a surprise (read: shock).

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

Within the first week of project 1, I knew I was in trouble. I had either overestimated my ability to pick up C, or underestimated the sophistication of the projects, or both.

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

The first project had us working to send images between processes at the byte level (i.e., looping over all bytes) and implementing multithreaded servers and clients—I was in way over my head. I only completed 80% of it.

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

However, over the course of the projects and lessons, I found myself enjoying cracking my head on the material. From designing servers and clients that communicated via shared memory, to learning about synchronization and inter-process communication APIs/gRPC and using them, to understanding how CPU, memory, and disk work in distributed processes, as I look back, it was a lot of fun.

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

All in all, this is a course I highly recommend, though students should have a baseline understanding of C.

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

What’s the course like?

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

Half of the learning comes from hands-on implementation. There were three main projects (40%) and an optional side project (bonus 4%). The main projects have a similar theme: Moving data between processes in a multithreaded fashion.

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

Projects 1 and 3 are in C, while project 4 is in C++ and uses gRPC and protocol buffers. If you come into the class without any C knowledge, there might be some teething pains.

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

Project 1 involved sending messages and files via sockets. It starts off slow where students implement the protocol specified and send simple strings (as warmup). Then, these string messages are used as client requests for files, which the server has to respond with sending a file (i.e., an image) over a socket. As a finale, this has to be multithreaded and the implementation throughput is tested. Multithreading it involved working with synchronization constructs such as mutexes and conditional variables. This project took me about 60 hours and I only managed to complete 80% of it.

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

The predefined protocol for client server communication

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

Project 2 was an optional project that provided up to 4% extra credit. The deliverable was a paper on how to performance test the multithreaded server and client implemented in project 1 (e.g., how would performance scale as the number of threads increase?). No implementation was involved though significant detail on the experiment methodology was required. This project is only evaluated at the end of the course for students that are close to the grade cutoffs (e.g., between A and B, or B and C).

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

Project 3 involved transferring files over shared memory. Thee bulk of it was figuring out the design of a server and client that communicates via shared memory and message queues, and how to use synchronization constructs to prevent race conditions. This can be daunting for students with little prior OS and engineering background. Thankfully, TAs and peers were there to provide suggestions and guidance. After the steep learning curve of project 1, I found project 2 slightly easier. It took 30 – 40 hours to fully complete.

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

Building a cache server based on shared memory

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

Project 4 had us learning about transferring files via remote procedure calls, specifically, gRPC. At a high level, we were building a DropBox that would keep files across clients in sync via a central server. To start, we implemented RPCs for clients to fetch, store, delete, and list files on the server. Then, these RPCs were used to build a distributed file system to sync files across clients via the server. I.e., if a new file was added to client 1, this should be automatically uploaded to the server, and replicated on other clients.

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

Exams accounted for the majority of the grade, with the midterms making up 25% and the finals 30%. The finals are non-cumulative (i.e., only covers material after the midterm). The exams mainly evaluate on understanding the content from the lectures and papers and comprised of multiple choice and calculations. If you understand the fundamentals of the course content and the calculations in the lectures (i.e., can replicate them instead of just at the handwavy level), you should be able to do decently well.

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

Class discussions took place on Piazza and Slack. 5% was allocated as participation points, though like project 2, this was only evaluated for students at the borderline between grade cut-offs. From the TAs, this was about 2-3% of students in each cohort.

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

The Piazza forum was fairly standard. Prof Ada and the TAs are active on them and share important information there.

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

The slack channels deserve special mention. The TAs and students were much more active on Slack. The TAs mainly took a Socratic (though it can come across as trolling) approach towards providing advice that largely involves asking questions to help students think deeper about their design and implementation. Many students credit successful completion of projects to the guidance from the TAs and their peers on slack, where past advice and suggestions are easily searchable. Nonetheless, it can be a bit of a firehose at times where I would wake up and find 600+ new messages overnight (given the time difference).

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

As one award-winning TA put it, Piazza is the classroom, Slack is the class lobby.

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

What did I learn?

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

Reflecting on when I first started CS6200, I have come a long way and learnt a lot, largely because I had no relevant knowledge and experience initially.

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

Specific to programming languages, I gained familiarity with C and C++, strongly typed compiled languages that require you to do your own memory management. While I don’t have the proficiency to write production level code (yet?), I can read and understand packages built on C/C++, and maybe build small prototypes.

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

On the course material, I came away with a greater appreciation of inter-process communication and synchronization. It was eye opening to build clients and servers that move data at the byte level through sockets, shared memory, and RPCs. The class also provided a greater understanding of the synchronization constructs available such as mutexes, spin locks, semaphores, etc.

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

For those who are interested, here are some great resources on the Linux APIs for inter-process communication and gRPC. Overall, I highly recommend this class for anyone looking to get a basic understand of how operating systems work.

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

If you found this useful, please cite this write-up as:

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

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

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

or

или

@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/} }

@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/} }



Join 11,800+ readers getting updates on machine learning, RecSys, LLMs, and engineering.

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