myshell 을 구현을 하는 중이다.

표준 입력으로 마지막에 &를 입력해주면 이는 프로세스를 백그라운드로 실행시켜 주라는 뜻이다.

나의 쉘에서도 역시 이를 같은 기능을 해주도록 구현을 해야한다.

처음 든 생각은 나의 쉘 프로세스는 여전히 동작 하여야 하므로 종료가 되어서는 안되고

즉 나의 쉘 프로세스는 계속 나의 일을 하고 백그라운드로 실행을 시킬 프로세스는 

알아서 실행 되도록 해야 한다.

맨 처음 든 직관적인 생각 자식을 만든후 그 자식이 다시 자식 프로세스를 만든후

인수를 전달해서 그 프로세스(손자) 에서 수행하도록 하고 부모 프로세스는 먼저 종료를 한다.

조부모(myshell) 프로세스는 부모 프로세스가 종료를 하면 wait로 받아줄 것이고 

while문을 통해 myshell에서 여전히 작업을 할 수 있게 되고 손자 프로세스는 따로 돌 수 있는 것이다.

문제는 이렇게 부모프로세스가 먼저 죽어버리면 손자프로세스가 수행이 끝난 후

종료를 했을 때 wait를 해줄 부모 프로세스가 없다는 것이 문제이다.

즉 손자프로세스는 부모 프로세스가 죽는 순간 고아 프로세스가 되었다가

수행이 끝나면 좀비 프로세스가 된다.

그리고 좀비 프로세스가 되면 init 프로세스가 이를 입양해서 wait를 시켜준다

하지만 wait 는 systemcall이고 이는 자원이 많이 소모 되는 일이므로

바로 wait를 시켜주지 않고 주기적으로 wait를 시켜준다.

이론상은 이랬는데 코드를 짜고 수행중에 문제가 있다.

 

코드를 짜고 수행을 시켰을 때 예를 들어 sleep 10 & 라는 명령어를 입력했을 때

 

손자 프로세스에서 sleep이 수행되게 되고

10초가 지나면 (예를 들면 11초??) <- 종료 되었으나 init이 wait 시켜주지 않은 상황

가 되었을때 ps를 하면 sleep프로세스가 <defunct> 상태로 보여야 하는데 

여러번 ps를 입력 해보아도 그 상태인 것을 잡아 내지 못했다.

 

한가지 가설은 init 이 system call은 시스템 자원을 많이 드는 일 이므로 주기적으로 (가끔가다)

한번씩 wait 를 해준다고 했는데 이것이 사실 컴퓨터 입장에서는 매우 긴 시간이지만

인간인 우리 입장에서는 굉장히 짧은 시간이라 우리가 그 순간을 명령어를 통해서 확인하기는 굉장히 

어려운 것인가?? 라는 생각을 했고

 

init이 wait해주는 주기적인 시간이 대략 어느정도 됩니까? 라고 질문 했는데

그건 시스템 마다 설정되어 있는 값이 다르다 라고 말해주셔서 ..... 여전히 해결이 되지 않은 상태이다.

 

일단 그래도 표면상으로는 백그라운드로 실행 시켜주는 역할을 충실히 하고 있는 것 같다.

 

이에 해당되는 이유는 찾으면 업데이트 하도록 하겠습니다..

 

## 수정

INIT프로세스는 고아 프로세스상태에서 입양을 하는것 같습니다 그래서 좀비프로세스가 나타나지 않는 것 처럼 보이는 것 같습니다.

-> 손자를 만들어서 좀비프로세스가 눈에 띄지 않게 하는 방향이 아닌 SIGCHILD를 이용하여

    좀비 프로세스가 생기지 않도록 수정 하였습니다.

 

 

+ Recent posts