2012-11-19 1 views
0

여러 개의 사용자 모드 스레드를 생성 한 실행중인 프로세스가 있습니다. 커널이 프로세스 상태를 TASK_UNINTERRUPTIBLE (또는 TASK_INTERRUPTIBLE)으로 변경하면 프로세스에서 생성 된 스레드가 자동으로 일시 중단됩니까?TASK_UNINTERRUPTIBLE 및 C 커널을 사용하여 Linux 커널 개발 스레드 처리

이것은 숙제 문제가 아닙니다. 세마포어 구현 방법을 설명하는 운영 체제 책을 읽었습니다. 구현시 세마포어 구조체는 현재 세마포어를 기다리고있는 프로세스의 링크 된 목록을 유지 관리합니다. 지금까지 배운 것을 보면, 그러한 세마포어는 스레드가 아닌 프로세스를 동기화하는 데에만 사용될 수 있습니다. 옳은? 연결된 목록의 스레드는 세마포어를 사용할 수있을 때까지 TASK_INTERRUPTIBLE 상태가됩니다.이 상태에서 하나의 프로세스가 상태를 TASK_RUNNING으로 설정하여 깨우면됩니다.

답변

3

리눅스에서 각 스레드는 프로세스 범위 내에서 실행되는 별도의 task입니다. /proc/self/task/을 참조하십시오. 심지어 새로운 프로세스와 동일한 커널 기능으로 만들어집니다. Linux의 스레드는 "경량 프로세스"로 시작되었습니다. 각 작업에는 프로세스 ID (pid)와 비슷한 고유 작업 ID (tid)가 있으며 실제로는 pid과 동일한 tid이라는 마스터 스레드 (주() 실행 주체)가 있습니다.

스레드와 프로세스 간의 리눅스의 유일한 기능적인 차이는 모든 스레드 (작업)

  • 스택
  • 업무 ID (TASK_UNINTERRUPTIBLETASK_INTERRUPTIBLE 포함)

    • 스케줄링 매개 변수에서 떨어져 모든 프로세스 자원을 공유한다는 것입니다
    • 스레드는 프로세스를 식별합니다.

    그래서 TASK_INTERRUPTIBLE은 각 스레드에 개별적으로 적용될 수 있습니다.

    이러한 세마포어는 스레드 동기화에 완벽하게 유효합니다. 이 경우 하나의 스레드가 세마포어를 차단하면 이는 해당 스레드입니다.

  • +0

    이제는 의미가 있습니다. 이 책의 구현에서 링크 된 프로세스 목록은 프로세스와 스레드를 설명하는 task_struct의 연결된 목록 일 것입니다. 나는 그들이 그것을 더 분명하게 만들었 으면 좋겠다. 감사. –