在内核中使用bit-map算法,并不是用来处理大数据,其中的一种应用就是任务优先调度,将任务的优先级用bit位来表示,假如设置优先级位32个(0-31),
则内核会从最高优先级0开始执行任务(TASK),当优先级为0的所有任务执行完后再执行优先级1的,以此依次执行下去(还可在优先级的基础上加入时间片)。
对于每个任务优先级,可以使用链表将该优先级的所有任务(TASK)都放在链表指针上,执行时从链表头开始读取每一个任务(TASK)进行执行。
下面是代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define SZLONG_SIZE 5
#define SZLONG_MASK 31UL
#define __BIT_SET_N(n) (0x1<<(n&SZLONG_MASK))
void set_bit(void *base, unsigned long nr)
{
unsigned long *m;
unsigned long mask;
m = (unsigned long *)base + (nr >> SZLONG_SIZE);
mask = __BIT_SET_N(nr);
*m = *m |mask;
}
void clear_bit(void *base, unsigned long nr)
{
unsigned long *m;
unsigned long mask;
m = (unsigned long *)base + (nr >> SZLONG_SIZE);
mask = __BIT_SET_N(nr);
mask = ~mask;
*m = *m&mask;
}
int main()
{
unsigned long value = 0;
set_bit(&value, 0);
set_bit(&value, 30);
printf("0x%08x\n", value);
clear_bit(&value, 0);
clear_bit(&value, 30);
printf("0x%08x\n", value);
return 0;
}
下面是执行结果: