문제

때로는 내가 때마다 쓰기 프로그램에서 리눅스와 충돌로 인해 일종의 버그,그것이 될 것이 무정전 프로세스 및 실행을 계속 할 때까지 영원히 내 컴퓨터를 다시 시작하는 경우(I log out).나의 질문은:

  • 원인이 무엇인 프로세스가 무정전?
  • 어떻게 그 중지에서 일어나고 있는가?
  • 이것은 아마 바보 같은 질문,하지만 어떤 방법이 있을 방해하지 않고 그것을 내 컴퓨터를 다시 시작?
도움이 되었습니까?

해결책

중단 불가능한 프로세스는 신호에 의해 방해 할 수없는 시스템 호출 (커널 함수)에서 발생하는 프로세스입니다.

그 의미를 이해하려면 중단 가능한 시스템 호출의 개념을 이해해야합니다. 전형적인 예는입니다 read(). 이것은 잠재적으로 하드 드라이브를 회전 시키거나 머리를 움직일 수 있기 때문에 오랜 시간 (초)이 걸릴 수있는 시스템 호출입니다. 이 시간의 대부분 동안, 프로세스는 수면으로 하드웨어를 차단할 것입니다.

프로세스가 시스템 호출에서 자고있는 동안 UNIX 비동기 신호 (예 : sigterm)를받을 수 있습니다.

  • 시스템 호출은 조기에 종료되며 -eintr을 사용자 공간으로 반환하도록 설정됩니다.
  • 신호 핸들러가 실행됩니다.
  • 프로세스가 여전히 실행중인 경우 시스템 호출에서 반환 값을 얻고 다시 동일한 호출을 할 수 있습니다.

시스템 호출에서 일찍 돌아 오면 사용자 공간 코드는 신호에 대한 응답으로 동작을 즉시 변경할 수 있습니다. 예를 들어, Sigint 또는 Sigterm에 대한 반응에서 깨끗하게 종료됩니다.

반면에 일부 시스템 호출은 이런 식으로 중단 될 수 없습니다. 시스템이 어떤 이유로 마구간을 호출하면 프로세스는이 killible 상태에 무기한 상태로 유지 될 수 있습니다.

lwn은 a 좋은 기사 그것은 7 월 에이 주제에 영향을 미쳤다.

원래 질문에 답하기 위해 :

  • 이런 일이 발생하지 않도록하는 방법 : 어떤 드라이버가 문제를 일으키는 지 파악하고 사용을 중단하거나 커널 해커가되어 수정하십시오.

  • 재부팅하지 않고 무정형 프로세스를 죽이는 방법 : 어떻게 든 시스템 호출이 종료되도록합니다. 전원 스위치를 치지 않고이 작업을 수행하는 가장 효과적인 방법은 전원 코드를 당기는 것입니다. LWN 기사에서 설명한대로 커널 해커가되어 드라이버가 Task_Killable을 사용하게 할 수 있습니다.

다른 팁

프로세스가 사용자 모드에 있으면 언제든지 커널 모드로 전환 할 수 있습니다. 커널이 사용자 모드로 돌아 오면 계류중인 신호가 있는지 확인합니다 (예 : 프로세스를 죽이는 데 사용되는 신호 포함. SIGTERM 그리고 SIGKILL). 이는 프로세스가 사용자 모드로 돌아갈 때만 죽일 수 있음을 의미합니다.

커널 모드에서 프로세스를 죽일 수없는 이유는 동일한 기계의 다른 모든 프로세스에서 사용하는 커널 구조를 잠재적으로 손상시킬 수 있기 때문입니다 (스레드를 죽이는 것과 같은 방식으로 동일한 프로세스에서 다른 스레드가 사용하는 데이터 구조를 잠재적으로 손상시킬 수 있습니다). .

커널이 오랜 시간이 걸릴 수있는 작업을 수행 해야하는 경우 (예를 들어 다른 프로세스로 작성된 파이프를 기다리거나 하드웨어가 무언가를하기 위해 기다리는 것), 스케줄러로 전화하여 스케줄러에게 전화하여 다른 것으로 전환함으로써 잠을 잔다. 프로세스 (수면이없는 프로세스가 없으면 CPU가 약간 속도를 늦추고 루프에 앉아있는 "더미"프로세스로 전환됩니다.

신호가 수면 과정으로 전송되면 사용자 공간으로 돌아 가기 전에 깨어나서 보류중인 신호를 처리해야합니다. 여기서 우리는 두 가지 주요 수면 유형의 차이가 있습니다.

  • TASK_INTERRUPTIBLE, 중단 가능한 수면. 작업 에이 깃발이 표시되면 자고 있지만 신호로 깨울 수 있습니다. 이것은 수면으로 작업을 표시 한 코드가 가능한 신호를 기대하고 있으며, 깨어 난 후에는 그것을 확인하고 시스템 호출에서 돌아올 것입니다. 신호가 처리 된 후 시스템 호출은 잠재적으로 자동으로 다시 시작될 수 있습니다 (그리고 그 작동 방식에 대한 세부 사항은 없습니다).
  • TASK_UNINTERRUPTIBLE, 무정 수면. 작업 이이 깃발로 표시되는 경우, 쉽게 다시 시작할 수 없거나 프로그램이 시스템 호출이 원자가 될 것으로 기대하기 때문에 기다리고있는 것 이외의 다른 것에 의해 깨어날 것으로 기대하지 않습니다. 이것은 매우 짧은 것으로 알려진 수면에도 사용될 수 있습니다.

TASK_KILLABLE (DDAA의 답변에 연결된 LWN 기사에서 언급)는 새로운 변형입니다.

이것은 첫 번째 질문에 답변합니다. 두 번째 질문에 관해서 : 무정 수면을 피할 수는 없으며, 정상적인 일입니다 (예 : 프로세스가/쓸 때마다/디스크에서 쓸 때마다); 그러나 그들은 1 초만 지속되어야합니다. 더 오래 지속되면 일반적으로 하드웨어 문제 (또는 커널과 동일하게 보이는 장치 드라이버 문제)를 의미합니다. 여기서 장치 드라이버가 하드웨어가 절대 일어나지 않을 무언가를하기 위해 기다리고 있습니다. 또한 NFS를 사용하고 NFS 서버가 다운되었음을 의미 할 수 있습니다 (서버가 복구되기를 기다리고 있습니다. "intr"옵션을 사용하여 문제를 피할 수도 있습니다).

마지막으로, 회복 할 수없는 이유는 커널이 사용자 모드로 돌아갈 때까지 신호를 전달하거나 프로세스를 죽일 때까지 기다리는 것과 같은 이유와 같은 이유입니다. 커널의 데이터 구조를 손상시킬 수 있습니다 (중단 가능한 수면에서 대기하는 코드는 오류가 발생할 수 있습니다. 프로세스를 죽일 수있는 사용자 공간으로 돌아가려면, 무정 수면에서 대기하는 코드는 오류를 기대하지 않습니다).

무정전 프로세스는 일반적으로 기다리고 있는 I/O 다음 페이지 오류입니다.

이것을 고려하십시오:

  • 실려고 페이지에 액세스하지 않는 핵심(하나는 실행하는 수요로드 페이지의 익명의 메모리되어있는 교체 또는 mmap()'d 파일이 있는 수요는,로드하는 많은 같은 일)
  • 커널은 이제(하려고)하중에서
  • 프로세스를 계속할 수 없습 페이지까지 사용할 수 있습니다.

프로세스/작업 중단할 수 없에서 이 상태이기 때문에,그것은 처리할 수 없습니다 어떤 신호를;그것이 경우,다른 페이지 오류가 일어날 것이고 그것은 것이 있었다.

내가 말할 때""프로세스,정말 뜻은"작업하는"리눅스에서(2.6)비슷하"실"지 않을 수도 있습니다 또는 개인"그룹 스레드"항목에서는/proc

어떤 경우에,그것이 기다리고 있을 수 있습니다.의 전형적인 예이 실행 또는 mmap 면 파일은 네트워크에서 파일시스템 어디에 서버가 실패했습니다.If I/O 결국 성공 작업을 계속됩니다.면 그것은 결국은 실패한 작업은 일반적으로 얻을 SIGBUS 또는 무언가이다.

세 번째 질문 : 나는 당신이 실행함으로써 무정전 과정을 죽일 수 있다고 생각합니다.sudo kill -HUP 1. 런닝 프로세스를 끝내지 않고 시작을 다시 시작하고 실행 한 후에는 무래 중단되지 않은 프로세스가 사라졌습니다.

는 경우에 대해 이야기"좀비"프로세스(이 지정되어 있으로"좀비"에서 출력 ps),그 다음 이에 무해한 기록 프로세스 목록에서 기다리는 사람을 위해 수집하는 코드를 반환할 수 있도록 안전하게 무시됩니다.

수 당신이 무엇인지 설명하십시오며"무정전 프로세스"당신을 위해 무엇입니까?그것은 살아"죽 -9"행복을 따라내고 참는편?는 경우,다음의 일부에 붙어 syscall,에서 찔리는 어떤 드라이버,그리고 당신은 이 프로세스까지 재부팅이(그리고 때로는 그것의 더 나은 다시 부팅하시 예정)또는 하역의 관련 드라이버(는 가능성을 발생).당신을 사용하려고 할 수"strace"곳을 찾기 위해 귀하의 프로세스가 붙어 그것을 피하는 것이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top