리눅스 쉘이 키보드 입력을 해석하고 수행하는 방법: 시스템콜 fork( )와 exec( )

JangDongyul·2022년 2월 12일
0

지난 글에서 쉘이 사용자가 입력한 택스트를 해석하고 수행한다는 말씀을 드렸습니다
콘솔, 터미널, 프롬프트, 쉘에 대한 글의 링크입니다.

이번 글에서는

리눅스 쉘이 어떤 원리로 키보드 입력을 해석하고 수행하는지에 대해 말씀드리겠습니다.

리눅스의 명령어외부 명령어내부 명령어로 분류할 수 있습니다.

1. 내부 명령어: 외부 명령어에 비해 비교적 간단하며, 별도의 실행파일이 없습니다.
내부명령어는 쉘의 일부라고 생각하시면 됩니다.
Wondows 버전에 따라, cmd.exe 실행파일의 일부이며, 보조기억장치에 있는 별도의 파일이 아닙니다.

예) cd, dir, exit, path
2. 외부 명령어: 외부 디렉토리에 실행 파일의 형태로 존재하며, 내부 명령어에 비해 간단하지 않습니다.
예) ls, vi
3. 실행파일: 쉘은 명령어만 실행하지는 않습니다.
실행 파일도 실행시킬 수 있으며, 외부명령어도 실행 파일에 속합니다.

즉, vi 와 ls 같은 외부 명령어는 외부 디렉토리에 저장되어있는 실행파일입니다.
이 명령어 프로그램 파일들은 해당 위치에서 확인 가능하십니다.

이미지 출처: http://aispiration.com/shell-novice-kr/reference/

그러면 쉘이 어떻게 명령어 또는 실행파일을 실행시키는 걸까요?

쉘은 시스템콜 fork() 와 exec()을 이용하여 명령어를 실행시킵니다.

시스템콜에 대해서는 다음에 작성할 글에서 자세히 설명을 드리겠습니다

일단은,
시스템콜은 커널(운영체제의 핵심)의 기능을 이용하기 위한 API 라고만 알아주세요.
API라는 표현도 두리뭉실 하시면, 함수라고 알고 계시면 됩니다.

시스템콜은 커널(운영체제의 핵심)의 기능을 이용하기 위한 API입니다

쉘이 명령어 또는 실행파일을 수행하는 과정을 그려보면 이렇습니다.
1. fork( ) 을 이용하여 쉘이 자기복제를 통해 자식 프로세스를 만들고
2. exec( ) 을 통해, 자식 프로세스를 실행할 명령어 또는 실행파일의 소스코드로 자기대치를 하게 됩니다.

이미지 출처: 직접 그림

아래처럼 쉘이, 사용자가 터미널에 입력한 ls 명령을 수행할 때에도,

1. 쉘 프로세스는 fork( )로 자기복제를 합니다.(새로운 프로세스 생성)
2. 자신을 복제한 자식 프로세스에 exec( )으로 ls 프로그램 파일로 자기대치를 시킵니다. (이때 쉘은 부모 프로세스가 되겠지요)
3. 쉘이 자기복제를 한 자식 프로세스로 ls 프로그램 파일을 실행한다고 생각하시면 됩니다.
4. 쉘이 명령어 수행 후 실행결과를 터미널에게 전달해주면
5. 터미널은 화면에 출력해줍니다.

예전에는 간단하게,
1. 프로세스는 프로그램을 실행하면 프로세스가 된다고 배우셨을 겁니다.
2. 그리고 운영체제를 배우시면서, 프로세스가 실행을 위해 시스템(커널)에 등록된 작업(프로그램+데이터)라고 좀 더 자세하게 배우셨을 겁니다.
3. 운영체제를 공부하신 다음, 시스템 프로그래밍 과목을 공부하시면 더 자세하게 배우시는데, fork() 와 exec() 시스템콜을 이용하여 프로세스를 만드는 과정을 배우시게 됩니다.

아래 이미지는 Unix process state를 나타내는데요

잘 보시면 fork( ) 시스템콜로 프로세스를 만든다는 걸 알 수 있지요!


이미지 출처: https://commons.wikimedia.org/wiki/File:Unix_process_states.png

반면에 exit( ) 시스템콜로 프로세스가 자원(CPU, 메모리.. 등)을 반납하고, 좀비프로세스가 된다는 걸 알 수 있지요!

  1. 프로세스가 종료할 때는 exit() 시스템콜을 실행시켜서 리소스를 반납하고 실행을 종료 후, 좀비프로세스가 됩니다
  2. 좀비프로세스란, 실행이 종료되었지만 커널의 작업리스트에는 남아있는 프로세스입니다.
  3. 좀비 프로세스는 해당 프로세스를 만든 부모프로세스 또는 init 프로세스에서 wait( ) 시스템콜로 처리합니다(커널의 작업리스트에서 지워줍니다.)

다음 시간에는 exit( )과 wait( )에 대해 더 자세히 설명드리겠습니다.

 

운영체제 지식 참고링크: https://youtu.be/jZuTw2tRT7wI
Unix process state 이미지 출처: https://commons.wikimedia.org/wiki/File:Unix_process_states.png

0개의 댓글