2012-05-13 4 views
2

리눅스 스케줄러에 뭔가 쓰고 있는데 인터럽트가 오기 전에 어떤 프로세스가 실행되고 있었는지 알아야합니다 .. 현재 사용 가능한 구조입니까? 인터럽트 처리기에서 current-> pid를 수행하면 중단 된 프로세스의 PID를 가져올 수 있습니까?인터럽트 중에 current-> pid를 얻습니다.

답변

3

current->pid이 존재하며 중단 된 프로세스입니다 (유휴 상태의 스레드이거나 다른 스레드 일 수 있음).

Linux 스케줄러 내부에 작성하는 경우 매우주의해야합니다. current은 실행할 새 프로세스를 선택할 때 스케줄러에 의해 변경되므로 해당 값은 사용자가 정확히 읽은 시점에 따라 다릅니다.

+0

* current *는 % esp의 하위 비트 만 마스크합니다. 맞습니까? 그리고 리눅스에는 인터럽트 스택이라는 것이 있습니다. 인터럽트가 다른 스택으로 전환하고 % esp를 마스크하면, 유효한 struct task_info 근처에 아무 것도 없습니다. IOW task_info는 스택의 일부이므로 인터럽트 스택에서는 찾을 수 없습니다. 나는 뭔가를 놓친거야? – moorray

+2

@mooray,'current'가 작동합니다. 'current '는 먼저'thread_info' (x86에서는 % esp를 마스킹함으로써)를 얻습니다. 거기서'task_struct'에 대한 포인터를 찾습니다. 인터럽트 스택으로 전환 할 때,'do_IRQ'는 프로세스의 커널 스택에 따라이 포인터를 설정합니다. – ugoren

+0

아 ... 설명해 주셔서 감사합니다.) – moorray

0

현재은 프로세스 컨텍스트 외부에서 유효하다고는 기대하지 않습니다. 스케줄러에서 작업중인 경우 실행중인 작업에 포인터가 저장되는 위치를 파악할 수 있습니다 (예 : struct cfs_rq.