톨머프
387
2021-03-20 20:03:15
5
200

[OS] 부모 프로세스가 자식 프로세스를 kill하는 부분에서 궁금한 점이 있어 질문드립니다


부모 프로세스가 자식 프로세스를 kill함으로서 자식 프로세스가 종료될 수 있다고 알고 있습니다.


프로세스는 new ready running block terminated등의 상태를 가지는데 위의 상황에서 두 프로세스가 각각 어떤 상태인지가 궁금합니다.

running상태인 부모프로세스가 ready상태인 자식 프로세스를 terminated상태로 변경시키는 것인지

ready상태인 부모프로세스가 running상태인 자식 프로세스를 terminated상태로 변경시키는 것인지

둘 다 이상하긴 한데, 어떤 상태를 가지는지가 궁금합니다!

0
  • 답변 5

  • 장독깨기
    3k
    2021-03-20 22:07:14 작성 2021-03-20 22:08:13 수정됨

    kill 은 자식 프로세스를 종료시키는게 아니고, 자식 프로세스한테 신호를 보내는 겁니다.

    kill 시그널번호

    그럼 자식프로세스는 시그널을 캡쳐해서 적당한 액션을 취하게 되죠..

    보통 kill -TERM 이라 하면 자식프로세스에게 15번 시그널을 전송하는 것이고,

    자식프로세스는 15번 시그널을 캡쳐하면 프로세스를 스스로 종료합니다.

    여기서 프로세스는 모든 시그널을 캡쳐할 수 있는 건 아닙니다.

    자세한 내용은 시그널 검색해서 알아보시면 도움이 되지 싶습니다.


  • 톨머프
    387
    2021-03-20 22:59:40

    장독깨기

    답변 감사합니다. 혹시 질문을 하나 더 해도 된다면

    부모프로세스가 kill신호를 보낼 때, 자식 프로세스가 시그널을 캡처할 때는 각각의 프로세스가 running 상태가 될 때 이루어지나요?? 인터넷에 돌아다니는 process state를 보면 ready -> terminated로 바로갈 수는 없다고 나와있는데 신호를 캡처하게 되면 가능한 것인지 궁금합니다!

  • 장독깨기
    3k
    2021-03-21 01:39:12

    ㅎㅎ 그렇게 자세히는 잘 모릅니다..

    어쨌든 준비 상태에서 바로 종료는 할 수 없고 캡쳐를 하면 런닝 상태는 거쳐야 하겠죠.

    그런데, 9번 시그널은 프로세스가 캡쳐를 못 합니다. 바로 종료 시켜버리거든요..

    역시 잘 모르겠습니다. ㅋ


    공부 열심히 하세요.. ^^


  • esrse
    1k
    2021-03-21 14:23:52

    꼭 부모,자식 간에만 시그널을 보낼 수 있는 것은 아닙니다.

    아무 프로세스간이더라도 시그널을 보낼 수 있는 권한이 허용된다면 보낼 수 있습니다.

    시그널과 프로세스의 state간에 직접적인 관련성은 없습니다. 서로 다른 개념이라고 보시면 됩니다.


    시그널을 보내는 쪽이 권한이 충분히 허용된다면, 시그널을 받는 프로세스를 표현하는 메모리상의 구조체 내에 어떤 필드에 시그널 정보가 마킹이 된다고 보시면 됩니다.

    그러면 시그널을 받은 프로세스는 그 필드 값을 확인해서 마킹이 돼 있으면 적절한 동작을 취하는 방식입니다.

    즉 시그널을 보내는 과정과, 시그널을 확인하고 적절히 처리하는 과정이 분리돼있습니다.


    시그널을 확인하고 처리하는 과정은 경우의수가 조금 복잡합니다.

    프로세스가 아무런 시그널 핸드러를 설정하지도 않았고, 시그널마스크를 건드리지도 않았다면, 시그널 별로 지정된 디폴트 동작을 수행합니다. 시그널을 여러가지 종류가 있습니다. SIGHUP, SIGINT, SIGTERM, SIGKILL, SIGSTOP, SIGABRT, SIGPIPE, 등등이 있죠. 그리고 각 시그널마다 디폴트 동작이 다릅니다. 디폴트 동작의 예로는 프로세스 종료하기, 시그널 무시하기, 코어덤프하기, 중단하기, 재개하기가 있습니다.


    시그널 마스크를 건드렸고, 특정 시그널을 block으로 처리해두었다면, 그 시그널은 pending상태로 남게 됩니다. 나중에 시그널을 받은 프로세스가 시그널마스크를 풀었을 때 펜딩된 시그널을 받게 됩니다.


    시그널 핸들러를 지정해두었다면, 비동기적으로 시그널 핸들러가 실행이 됩니다.


    시그널에 대해서 간략히 적어보았는데요. 앞서도 말씀드렸듯이 시그널이라는 개념과 프로세스 상태라는 개념은 서로 직접적인 연관성이 없는 개념입니다. 그래서 질문이 조금 이상하다고 볼 순 있습니다.

    그런데 리눅스에 국한해서 실무적으로 봤을 땐 대답을 할 수 있는 부분입니다.

    리눅스는 시그널을 받는 쪽에서 시그널을 처리하는 시점이 정해져있습니다. 시스템콜에서 반환되는 시점, 인터럽트핸들러에서 반환되는 시점입니다. 그리고 slow 시스템콜에 블로킹 돼 있는 경우에도 프로세스 상태가 RUNNING으로 바뀌고 시그널처리과정으로 진행됩니다.

    따라서 이 시점일 때는 프로세스가 스케줄러에 의해서 실행이 가능한 즉, RUNNING상태이고, 이 시점때 시그널 처리가 수행되고 이 시그널 처리에 의해서 프로세스가 죽어버리게 된다면 RUNNING에서 죽는 상태로 간다고 말할 수 있을 거 같습니다.

  • 톨머프
    387
    2021-03-22 10:21:47

    장독깨기

    esrse

    두 분 모두 감사드립니다! 운영체제 수업을 듣고 있는데, 몇 주 뒤에 시그널에 대해서 강의를 하신다고 하니 그 때 열심히 들어볼게요!!

  • 로그인을 하시면 답변을 등록할 수 있습니다.