커 널 스 레 드 생 성,사용,종료 및 지연 매크로 에 대한 추가 설명

2919 단어 커 널 스 레 드
관련 함수:
kthread_create():커 널 스 레 드

struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...);  kernel thread kernel_thread , daemonize init , completion 。 , kthread_create。
스 레 드 를 만 든 후 바로 실행 되 지 않 고 kthread 를create()돌아 오 는 taskstruct 포인터 wakeup_process(),그리고 이 함 수 를 통 해 스 레 드 를 실행 합 니 다. 
kthread_run():스 레 드 를 만 들 고 시작 하 는 함수 입 니 다.

struct task_struct *kthread_run(int (*threadfn)(void *data),void *data,const char *namefmt, ...); , kthread_create() wake_up_process() 。
그것 은 실제로 매크로 입 니 다.kthreadcreate()와 wakeup_process()구성.4567913) kthread_stop():스 레 드 에 신 호 를 보 내 서 종료 합 니 다.

#define kthread_run(threadfn, data, namefmt, ...)                     /

({                                                            /

    struct task_struct *__k                                        /

           = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); /

    if (!IS_ERR(__k))                                        /

           wake_up_process(__k);                                /

    __k;                                                     /

})

스 레 드 가 시작 되면 이 스 레 드 가 자발적으로 do 를 호출 하지 않 는 한 계속 실 행 됩 니 다.exit 함수 또는 다른 프로 세 스 호출 kthreadstop 함수,라인 의 운행 을 끝 냅 니 다.그러나 스 레 드 함수 가 매우 중요 한 임 무 를 처리 하고 있다 면 중단 되 지 않 을 것 입 니 다.물론 스 레 드 함수 가 영원히 돌아 오지 않 고 신 호 를 검사 하지 않 으 면 영원히 멈 추 지 않 을 것 입 니 다.
동시에,kthread 호출stop 함수 시 스 레 드 함수 가 실행 이 끝 났 을 수 없습니다.그렇지 않 으 면 kthreadstop 함 수 는 계속 기다 릴 것 입 니 다.
 
커 널 스 레 드 일반 프레임 워 크
int threadfunc(void *data){
        …
        while(1){
               set_current_state(TASK_UNINTERRUPTIBLE);
               if(kthread_should_stop()) break;
               if(){/조건 은 진짜
                      //업무 처 리 를 하 다
               }
               else{/조건 은 가짜
                      //CPU 가 다른 라인 을 실행 하도록 내 보 내 고 지 정 된 시간 내 에 다시 스케줄 링 됨
                      schedule_timeout(HZ);
               }
        }
        …
        return 0;
}
 
스 레 드 관련 테스트 명령
top 명령 을 사용 하여 스 레 드(커 널 스 레 드 포함)의 CPU 이 용 률 을 볼 수 있 습 니 다.명령 은 다음 과 같 습 니 다.
top Cp 스 레 드 번호
다음 명령 을 사용 하여 스 레 드 번 호 를 찾 을 수 있 습 니 다:
ps aux|grep 스 레 드 이름
 
예제 프로그램:모듈 을 사용 하여 커 널 스 레 드 를 불 러 오고 1s 마다 커 널 에 문 자 를 인쇄 합 니 다.
(Makefile 생략,이전 박문 과 같은 문법.)

int kthread_stop(struct task_struct *thread);
보충 설명:
이 지연 매크로 는 일부 상황 에서 커 널 스 레 드 CPU 의 점용 률 이 너무 높 은 상황 을 초래 할 수 있다.대 scheduletimeout()소스 코드 에 대한 분석 은 주기 적 으로 스 레 드 를 TASK 로 만 듭 니 다.RUNNING 상태 에서 이 라인 은 진정한 수면 을 취하 지 않 았 다.해결 방법:while 순환 의 시작 부분 에 set 추가current_state(TASK_INTERRUPTIBLE)이면 됩 니 다.

좋은 웹페이지 즐겨찾기