2014-11-14 1 views
0

저는 스케줄러에 대해 배우고 있으며 데이터 구조가 어떻게 구성되어 있는지 이해하기 위해 다양한 해킹을하고 있습니다. 이제 스케줄러의 실행 대기열이 어떻게 구성되어 있는지 이해하려고합니다. 그래서 프로세스가 주어지면 실행 대기열을 찾을 수 있다고 생각했습니다. 하지만 모든 실행 대기열을 반복하고 싶습니다. 어떻게해야합니까?시스템의 모든 실행 대기열에 어떻게 액세스합니까?

+0

init_task를 사용하여 실행 큐를 추적 해 보았습니까? –

+0

아니, 어떻게 그럴 수 있니? 추적이란 무엇을 의미합니까? –

+0

리눅스 커널에는 기본적으로 runqueue 링크 목록의 헤더 인 init_task라는 변수 이름이 있습니다. 이 헤더를 사용하여 실행 큐를 탐색하십시오. 또한 어떤 커널 버전을 사용하고 있습니까? –

답변

0

내가 틀렸다고 정정하십시오. 각 프로세서에는 실행중인 프로세스에 대해 하나의 대기열 (이중 연결 목록으로 구성됨) 만 이 있습니다. 그러나 시스템에 더 많은 프로세스가있을 수 있습니다. 한 프로세서에서 하나의 작업을 시작한 다음 스케줄러가 컨텍스트를 전환하거나이 작업을 잠자기 상태로 전환하고 다른 프로세서로 마이그레이션하여 작업을 완료 할 수 있습니다.

프로세서에서 작업을 확인하려면 간단한 커널 모듈에서 for_each 매크로를 사용할 수 있습니다.

+0

당신은 거의 옳다. 실행중인 큐는 두 개있다. 하나는 작동 중이며 다른 하나는 만료 된 작업이다. 어쨌든'for_each'는 무엇을 의미합니까? 그들 중 많은 수가 있습니다. –

+0

예를 들면. 함수 "static int thread (void * data)"에서 https://github.com/0xDen/unptrace/blob/master/unptrace.c를 보면 loop - ** list_for_each ** 매크로를 볼 수 있습니다 작업을 반복하는 데 사용됩니다. – 0xDen

+0

나는 그것에 대해 생각했다. 이 접근 방식은 큐를 실행하지 않고 작업을 제공하며 실행 대기열에 속하지 않은 모든 실행 가능 태스크도 제공합니다. 또한 모듈을 실행할 때 우연히 비어있는 다른 실행 대기열이 있는지 어떻게 알 수 있습니까? –

관련 문제