Спецкурс "Низкоуровневое программирование" (осень 2020 г.)

Итак, что я ещё собирался вам рассказать. Всё это есть в третьем томе, так что параграфы и страницы я указываю от него, без дополнительных уточнений. Учтите, что в PDFе нумерация страниц отличается от той, которая в книге, за счёт двух страниц спереди (обложка и лицензия). Здесь я номер даю по книге, то есть, например, если написано "стр.157", то это в бумажной книге она 157, а в PDF-файле -- 159 (но при этом на самой странице написано "157").

1) Вызов mmap. пар. 5.3.7, стр.67 Заодно рекомендую глянуть вот эту вот статью: https://www.linuxjournal.com/article/6345 -- просто чтобы знать, что такое тоже бывает (использовать на практике не рекомендую, пока в угол не загонят и не заставят; ибо не портабельно совершенно, чистый linux specific).

2) Вызов select. Чтобы понять, о чём идёт речь, рекомендую освежить в памяти сокеты (гл. 6.3), а затем уже читать главу про сам select (6.4, вплоть до параграфа 6.4.5). Оставшиеся параграфы 6.4.6 и 6.4.7 довольно мозголомны, но тем, кого интересует не только оценка за спецкурс, а ещё и повышение собственной квалификаци, настоятельно рекомендую и эти параграфы тоже.

3) Как на самом деле устроена обработка сигналов -- пар. 8.2.3 (стр. 343) Можете сначала пробежать параграф 5.5.2 (собственно сигналы), очень может быть, что узнаете что-то новое. Ну и в этом свете ещё раз 6.4.7 -- если сумеете всё-таки осилить, как нужно обращаться с pselect и почему, то, считайте, некое дао постигли :-)

4) Планирование (CPU scheduling) в Линуксе, алгоритм CFS. Вот не могу мимо пройти, ибо красиво :-) Это пар. 8.2.2, стр. 336. Описание CFS начинается со стр. 340.

Если что-то будет непонятно -- спрашивайте. Можно по почте, можно здесь в комментах, можно в джаббер стукнуться -- как хотите.

Вопрос о том, как будет проводиться экзамен, давайте подвесим до первой недели декабря, мало ли что ещё успеет случиться.

Вопрос по спецкурсу

Добрый день.

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

admin аватар

Могу разве что

Могу разве что книжки предложить :-) Берёте второй том, в нём часть про NASM, потом если хорошо знаете чистый Си (в смысле тот, что без плюсов), то сразу третий том практически целиком, если Си не очень хорошо знаете, то сначала во втором томе часть про Си :-)

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

self select

Спасибо, что не бросили нас!

Предложенные пункты, вроде бы, осилил (хотя звездочка над 6.4.7 и испугала).

Есть вопрос. Вы пишите, что event-driven архитектуру (если можно так сказать) используют в приложениях с GUI. Тут всё вроде ясно: пришел какой-то input от пользователя, мы реагируем, обновляя внутреннее состояние и перерисовывая часть интерфейса. Но что делать, если "событие" возникло внутри приложения? Мы же не можем его получить штатными методами. В приложениях, построенных по схеме

for (;;) {
    msec_1 = now()
    // do stuff
    msec_2 = now()
    usleep(16667 - (msec_2 - msec_1) * 1000);
}

всё просто: надо что-то сделать? Мы это сделаем либо на этой итерации, либо, в крайнем случае, на следующей.

Конкретный пример: текстовое поле анимацией прокрутки. Мы получаем наш евент на прокрутку от пользователя, но что потом? Сразу же мы всю анимацию проиграть не можем. Как-то подписаться на какой-то таймер? Но тогда в чем отличие от for (;;) { usleep } ?

Прошу прощения, если намудрил. Просто давно интересует как это делают в gui тулкитах.

admin аватар

event-driven

Отличие от usleep очень простое: откуда вы взяли именно такое значение? На потолке было написано?

По поводу "таймеров" — всё делается очень просто. Если есть некий момент в будущем, когда потребуется что-то сделать, заводим объект, в котором этот момент прописан (вот прямо в виде sec/msec абсолютного времени), и у объекта есть виртуальный метод (или callback-функция, если у нас не ООП), который/которую надо дёрнуть, когда время настанет. Объекты эти располагаются в односвязном списке, отсортированном по возрастанию временнОго значения. Перед заныриванием в select делается gettimeofday, объекты, для которых время уже прошло, дёргаются и удаляются, до ближайшего из оставшихся вычисляется время -- и используется пятым параметром select'а.

Если же есть действия, которые ко времени не привязаны, то есть их просто "надо когда-нибудь сделать", то для этого можно сделать ещё один список объектов с методами, и если он не пуст -- дёргать метод каждого из них на каждой итерации главного цикла. Полезно, например, при проведении "фоном" каких-нибудь длинных вычислений. Надо только не забывать, что долго сидеть в обработчике нельзя.

event-driven

Действительно, пятый параметр select спасает положение. Спасибо! В такую "очередь", наверное, можно класть любую большую задачу, разрезанную на кусочки, чтобы создать эффект асинхронного выполнения без зависания интерфейса. А для совсем здоровых задач запускать отдельный процесс.

p.s. величину взял из расчета что монитор 60hz, а значит мы имеем 16мс на "кадр" для сохранения интерактивности.

admin аватар

Ну, он вообще-то

Ну, он вообще-то не всегда 60hz, и частота развёртки с частотой кадров не совпадает, да и к тому же между экраном и вашей программой ещё столько действующих лиц, что вряд ли можно к этому всерьёз привязываться. Но идея интересная :-)

Так или иначе, если можно избежать использования эвристических предположений, то лучше без них обходиться.

А задачу даже резать на кусочки не надо, достаточно её обсчёт оформить в виде "управление получили, что-то сделали, новое состояние запомнили, управление вернули". Засунуть это состояние в объект, а получение управления -- в метод (или в callback-функцию и её параметр userdata, если чистый Си, например), и дело в шляпе.

UPD: забыл уточнить -- если список тасклетов, то есть тех объектов, чей метод следует дёргать на каждой итерации, не пуст -- то в timeval перед вызовом select заносим ноль, и используем select просто чтобы узнать, не надо ли на дескрипторах чего обработать.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".