분류 전체보기340 커널 타이머, 태스크릿, 작업큐 [블로그 통합으로 이전해 온 자료] - 2008. 4. 25. 04:42 in_interrupt() - 프로세스가 인터럽트 문맥에 있는지 검사 true == 0 in_atomic() - 스케줄링 허용 여부 true == 0 h/w, s/w 인터럽트는 물론 spinlock을 쥐고있는 경우에도 해당 * kernel timer - 사용자 영역에 접근해서는 안된다. (copy_*_user류의 함수와 같은..) 프로세스 문맥이 없으므로 특정 프로세스에 관련된 사용자 영역을 가를키는 경로가 없다. - current 포인터를 사용해서는 안된다. - 잠들기나 스케줄링을 수행할 수 없다. schedule_(), wait_event_(), kmalloc(), 세마포어등 사용 금지 struct timer_list ktime.. 2021. 2. 8. 드라이버 코드의 실행 지연 [블로그 통합으로 이전해 온 자료] - 2008. 4. 25. 04:07 * 긴 지연 // 실행 대기 while ( time_before( jiffies, j1 ) ) cpu_relax(); // 스케쥴링 while ( time_before( jiffies, j1 ) ) schedule(); 이벤트를 기다리는 지연일 경우는 대기큐를 사용한 timeout 방법도 있다. wait_event_timeout(); wait_event_interruptible_timeout(); 하지만 이벤트를 사용하지 않는다면 schedule_timeout()을 사용한다. set_current_state( TASK_INTERRUPTIBLE ); schedule_timeout( j1 ); timeout 시간은 jiffies 수가 .. 2021. 2. 8. 커널에서 Blocking I/O [블로그 통합으로 이전해 온 자료] - 1. "원자 문맥에서 수행 중(spinlock, seqlock RUC lock 등..)일 때에는 절대로 잠들어서는 안된다." 2. 인터럽트를 비 활성화 시켰을 때에도 잠들 수 없다. 3. semaphore를 보유한 동안 잠드는것은 이 semaphore를 기다리는 다른 프로세스도 잠들게 한다. (주의!!) 3. 잠들기 전에 기다리던 조건을 정말로 충족하는지 확인해야 한다. 4. 누군가 깨울것이라는 확인 없이 잠들어서는 안된다. 대기 큐 wait_queue_t DECLARE_WAIT_QUEUE_HEAD( wq ); wait_queue_head_t wq; init_waitqueue_head( &wq ); condition 조건이 참 일때까지 잠든다는데.. 그러면 깨운다는.. 2021. 2. 8. 커널에서 condition race 제거 [블로그 통합으로 이전해 온 자료] - 2008. 4. 24. 17:40 * semaphore/mutex * semaphore 변수를 이용해 프로세스의 임계영역 접근을 제어한다. 임계영역에 들어가기 전에 down_*() 함수를 사용해서 semaphore를 잡고 임계영역이 끝나면 up() 함수로 semaphore를 풀어준다. void sema_init( struct semaphore *sem, int val ); DECLARE_MUTEX( name ); DECLARE_MUTEX_LOCKED( name ); void init_MUTEX( struct semaphore *sem ); void init_MUTEX_LOCKED( struct semaphore *sem ); void down( struct sema.. 2021. 2. 8. 이전 1 ··· 3 4 5 6 7 8 9 ··· 85 다음