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를 이용하여

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

 

 

수업시간 교수님께 들은 내용을 정리.

 

Dijkstra는

structured programming without GOTO 를 주장

 

Knuth는

structured programming with GOTO 를 주장

 

우리는 goto가 필요없이 프로그램을 짤 수 있다

하지만 goto가 있다면 매우 효율적 인 경우 가 있다.

 

예를 들자면

while(){

...

 while(){

 ...

  while(){

  ... 

}

}

}

등의 코드에서 (반복문을 깊숙히 내려갔을때)

goto 문을 사용가능하면  goto를 통해 이 반복문들을 쉽게 빠져 나올 수 있다.

없다면?

여러개 타고 들어온 반복문들에 빠져나오는 조건을 설정 해주어 나와야 할 것이다.

 

이러한 사항들이 있음을 Knuth는 주장을 했고 

지금 현재 우리는 여전히 goto문을 사용 할 수 있다.

이 자체가 필요성을 인정했기 때문에 남아 있는 것 일 것이다.

 

물론 goto 문을 남용 할 경우 ugly code가 될 수 있고 이는 잘 짠 코드가 아니다

(잘 짠 코드란? - 같은 기능을 하는 프로그램을 더 효율적이고 알아보기 쉽게 짠 코드)

 

그러므로 goto문을 남용 하지는 말되 정말 필요한 순간(goto문이 효율적인) 이 온다면 쓸 수 있다.

그 점을 기억해 두자.!

 

참고) 기억과 조사 그리고 기억해두어야 할 점을 위주로 정리 함으로 사이사이 약간의 오류들이 있을 수 있음.

 

'학부생 공부 > 생각들' 카테고리의 다른 글

abstract data type 어떤 이유?  (0) 2019.12.01
정적영역, 스택영역, 그리고 힙 영역  (0) 2019.11.09

+ Recent posts