셸에서 프로그래밍 실행

셸에서 프로그램 실행

셸에서 프로그램 실행하는 과정

사용자가 A>PROGRAM1.COM 을 입력하고 엔터를 누르면:

  1. COMMAND.COM 이 입력을 받는다

  2. 인터럽트 벡터를 참고해 MSDOS.SYS의 함수를 호출한다

  3. MSDOS.SYS프로그램 1을 사용 가능한 RAM에 올린다

  4. 실행 권한을 프로그램 1에게 넘긴다

메모리 구조상 위치 COMMAND.COM 바로 위 사용 가능한 RAM 영역에 쌓인다. 프로그램이 종료되면 해당 영역은 다시 반환된다.

프로그램 1은

셸에서 프로그램 종료하는 과정

프로그램 1이 종료될 때:

  1. 인터럽트 벡터를 참고해 (MSDOS.SYS)의 종료 함수를 호출한다

  2. 프로그램 1이 메모리에서 제거된다

  3. COMMAND.COM으로 제어권이 돌아온다

  4. 다시 A>_ 프롬프트가 표시된다

스택 구조와 동일한 개념 COMMAND.COM 위에 쌓이고(push), 종료되면 빠져나가는(pop) 구조다. 항상 가장 마지막에 올라간 프로그램이 먼저 종료된다.

프로그램은

프로그램이 다른 프로그램을 실행하는 경우

프로그램도 COMMAND.COM처럼 다른 프로그램을 실행할 수 있다. 이 때도 항상 MSDOS.SYS의 함수를 빌려서 실행한다.

연쇄 실행 예시

COMMAND.COM
  → 프로그램 3 실행
    → 프로그램 2 실행
      → 프로그램 1 실행 (현재 실행 중)

스택과 동일한 구조 위로 쌓이고(push), 종료되면 아래로 돌아온다(pop). 항상 가장 위에 있는 프로그램이 현재 실행 중인 프로그램이다.

실행할 때마다 메모리에

단, 프로그램을 띄우든 종료하든 항상 MSDOS.SYS를 경유한다.

"실행 중" ≠ CPU가 지금 실행하는 코드

메모리 다이어그램의 “실행 중” 표기는 단순히 메모리에 올라가 있다는 의미다. CPU가 해당 프로그램의 명령어를 지금 처리하고 있다는 뜻이 아니다.

프로그램 3 → 2 → 1 연쇄 실행 시

  • 프로그램 3, 2가 메모리에 있어도
  • CPU는 가장 위에 있는 프로그램 1의 코드만 실행한다
  • 프로그램 1이 종료되면 → 프로그램 2의 코드가 실행되기 시작
  • 프로그램 2가 종료되면 → 프로그램 3의 코드가 실행되기 시작

핵심 단일 태스킹 환경이다. 여러 프로그램이 메모리에 있어도 CPU는 한 번에 하나의 프로그램만 실행한다.

MS-DOS는

모든 프로그램 종료 — COMMAND.COM으로 복귀

프로그램 1 → 2 → 3 순서로 모두 종료되면 최종적으로 COMMAND.COM으로 제어권이 돌아온다. 다시 A>_ 프롬프트가 표시되며 다음 명령을 기다린다.

결국 COMMAND.COM은 항상 바닥에 있다 COMMAND.COM이 남는다.

프로그램이 아무리 중첩 실행되어도, 스택이 모두 비워지면 항상

내 프로그램의 주소는 정해져 있지 않다.

내 프로그램의 주소가 정해져 있지 않다! 어떤 순서로 프로그램을 실행하느냐에 따라 동일한 프로그램이라도 메모리에 올라가는 주소가 달라진다.

MS-DOS에서는

  • 프로그램 1만 실행 → COMMAND.COM 바로 위에 위치

  • 프로그램 3 → 2 → 1 순서로 실행 → 훨씬 위쪽 주소에 위치

6502와의 차이

6502MS-DOS (8088)
프로그램 주소컴파일 시 고정실행 순서에 따라 유동
메모리 모델단일 프로그램, 고정 맵스택처럼 동적으로 쌓임

6502는 한 번 컴파일하면 실행 주소가 고정이지만, MS-DOS에서는 같은 바이너리라도 실행 시점마다 주소가 다를 수 있다.