OSDev http://osdev.su/ |
|
Реализация многозадачности/многопоточности http://osdev.su/viewtopic.php?f=6&t=778 |
Страница 16 из 16 |
Автор: | phantom-84 [ 03 сен 2013, 21:07 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
maisvendoo писал(а): Кстати - офигенная идея запуска процесса в его же контексте. Ни прерывания выключать не надо, ни планировщик останавливать. Задача запускает сама себя В никсах изначально присутствовала эта фишка, причем использовалась явно. Но форк на меня нагонял большую тоску. Поэтому я сделал гибридный вариант, которым весьма доволен. Я дошел до этого сам, хотя конечно это весьма распространенное решение.
|
Автор: | phantom-84 [ 07 сен 2013, 20:48 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
maisvendoo писал(а): Решил перенести это обсуждение сюда - сабж непосредственно связан с темой ветки Я имел в виду что-то типа этого:phantom-84 писал(а): В классическом мьютексе используется ожидание при доступе к занятому объекту/структуре. Не хотите использовать ожидание, попробуйте хотя бы вместо простого зацикливания дополнительно делать SwitchToNext Вот попробовал принудительно переключаться... Код: @@: Т.е. цикл нужно оставить, т.к. блокировка может сохраняться (или даже завершаться и выполняться повторно) во время полного обхода очереди выполнения. Мы лишь избавляемся от зацикливания, на котором время тратится впустую.mov eax,1 xchg eax,[ebx] and eax,eax jz @f call SwitchToNext jmp @b @@: Код: and %edx, %eax Здесь test - лишняя инструкция.test %eax, %eax jnz sync_msg Цитата: Кроме того, сделал на основе атомарной операции остановку/запуск планировщика... Не увидел существенных отличий от того, что было.
|
Автор: | phantom-84 [ 10 сен 2013, 13:47 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
maisvendoo писал(а): Написал драйвер клавиатуры уровня ring 3... У меня можно событийные пакеты рассылать непосредственно из первичных обработчиков.Код: /* Fill keyboard ring buffer */ Если использовать размер очереди, кратный степени двойки, то можно "сворачивать" буфер AND'ом. Я использую это в том числе и для событийной очереди.if (kb_tail >= KEY_BUFFER_SIZE) { kb_tail = 0; } kb_tail++; Не увидел обработки переполнения буфера. Код: /* Set and reset bit 7 by keyboard control register */ Не понял, что это.ctrl = inb(KBD_CTRL_REG); ctrl |= 0x80; outb(KBD_CTRL_REG, ctrl); ctrl &= 0x7F; outb(KBD_CTRL_REG, ctrl); Цитата: Драйвер читает содержимое буфера клавиатуры системным вызовом key_scan() и посылает находящемуся в фокусе ввода приложению сообщение с этим скан-кодом - системный вызов msg_send(...). Нужно выполнять трансляцию сканкода непосредственно в первичном обработчике или отправлять вместе с ним состояние "сдвиговых" клавиш и индикаторов. Я использую смешанный подход: сканкод транслирую в уникальный виртуальный код клавиши (в виртуальный код могут складываться несколько сканкодов, т.е. для префиксов используется предбуфер), вместе с которым отправляю shift-статус и led-статус для дальнейшей "высокоуровневой" трансляции.
|
Автор: | maisvendoo [ 10 сен 2013, 14:03 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
phantom-84 писал(а): Не понял, что это. Гхм, у Зубкова прочитал что Цитата: обработчик аппаратного прерывания клавиатуры должен установить бит 7 порта 61h, а затем вернуть его в исходное состояние Собственно и проделал это |
Автор: | phantom-84 [ 10 сен 2013, 14:28 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
Это древность. Нынче к клаве относятся только 60h и 64h. |
Автор: | maisvendoo [ 10 сен 2013, 15:04 ] |
Заголовок сообщения: | Re: Реализация многозадачности/многопоточности |
phantom-84 писал(а): Это древность. Нынче к клаве относятся только 60h и 64h. То-то я думаю почему установленный бит при считывании пропадает . Книжка 2004 года издания, и это третье издание, стереотипное |
Страница 16 из 16 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |