시스템 호출 중에 프로세스가 종료될 수 있나요?

시스템 호출 중에 프로세스가 종료될 수 있나요?

현재 사용자 공간 프로세스의 컨텍스트에서 커널 모드로 실행되고 있는 매우 시간이 많이 걸리는 시스템 호출이 있다고 가정합니다. 이러한 시스템 호출이 실행되는 동안 시스템 호출은 SIGKILL사용자 프로세스로 전송됩니다. 이 경우 무슨 일이 일어날까요? 프로세스가 즉시 종료됩니까, 아니면 시스템 호출이 끝날 때까지 기다릴까요? 프로세스가 즉시 종료되면 인터럽트 핸들러를 실행하는 동안 사용자 공간 프로세스가 종료되는 경우에도 동일하게 적용됩니다(인터럽트 핸들러는 임의의 사용자 공간 프로세스의 컨텍스트에서 실행될 수 있으므로) 이상하게 들리겠지만 매우 중요합니다. 인터럽트 처리기 작업이 중단될 수 있습니다.

답변1

일부 시스템 호출은 중단될 수 있습니다(예: 참조 siginterrupt(3)). 그렇지 않으면 호출이 사용자 모드로 돌아올 때만 신호가 전달됩니다.

답변2

매우 시간이 많이 걸리는 시스템 호출의 예는 입니다 pause(). 프로세스가 신호를 수신하지 않으면 완료되지 않습니다.

read()직렬 회선에서 읽을 때와 같이 중단 가능(더 나은 용어는 "신호 가능")이거나 블록 장치에서 읽을 때처럼 중단 불가능할 수 있습니다.

왜? 원래 UNIX 논리는 다음과 같습니다. 직렬 회선에서 입력을 사용할 수 있는지 알 수 없습니다. 따라서 아무것도 입력하지 않더라도 시스템 호출을 종료할 수 있는 방법이 있어야 합니다. 반면에 블록 장치에서 읽는 작업은 항상 완료되지만 디스크에 오류가 발생하면 오류가 발생할 수 있습니다.

유닉스는 많이 발전했습니다. 오늘날 무중단 read()은 가능하지만 결코 완전하지는 않습니다. 예: NFS 서버가 다운되고 마운트가 되었을 때 NFS 마운트 파일 시스템에서 읽습니다 hard.

답변3

실제 인터럽트 핸들러는 커널에 위치하며 사용자 프로세스와 실제 연관이 없습니다. 신호 처리기는 사용자 프로세스가 인터럽트 처리기에 가장 가까운 것입니다. 일부 신호는 신호 처리 중에 차단되지만 SIGKILL은 그중 하나가 아니므로 다른 사용자 코드와 마찬가지로 즉시 종료됩니다.

답변4

신호(일반적으로 프로세스 컨텍스트를 복원하는 권한 있는 어셈블리 명령어)는 실행이 사용자 모드로 돌아가고(예: 커널 모드 종료) 프로세스가 실행되도록 예약된 경우에만 전달될 수 있으며, 사용자 모드를 설정할 수도 있고 설정하지 않을 수도 있습니다. 프로세스가 시스템 호출에 있는 경우) - 이는 시스템 호출이 반환될 때나 인터럽트 핸들러가 반환될 때일 수 있습니다.

특정 질문에 대답하기 위해 시스템 호출이 끝날 때까지 기다리고(인터럽트될 수도 있고 그렇지 않을 수도 있음) 인터럽트 핸들러가 프로세스에 반환되면(즉, 커널 모드로 돌아갑니다) 사용자 모드가 아님), 프로세스가 시스템 호출에서 이후에 반환될 때까지(즉, 사용자 모드로 반환될 때까지) 신호가 전달되지 않습니다.

시스템 호출이 중단되고(EINTR 반환) "재시작 가능"한 경우 신호 처리기가 실행된 후 시스템 호출 인터페이스를 지원하는 사용자 코드는 사용자 코드로 돌아가지 않고 시스템 호출을 자동으로 다시 입력하도록 선택할 수 있습니다.

또한 확인이것나가...

마지막으로, 여기서 의미하는 바는 프로세스가 시스템 호출에서 결코 반환되지 않는 경우(결과적으로 "종료할 수 없는" 프로세스 발생) SIGKILL을 포함하여 신호가 프로세스에 전달되지 않을 수 있다는 것입니다.

관련 정보