Re: быстрая вставка в очередь

From
Oleg I. Khovayko ()
To
Dmitri Khanevski ()
Date
2003-03-07T00:07:46Z
Area
RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>


Dmitri Khanevski wrote:
> 
> Количество элементов поpядка нескольких сотен.
> 

Допустим, у тебе к таймеру стоит не одна очередь,
а 32 паралельных очереди. В очереди "0" хранятся
заявки на события, которые должны быть выполнены
в нулевой, 32-й, 64-й и т.д. тик. 
В первой очереди - события, которые должны быть 
выполнены в первый, 33-й, 65-й тик, и так далее.

Процессор таймера имеет список из 32-х голов очередей,
и бегает по кругу. То есть, обслужив элемент 
из очереди 0, он не ждет времени срабатывания 
след. элемента из той же очереди, а переходит 
к элементу 1, и т.д.

Тогда вставка в коротенькие очереди-списки
не будет отнимать много времени.
А получение номера очереди, и зацикливание счетчика 
списков можно сделать просто битовыми масками.

Конечно, есть нюансы реализации.
Но сделать все же можно, и получится не 
особо сложно.

P.S:
Если пишешь embedded систему, где ты сам можешь
выбрать место под массив из 32-х слов-указателей
на головы очередей, можно применить такой трюк:

Поместить массив голов (считаем, что одна голова - 4 слова) 
с адреса, где младшие 8 битов равны нулю.

cur_ptr = your_addr;

loop:
	PROCESS cur_ptr
	cur_ptr += 4; Go to next word
	cur_ptr &= ~0200 ; cбросили бит, зациклив тем самым pointer
	goto	loop

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

-- 
#include <best/regards.hpp>
Oleg I. KHOVAYKO  
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
 * Origin: National Center for Biotechnology Information (2:5020/400)