운영체제를 공부하다 보면, 제일 처음 마주하는게 '셸' 이다. '셸'은 유저로부터 입력을 받아 커맨드를 실행하는 프로세스 라고 배웠는데 도무지 무슨 말인지 이해가 되지 않았다. 그러면 그냥 '터미널' 이라고 하면 되지 왜 '셸' 이라고 부르지? 그런데 터미널과 셸은 엄연히 다른 것이였다.
 

셸 / 터미널의 차이

 

※셸은 어떻게 동작할까?

 
위의 그림을 보면 우리가 항상 사용하던 '터미널'은 셸을 위한 GUI였다. 그리고 오른쪽의 '셸'은 터미널 같은 GUI 없이 실행 가능한 프로세스이다. 그렇다면, 셸은 어떻게 동작할까? 아래는 셸의 동작을 간편하게 도식화 한 것이다.



1. **Shell waits for user input (셸은 사용자 입력을 기다린다):**
   - 사용자가 키보드 또는 다른 입력 장치를 통해 명령을 입력하면, 셸은 사용자의 입력을 기다리는 상태에 있다.
2. **Shell interprets command (셸은 명령을 해석한다):**
   - 사용자가 입력한 명령을 셸이 이해하고 해석한다. 이 과정에서 내장 명령인지 또는 외부 명령인지 판별된다.
   - 만약 내장 명령이라면, 해당 명령은 셸 내에서 직접 실행된다. 내장 명령은 외부 프로그램이 아니라 셸 자체에 구현된 명령어를 말한다.(cd, ls,,,등등을 일컫는다)
   - 외부 명령인 경우, 해당 명령에 대한 실행 파일이나 프로세스를 시작하기 위해 다음 단계로 진행된다.
3. **Forks a process (자식 프로세스를 생성한다):**
   - 외부 명령의 경우, 셸은 새로운 프로세스를 생성한다. 프로세스 생성은 일반적으로 fork 시스템 호출을 사용하여 이루어진다.
   - 새로운 프로세스는 명령을 실행하고, 결과를 출력하거나 다른 작업을 수행한다.
4. **Process handling (프로세스 처리):**
   - 만약 명령이 foreground process(전경 프로세스)인 경우, 부모 프로세스(셸)는 자식 프로세스가 종료될 때까지 기다린다.
   - Background process(백그라운드 프로세스)인 경우, 부모 프로세스는 자식 프로세스의 종료를 기다리지 않고 다른 명령을 계속해서 받아들인다.
   - 부모 프로세스는 자식 프로세스로부터의 종료 신호를 받거나, 자식 프로세스의 실행이 완료되면 적절한 조치를 취한다.


※Foreground, background 프로세스

이전 포스팅에서 이것에 대해 다루었지만 이번에는 조금 더 자세하게 예시와 함께 보도록 하겠다.

1. **Foreground Process (fg):**
Foreground process는 화면에 나타나 유저와 상호작용할 수 있는 프로세스를 이다. 이 프로세스가 실행 중일 때, 해당 터미널 또는 쉘은 해당 프로세스의 출력을 받아들이고 사용자가 해당 프로세스와 상호작용할 수 있다. 일반적으로 프로그램을 실행하면 해당 프로그램이 foreground로 실행되어, 프로그램이 완료될 때까지 터미널에서 입력을 받지 않고 기다린다.

2. **Background Process (bg):**
Background process는 화면에 나타나지 않고, 백그라운드에서 실행 중인 프로세스이다. 사용자가 해당 프로세스와 상호작용할 필요가 없으며, 다른 작업을 계속할 수 있다. 프로세스를 백그라운드로 전환하면 해당 프로세스가 실행 중일 때에도 터미널이 다른 명령어를 받아들일 수 있게 된다

   -  백그라운드에서 실행된 프로세스는 종료되면 터미널에 알림이 표시된다. 일반적으로 "Done"이라는 메시지와 함께 해당 프로세스의 종료 상태가 표시됩니다.

이해가 가지 않으니 예시를 보자. 터미널을 열고 sleep 10이라고 쳐보자. 그러면 터미널은 10초동안 아무것도 하지 않을것이다(wait). 이 동안 프로그램이 완료 될때까지 터미널에서 입력을 받지 않고 기다린다.

위의 sleep은 foreground에서 실행된 명령어이다. 이제 10초간 대기후, ls명령어를 실행한다. 이처럼 fg는 유저와 상호작용 할 수 있다.
 
아래는 기호를 통해 bg로 보내는 과정이다.

뒤에 &를 붙여줌으로써 bg로 실행할 수 있다. 위의 fg는 우리가 sleep 10, ls를 치면 터미널에서 ls가 실행되며 대기가 끝나는것을 눈으로 확인 할 수 있지만, 위의 [1] 46181은 작업번호, PID이다. 즉, 46181이라는 PID를 가진 프로세스가 백그라운드에서 현재 sleep 100을 실행중이라는 말이다. 

+ Recent posts