[번외] 리눅스 명령어 처리 과정

이 장에서는 사용자가 터미널에 명령어를 입력했을 때, 내부적으로 시스템이 어떤 단계를 거쳐 명령어를 처리하고 결과를 출력하는지 메모리와 CPU 관점에서 살펴본다.

명령어 처리 단계

1. 명령어 입력 (사용자 → 터미널)

  • 메모리: 터미널 프로그램과 쉘은 이미 메모리에 상주하며, 입력된 명령어는 터미널 버퍼에 저장된다.
  • CPU: 키보드 입력 시 인터럽트가 발생하고, CPU가 이를 처리해 터미널 버퍼에 기록한다.

2. 터미널에서 쉘로 명령어 전달

  • 메모리: 터미널 버퍼의 명령어 문자열이 쉘 입력 버퍼로 전달된다.
  • CPU: CPU는 터미널에서 쉘로 명령어 전달을 제어한다.

3. 쉘에서 명령어 해석 및 실행 요청

  • 메모리: 쉘이 명령어를 해석하고 실행 파일 경로 및 인수를 확인한다.
  • CPU: 쉘은 시스템 호출을 통해 커널에 실행을 요청한다.

4. 커널에서 프로그램 실행 준비

  • 메모리: 커널은 디스크에서 실행 파일을 읽어와 메모리에 적재한다.
  • CPU: 커널 모드에서 새 프로세스를 생성하고 실행 준비를 마친다.

5. 프로세스 생성 및 실행

  • 메모리: 실행 코드와 데이터가 프로세스 주소 공간에 적재된다. (스택, 힙 포함)
  • CPU: 새 프로세스의 컨텍스트를 설정하고 프로그램 실행을 시작한다.

6. 프로세스 수행

  • 메모리: 현재 디렉터리의 파일 목록 등 필요한 데이터를 메모리에서 읽는다.
  • CPU: 명령어를 순차적으로 실행하며 파일 시스템 호출을 처리한다.

7. 결과 반환

  • 메모리: 결과는 표준 출력(stdout) 버퍼에 저장된다.
  • CPU: 출력 내용을 터미널로 전달하는 시스템 호출을 실행한다.

8. 터미널에 결과 표시

  • 메모리: 출력 결과는 터미널 버퍼에 저장된다.
  • CPU: 터미널 프로그램이 화면에 내용을 표시하도록 제어한다.

예시: ls 명령어 처리 과정

1. 명령어 입력

  • 입력: ls
  • 메모리: 문자열 ls가 터미널 버퍼에 저장된다.
  • CPU: 키보드 입력을 처리한다.

2. 터미널 → 쉘 전달

  • 메모리: ls 문자열이 쉘로 전달된다.
  • CPU: 제어가 쉘로 넘어간다.

3. 쉘 해석 및 실행 요청

  • 메모리: ls 경로를 찾고 인수 파싱을 수행한다.
  • CPU: 시스템 호출로 커널에 실행을 요청한다.

4. 커널 처리

  • 메모리: ls 실행 파일을 메모리에 로드한다.
  • CPU: 프로세스를 생성한다.

5. 실행 및 수행

  • 메모리: 코드와 데이터가 적재된다.
  • CPU: ls 실행이 시작된다.

6. 결과 반환

  • 메모리: 출력이 stdout에 저장된다.
  • CPU: 터미널로 전송한다.

7. 화면 표시

  • 메모리: 터미널 버퍼에 출력 내용 저장
  • CPU: 화면 출력 처리

요약

  1. 터미널에 명령어를 입력하면, CPU는 키보드 입력을 인터럽트로 처리하고 문자열을 메모리에 저장한다.
  2. 쉘은 입력된 명령어를 해석해 실행 파일 경로를 찾고, 커널에 실행을 요청한다.
  3. 커널은 해당 프로그램을 메모리에 적재하고 프로세스를 생성한 후 실행을 시작한다.
  4. 실행 결과는 stdout 버퍼를 통해 터미널로 전달되며, 사용자는 화면에서 결과를 확인할 수 있다.