[번외] 리눅스 명령어 처리 과정
이 장에서는 사용자가 터미널에 명령어를 입력했을 때, 내부적으로 시스템이 어떤 단계를 거쳐 명령어를 처리하고 결과를 출력하는지 메모리와 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: 화면 출력 처리
요약
- 터미널에 명령어를 입력하면, CPU는 키보드 입력을 인터럽트로 처리하고 문자열을 메모리에 저장한다.
- 쉘은 입력된 명령어를 해석해 실행 파일 경로를 찾고, 커널에 실행을 요청한다.
- 커널은 해당 프로그램을 메모리에 적재하고 프로세스를 생성한 후 실행을 시작한다.
- 실행 결과는 stdout 버퍼를 통해 터미널로 전달되며, 사용자는 화면에서 결과를 확인할 수 있다.