Linux 커널은 인터럽트 처리 중에 어떤 프로세스를 깨울지 어떻게 파악합니까?

Linux 커널은 인터럽트 처리 중에 어떤 프로세스를 깨울지 어떻게 파악합니까?

나는 책을 읽고 있습니다리눅스 커널 개발이전 장프로세스 스케줄링. 61페이지, 일부일어서다, 첫 번째 단락은 다음과 같습니다.

깨우기는 wake_up()을 통해 처리됩니다.모두지정된 대기 큐에서 대기 중인 작업입니다.그것(1분기:이것은 무엇을 it의미 하는가? )는 작업의 (2분기:어떤 임무인가요? 모든 깨우기 작업이요?) 상태가 TASK_RUNNING이면 enqueue_task()를 호출하여 레드-블랙 트리에 작업을 추가하고, wake-up 작업의 우선순위가 현재 작업의 우선순위보다 높은 경우 need_resched가 설정됩니다. 이벤트가 발생하도록 하는 코드는 일반적으로 wake_up() 자체를 호출합니다. 예를 들어, 하드 디스크에서 데이터가 도착하면 VFS는 데이터를 기다리는 프로세스를 보유하는 대기 큐에서 wake_up()을 호출합니다.

저는 위의 상황에 대해 매우 혼란스럽습니다. 데이터를 읽은 후 디스크가 중단되었지만 더 완전한 그림이 있는 이전 단락의 예를 사용하겠습니다. 아래에 오류나 불완전한 부분이 있으면 정정해 주시기 바랍니다.

  1. 일부 사용자 프로세스는 차단 읽기 작업을 실행하여 시스템 호출을 트리거하며 해당 프로세스는 커널 영역에 있습니다.

  2. 커널은 필요한 데이터를 요청하도록 디스크 컨트롤러를 설정하고 프로세스를 절전 모드로 전환합니다(프로세스는 대기 대기열에 배치됩니다). 커널은 실행할 다른 프로세스를 예약합니다.

  3. 디스크 인터럽트가 발생했습니다. CPU는 현재 실행 중인 프로세스를 일시 중지하고 디스크 인터럽트 처리로 점프합니다.

  4. 디스크 컨트롤러는 인터럽트 처리 중에 시작되고 디스크에서 읽은 데이터를 주 메모리로 전송합니다(CPU의 지시에 따라 또는 DMA를 통해).

  5. (확실하지 않습니다. 정정해 주십시오.) 단락에서 알 수 있듯이 VFS는 데이터를 기다리는 프로세스를 보유하는 대기 큐에서 wake_up()을 호출합니다.

내 구체적인 질문은 다음과 같습니다.

1분기(인용된 구절 참조): 아마도그것두 번째 문장은 함수를 나타냅니다 wake_up(). 기능이 wake_up깨어나 는 이유는 무엇입니까?모두해당 디스크의 데이터를 기다리는 작업이 아닌 작업?

2분기(인용된 구절 참조): try_to_wake_up()특정 작업의 상태를 TASK_RUNNING으로 설정해야 한다는 것이 어떻게든 알려져 있습니까? 아니면 try_to_wake_up()모든 wake-up 작업의 상태를 TASK_RUNNING으로 설정하시겠습니까?

3분기:커널이 관리해야 하는 대기 대기열은 몇 개입니까? 대기 대기열이 2개 이상인 경우 디스크 데이터를 기다리는 프로세스가 해당 대기 대기열에 있도록 어떤 대기열을 선택할지 커널이 어떻게 알 수 있습니까?

4 분기: 이제 대기 프로세스가 있는 큐를 알고 있다고 가정합니다. 커널은 어떤 프로세스가 디스크에서 데이터를 기다리고 있는지 어떻게 알 수 있습니까? 디스크 데이터를 요청하는 프로세스와 관련된 일부 정보(예: 프로세스의 PID, 메모리 주소 등)가 디스크 컨트롤러로 전달된다는 것을 상상할 수 있습니다. 그런 다음 인터럽트 처리가 완료된 후 디스크 컨트롤러(또는 커널?)는 이 정보를 사용하여 대기 대기열에 있는 프로세스를 찾습니다.

제가 깨어남 과정의 그림을 완성할 수 있도록 도와주세요! 감사해요!

답변1

Q1: "그것"은 입니다 wake_up. 모든 작업을 깨워줍니다디스크 데이터를 기다리는 중. 해당 데이터를 기다리지 않았다면 해당 대기열에서 기다리지 않았을 것입니다.

Q2: 질문을 이해했는지 잘 모르겠습니다. 각 깨우기 대기열 항목에는 작업에 대한 포인터가 포함되어 있습니다. try_to_wake_up깨어나야 하는 작업에 대한 포인터를 받습니다. 함수당 한 번씩 호출됩니다.

Q3: 줄을 서서 기다리는 사람들이 많아요. 가능한 모든 이벤트에 대해 하나가 있습니다. 디스크 드라이버는 각 디스크 요청에 대해 대기 대기열을 설정합니다. 예를 들어, 파일 시스템 드라이버가 특정 디스크 블록의 내용을 원할 때 디스크 드라이버에 블록을 요청하고 요청은 파일 시스템 요청을 발행한 작업으로 시작됩니다. 동일한 블록에 대한 다른 요청이 들어오고 해당 블록이 아직 처리되지 않은 경우 다른 항목이 대기 대기열에 추가될 수 있습니다.

인터럽트가 발생하면 디스크 드라이버는 하드웨어에서 전달된 정보를 기반으로 어떤 디스크에 사용 가능한 데이터가 있는지 확인하고 해당 디스크에 대한 커널 데이터가 포함된 데이터 구조를 조회하여 어떤 요청을 충족해야 하는지 찾습니다. 이 데이터 구조 내에는 무엇보다도 데이터가 기록될 위치와 다음에 수행할 작업을 나타내는 해당 웨이크업 큐가 있습니다.

Q4: 프로세스가 파일 읽기와 같은 시스템 호출을 수행합니다. 이는 디스크에서 데이터를 로드해야 하는지 결정하는 파일 시스템 드라이버의 일부 코드를 트리거합니다. 이 코드는 디스크 드라이버에 요청을 하고 호출 프로세스를 요청의 대기 대기열에 추가합니다. (실제로는 더 많은 레이어가 있지만 이해가 되실 것입니다.) 디스크 읽기가 완료되면 대기 큐 이벤트가 발생하고 프로세스가 디스크의 대기 큐에서 제거됩니다. 대기열 이벤트가 발생하기를 기다리는 코드는 파일 시스템 드라이버가 제공하는 함수로, 데이터를 프로세스의 메모리에 복사하고 시스템 read호출이 반환되도록 합니다.

답변2

Gilles의 답변을 바탕으로

2분기:잘 모르겠지만 책의 내용을 인터럽트 핸들러 호출로 해석하겠습니다.wake_up() 한 번 (큐 식별자를 매개 변수로 전달) 해당 큐의 각 프로세스를 wake_up() 호출합니다 . try_to_wake_up()(이것은 Giles의 답변을 반복합니다.1분기: 모든 작업을 깨우지는 않고 호출된 이벤트와 관련된 대기 대기열에 있는 작업만 깨웁니다 wake_up(). )

3분기: 모든 대기 큐는 일부 커널 코드(주로 장치 드라이버뿐만 아니라 다른 코드)에 의해 "소유"됩니다. 큐를 소유하는 루틴은 큐가 속한 이벤트의 고유한 특성을 기반으로 고유 식별자를 할당합니다. 드라이버/기타 모듈이 프로세스를 절전 모드로 전환할 때 프로세스를 어느 대기열에 넣어야 하는지를 ID별로 지정합니다. 호출된 루틴 wake_up()(일반적으로 인터럽트 핸들러)은 프로세스를 절전 모드로 전환하는 동일한 모듈의 일부여야 하므로 발생한 이벤트에 해당하는 대기열의 식별자를 알 수 있습니다.

내가 마지막으로 Unix 커널 소스 코드를 살펴봤을 때(수년 전) 디스크 드라이버는 각 I/O 요청에 대해 다른 이벤트 ID를 가졌습니다. Gilles가 말했듯이 여러 프로세스가 동시에 동일한 파일을 읽는 경우 동일한 이벤트를 기다리고 있을 수 있습니다. (물론 이것도 관련이 있습니다.1분기.)

4 분기: 저는 '디스크 컨트롤러'라는 말을 들으면 하드웨어를 떠올립니다. 하지만 그 외에는 디스크가 맞습니다.운전사 (커널의 소프트웨어 모듈)은 (적어도 잠재적으로) 액세스할 수 있습니다.모두이를 호출하는 프로세스에 대한 정보(예: 디스크 I/O 수행) 따라서 디스크 드라이버가 완료하는 데 시간이 걸리는 물리적 I/O 시작으로 인해 프로세스를 절전 모드로 전환하면 디스크 드라이버(드라이버)는 "프로세스의 PID, 메모리 주소 또는 기타 항목"을 대기 대기열에 넣습니다. 이것이 무엇이든 try_to_wake_up()프로세스를 깨우는 것만으로도 충분합니다 .


인용한 단락의 마지막 문장은 "...VFS가 대기 대기열에서 wake_up()을 호출합니다..."입니다. 이것이 실제로 정확한지 궁금합니다. 파일 시스템 코드는 디스크 드라이버 위의 계층입니다. 인터럽트(디스크 하드웨어에서 CPU로 전달되는 신호)가 디스크 인터럽트 핸들러(디스크 드라이버의 일부)에 의해 처리되어 대기 중인 프로세스를 깨우기를 원합니다 wake_up(). 그러면 드라이버가 파일 시스템 코드를 깨울 것입니다. (이 용어는 부정확할 수도 있습니다. 파일 시스템 코드가 처리를 재개할 수 있도록 드라이버가 무언가를 한다고 말하는 것이 더 나을 것입니다.) 그러면 파일 시스템 코드는 사용자 프로세스로 돌아가거나 디스크 드라이버를 다시 호출할 수 있습니다. , 프로세스가 다시 절전 모드로 전환됩니다.

네 번째 단계에 문제가 있습니다. 장치가 DMA를 사용하는 경우 데이터 전송이 완료될 때까지 중단이 없습니다.

답변3

네가 말한 문제, 일어나모두대기 프로세스는 "thundering herd" 문제로 알려져 있습니다. 리소스를 사용할 수 있게 되면 많은 프로세스가 깨어나고 어떤 프로세스가 리소스에 독점적으로 액세스하는지 확인하기 위해 경쟁하고 나머지 프로세스는 다시 절전 모드로 전환됩니다. 이는 프로세서가 많을 때 문제가 되므로 여기서 경쟁하는 프로세서가 많습니다. 최신 버전의 Linux에서는 대기 프로세스를 깨워 이 문제를 해결합니다.

대부분의 경우 특정 이벤트를 기다리는 하나(또는 여러 개의) 프로세스가 있습니다(프로세스가 기다릴 수 있는 이벤트 수는 고정되어 있지 않으며 소수는 말할 것도 없습니다).

Giles의 답변은 귀하의 요점을 자세히 설명하며 여기에 추가할 내용이 많지 않습니다.

관련 정보