Рубрика «многозадачность» - 2

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

Здесь я расскажу, как кооперативная многозадачность превращается во враждебную преемптивную.

Суть этого превращения проста. В машине есть таймер, таймер генерирует прерывания, прерывания приостанавливают код нити и отдают процессор в руки механизма многозадачности. Оный уже вполне кооперативно переключает процессор на новую нить, как и описано в предыдущей статье.

Но, как обычно, есть нюансы. См. код для интела.

Сам «отъём» процессора делается как в рамках обычного хардверного прерывания, обычно — по таймеру, так и в рамках «софтверного» прерывания — которое, собственно, такое же прерывание, но вызванное специальной инструкцией процессора. Такой способ переключения контекста нужен, если мы (например, в рамках примитива синхронизации) явно останавливаем нить и не хотим ждать, пока прилетит таймерное прерывание.
Читать полностью »

Я стараюсь чередовать статьи про разработку ОС вообще и специфические для ОС Фантом статьи. Эта статья — общего плана. Хотя, конечно, я буду давать примеры именно из кода Фантома.

В принципе, реализация собственно механизма многозадачности — довольно простая вещь. Сама по себе. Но, во-первых, есть тонкости, и во-вторых, она должна кооперироваться с некоторыми другими подсистемами. Например, та же реализация примитивов синхронизации очень тесно связана с реализацией многозадачности. Есть небанальная связь так же и с подсистемой обслуживания прерываний и эксепшнов. Но об этом позже.

Начнём с того, что есть два довольно мало связанных модуля — собственно подсистема переключения задач (контекстов) и подсистема шедулинга. Вторую мы сегодня обсуждать почти не будем, просто опишем кратко.

Шедулер — это функция, которая отвечает на вопрос «какой нити отдать процессор прямо сейчас». Всё. Простейший шедулер просто перебирает все нити (но, конечно, готовые к исполнению, не остановленные) по кругу (RR алгоритм). Реальный шедулер учитывает приоритеты, поведение нити (интерактивные получают больше, чем вычислительные), аффинити (на каком процессоре нить работала в прошлый раз) и т.п., при этом умеет сочетать несколько классов приоритетов. Типично это класс реального времени (если есть хотя бы одна нить этого класса — работает она), класс разделения времени и класс idle (получает процессор только если два предыдущих класса пустые, то есть в них нет нитей, готовых к исполнению).

На сём пока про шедулер закончим.

Перейдём к собственно подсистеме, которая умеет отнять процессор у одной нити и отдать его другой.
Читать полностью »

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

Мы все хорошо знаем о том, что для эффективной работы нужно фокусироваться на чем-то одном и изо всех сил избегать многозадачности. И тем не менее, каким-то образом мы забываем об этом, ужиная перед экраном телевизора с открытым ноутбуком на коленях. Мы пишем письма, просматриваем ленты новостей, заглядываем в Facebook и Twitter, общаемся в чатах – все это одновременно с выполнением нашей главной задачи. И несмотря ни на что в глубине души своей мы убеждены, что способны справиться со всем этим ворохом многозадачности без вреда для нашей продуктивности, ну, или, пожалуй, с минимальными ее потерями.

Мифы о многозадачности, или Как наш мозг на неё реагирует - 1

Недавно я начала свой новый рабочий проект, который направлен на однозадачность. Результаты моей же работы в режиме «не все сразу» меня просто поразили, именно поэтому я решила углубиться в изучение этого вопроса. Мне было интересно понять, что творится в наших головах и получить ответ на давно волнующий меня вопрос:

Почему мы вообще беремся за несколько дел одновременно? Почему мы вырабатываем у себя привычку хвататься за все сразу?
Читать полностью »

Скажите «нет» многозадачности - 1

Развитие технологий вовсе не сделало нас более свободными, не дало нам больше времени для саморазвития. Нет, мы работаем столько же (если не больше), просто эффективнее. И одним из следствий прогресса стало такое явление, как мультизадачность. Многочисленные гаджеты, всемирная сеть, онлайн-сервисы — всё это провоцирует выполнять нескольких дел одновременно. К тому подталкивает и сложившееся в нашей культуре представление об эффективности работников. Но это является и одной из фундаментальных ошибок, поскольку наши мозг и сознание по своей архитектуре не годятся для мультизадачности.
Читать полностью »

multitaskingЗа всеми неотложными делами и проблемами, нам зачастую не хватает времени на чтение книг. Статья в журнале, пост в блоге занимают не так много нашего времени, и иногда приносят не меньшую пользу.

С недавнего времени я научился выделять время для чтения, но к сожалению, не столько чтобы за один подход прочесть достаточно объемную книгу. Поэтому я озадачился конспектированием прочитанного материала на ходу. Спасибо современным технологиям, это ни капельки не трудно. Во время чтения со смарта переключаться на OneNote и делать заметки, что может быть легче?
Читать полностью »

image

Если в течение дня вам приходится распылять свое внимание, приведенные советы по повышению производительности позволят вам сохранить контроль над своим рабочим временем.Читать полностью »

image

Что заставляет отвлекаться от работы? Вот небольшая статья о том, как избавиться от интернет-зависимости и многозадачности. Читать полностью »

Медленный процессор и маленький объем ОЗУ — это еще не значит, что на такой платформе нельзя реализовать вытесняющую многозадачность. Более того, главный смысл организации многозадачной среды — это эффективное использование процессорного времени, чтобы процессор не простаивал, пока одни программы ждут какого-либо события, а использовался другими программами. Даже на таких платформах, как ZX Spectrum (Z80 3.5МГц, 48-128кБ ОЗУ), или 8-битные микроконтроллеры AVR, организация вытесняющей многозадачности имеет большой смысл.

Предлагаю вашему вниманию собственную реализацию многозадачного диспетчера на ассемблере Z80 (ZX Spectrum), который не является частью какой-либо ОС, а может использоваться отдельно. В нем нет ничего лишнего — только организация исполнения потоков и синхронизации между ними. Диспетчер можно использовать как составную часть программного проекта, как основу для создания более серьезного диспетчера для ОС, или как обучающий материал.
Читать полностью »

В своей предыдущей статье я затронул тему грамотной реализации потоков в Qt и предложил свой вариант. В комментариях мне подсказали более верное направление. Попробовал сделать — получилось и вправду легко и красиво! Я хотел было исправить старую статью, но Хабр повис — и все потерялось. В итоге я решил написать новую версию.
Читать полностью »

Всем хабрапривет!
Как-то понадобилось мне в Qt 5.1.1 для WinXP в VS2009 реализовать многопоточное приложение с интенсивным обменом сигналами. Взял я Шлее, вычитал у него, что нужно унаследовать класс от QThread и — вуаля, велком в многопоточность! На всякий случай заглянул в документацию Qt — там никто не возражал против наследования от QThread своего класса. Ну что же — порядок, сделано! Запускаю — вроде как работает, но как-то не так… Начинаю в режиме отладки отслеживать — а там творится черт знает что! То сигналы не выходят, то выходят, но как-то криво и из другого потока. Одним словом, полный бардак! Пришлось основательно по-google-ить и разобраться в теме (мне помогли статьи тут, здесь и там). В итоге я сделал шаблон класса на С++ (вернее, целую иерархию оных), что мне позволило в итоге писать (относительно) небольшой код класса, живущего в другом потоке, который работает правильно и стабильно.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js