시스템 호출이 중단될 수 있나요?

시스템 호출이 중단될 수 있나요?

다음 문장에 대해 의견을 보내주세요.

rt 패치가 없는 표준 Linux 커널에서는 인터럽트가 진행 중인 시스템 호출을 중단할 수 없습니다. 하드 드라이브에서 데이터를 가져올 때 기계가 작동을 멈추지 않는 이유는 해당 작업에 사용하는 시스템 호출이 차단되기 때문입니다. 차단은 하드 드라이브에 요청한 후 프로세스 상태를 차단됨으로 변경하고 자발적으로 프로세서 시간을 포기하는 것을 의미합니다. 비실시간 커널에서 진행 중인 시스템 호출을 중단할 수 없습니다.

이것은 주제에 대한 나의 이해이지만 그것이 올바른지 확실하지 않습니다.

답변1

다음을 사용하여 시스템 호출을 중단할 수 있습니다.신호SIGINT, ( CTRL+ 에 의해 생성됨 C) SIGHUP등과 같은 PID를 통해서만 시스템 호출과 상호 작용하여 시스템 호출을 중단할 수 있지만 Unix 신호 및 명령을 사용할 때는 그렇지 않습니다 kill.

rt_patch 및 시스템 호출

@Alan은 다음과 같은 후속 질문을 했습니다.

메인라인 Linux 커널에서 rt_patch를 수용하는 것과 직접적으로 관련된 시스템 호출을 중단할 가능성이 있습니까?

내 대답:

그렇게 생각해요. 이 질문을 조사하는 동안 나는 당신이 이것을 할 수 있다/할 수 없다는 결정적인 증거를 찾을 수 없었고, 이로 인해 나는 당신이 할 수 있다고 믿게 되었습니다.

제가 그렇게 생각하게 만드는 또 다른 데이터 포인트는 잠재적으로신호프로세스와 상호 작용하려면 Unix에 내장된 메커니즘이 필요합니다. 이러한 패치가 적용된 시스템을 사용하지 않고 어떻게 실행할 수 있는지 이해할 수 없습니다.신호.

그런데 신호는 프로세스 수준에서 작동합니다. 내가 아는 한, 시스템 호출에 인터럽트를 직접 삽입하는 메서드/API는 없습니다.

인용하다

답변2

물론, 적절한 스핀록을 사용하지 않거나 인터럽트가 비활성화되지 않는 한 인터럽트는 시스템 호출을 인터럽트할 수 있습니다.

  • spin_lock_irq*()스핀락을 획득하고 하드웨어 인터럽트(소프트웨어 인터럽트 및 작업 처리 포함)를 비활성화합니다.
  • spin_lock_bh()스핀 잠금을 획득하고 소프트웨어 인터럽트 및 마이크로스레딩을 비활성화합니다.
  • irq_disable()하드웨어 인터럽트를 비활성화합니다.
  • local_bh_disable()소프트웨어 인터럽트 및 마이크로스레딩을 비활성화합니다.
  • preempt_disable()선점을 비활성화하면 위의 사항도 선점을 비활성화합니다.

이제 비선점형 커널에서는 작업이 커널 모드의 다른 작업을 선점할 수 없습니다. 따라서 작업 A가 유일한 CPU에서 과도한 시스템 호출을 수행하고 작업 B가 오디오 장치에 일부 데이터를 써야 하는 경우 작업 B는 작업 A가 시스템 호출을 마칠 때까지 기다려야 할 수 있으며 이로 인해 클릭 한 번으로 오디오가 끊길 수 있습니다. 목소리. 이러한 상황에는 선점형 커널이 적합합니다.

관련 정보