필자는 특정 조건이 충족 될 때까지 쓰기 작업이 실행되지 않도록해야하는 sysfs
인터페이스를 가지고 있습니다.작업 예약 금지
차단 해제의 조건은 같은 형식으로되어 있기 때문에 조건의 성격, 내가 schedule_timeout
가 사용할 수있는 권리 메커니즘 생각하지 않는다의
if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
// Unblock task and let it run again
}
; 또는 적어도, 나는 그것을 사용하는 방법을 알아 내지 못한 다음 대기 시간을 취소/적절하게 프로세스 신호.
내가 수동으로하여sysfs
쓰기에 다음과 같은 일을 시도
: 조건이 충족 될 때 다음
...
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
...
과 :
if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
set_task_state(tsk, TASK_RUNNING);
}
이 결과 : BUG: scheduling while atomic: dummyThread/2622/0x00000002
을 감안할 때, 어떻게 schedule_timeout
거의 같은 로직이 나올 수도 있습니다. 같은 오류가 발생할 수도 있습니다. BUG: scheduling while atomic: ...
erro 아르 자형.
또한 deactivate_task
및 activate_task
메서드를 시도했지만 스케줄러의 pick_next_task
체인에서 커널 패닉이 발생합니다. 필요한 경우, 이것을 다시 구현하고 스택 추적을 게시합니다.
특정 조건이 충족 될 때까지 작업이 실행되지 않도록하는 올바른 방법은 무엇입니까?
어쩌면 어리석은 질문 일지 모르지만 내가 이해하는 것으로부터 사용자 공간 프로세스가 쓰기를 시도하면 허용하기 전에 다시 쓸 수 없어야합니다. 그렇다면 왜 write 메소드에서 I/O를 차단하지 않을까요? 그런 식으로 조건이 충족 될 때까지 작가를 차단하거나 데이터를 사용할 수 있습니다. O_NONBLOCK이 지정되어 있지 않으면 I/O 작업 (쓰기)이 이미 차단되었음을 알고 작업 상태를 수동으로 변경하는 것이 약간 이상한 것 같습니다. 그러면 간단한 세마포가 작동할까요? –
동의합니다. 그것은 간단해야합니다. 그러나 세마포어를 획득하면 결과적으로 결국'schedule()'을 호출하게되고, 나의 경우에는'BUG : atomic while : scheduling ... '이 발생합니다. –