대기열의 일반적인 사용 예는 인터럽트입니다. 아마도 커널 드라이버가 세 가지 조건을 기다리고있을 것입니다. 각각의 상황은 인터럽트로 인해 깨우쳐 질 것입니다.
이렇게하면 커널 인터럽트 처리기가 모든 청취자를 깨우고 특정 조건이 발생했는지 또는 깨어 있어야 하는지를 스스로 결정할 수 있습니다.
또한 인터럽트를 공유 할 수 있고 인터럽트가 지연되어 병합되기 때문에 가짜 인터럽트를 얻을 수 있습니다.
일부 코드를 추가하면 더 명확하게하려고하지 않을 수 있습니다.
커널 드라이버에 포함될 수있는 코드를 아래에 작성했습니다. 인터럽트 처리기는 모든 리스너를 깨울뿐입니다. 그러나 모든 청취자가 실제로 수행 될 수있는 것은 아닙니다. 둘 다 똑같은 인터럽트에 의해 깨우쳐 질 것이나, 계속하기 전에 그들의 특별한 상태가 끝났는지보기 위해 둘 다 보일 것이다.
// Registered interrupt handler
static irqreturn_t interrupt_handler(void *private) {
struct device_handle *handle = private;
wake_up_all(&handle->wait);
}
// Some Kernel Thread
void program_a(struct device_handle * handle) {
wait_event_interruptible(&handle->wait, hardware_register & 0x1);
printk("program_a finished\n");
}
// Some other kernel thread
void program_b(struct device_handle * handle) {
wait_event_interruptible(&handle->wait, hardware_register & 0x2);
printk("program_b finished\n");
}
드라이버가 여러 조건에서 대기 할 수 있습니까?처음 대기 때문에 프로세스가 일시 중단되면 다른 프로세스는 실행할 수 없습니까? 그래서 나는 하나의 기다림이있을 수 있다고 생각합니까? – Chethan
몇 가지 코드를 추가했습니다. 그러나 커널 모듈은 한 시점에서 여러 스레드를 실행할 수 있습니다. –