[운영체제] 프로그램 실행 과정

2025. 4. 29. 16:44·⚙️ CS/운영체제
반응형

✅ 프로그램 실행 과정

프로그램을 실행시키기 위해서는 크게 컴파일 - 링킹 - 로더 과정을 거쳐야 한다.

 

 

C언어로 예를 들 때, 프로그램 실행 과정은 다음과 같다.

 

C언어 실행과정
출처: "Operating System Concepts", Abraham Silberschatz

 


 

1️⃣ 컴파일

: 소스 코드를 기계어 코드로 변환

 

개발자가 사용하는 C, JAVA 같은 프로그래밍 언어는 고급 언어라고 할 수 있다.

하지만 컴퓨터가 이해하는 언어는 기계 언어이다.

따라서 개발자가 작성한 코드를 컴퓨터가 실행하기 위해서는 컴퓨터가 이해 가능한 기계어로 바꿔줘야 한다.

 

이때 고급 언어로 작성한 파일은 소스 파일이고, 이를 컴파일하면 기계어 코드로 작성된 오브젝트 파일이 나오게 된다.

 


 

2️⃣ 링킹

: 링커가 오브젝트 파일을 하나의 바이너리 실행 파일로 결합

 

컴파일을 통해 생성된 오브젝트 파일 자체로는 프로그램을 실행시킬 수 없다.

그래서 이를 실행 가능한 형태로 변환하기 위해 링킹이 필요하다.

 

이 단계에서 표준 C와 같은 라이브러리나 다른 오브젝트 파일이 포함될 수 있다.

 


 

3️⃣ 로딩

: 로더가 바이너리 실행 파일을 메모리에 적재

 

CPU에서 실행할 수 있게 준비해 주는 과정이다.

 

  • 시스템의 명령어 라인에 프로그램 이름을 입력하면
    • `fork()` 시스템 콜로 새 프로세스를 생성하고
    • `exec()` 시스템 콜로 로더를 호출하고 실행 파일 이름을 전달한다.
    • 로더는 새로 생성된 프로세스의 주소 공간을 사용하여 지정된 프로그램을 메모리에 적재

 

운영체제에서는 별도로 로더를 호출하기보다는 `exec()`를 통해 자동 실행된다.

 


 

✅ 컴파일 언어 vs. 인터프리터 언어

 

구분 컴파일 언어 인터프리터 언어
실행 방식 전체 코드를 한 번에 기계어로 번역 후 실행 실행 중에 한 줄씩 번역하며 실행
예시 C, C++ Python, JavaScript
속도 빠름 (기계어로 바로 실행) 상대적으로 느림
에러 처리 컴파일 시 발견 실행 중 발견 가능

 


 

📍 JIT (Just-In-Time) Compiler

: 프로그램 실행 중, 필요할 때 즉시 컴파일하는 기술

 

인터프리터 언어의 실행속도를 높이는 방식이다.

대표적으로 Java의 JVM, Python의 PyPy가 있다.

 


 

📍 CPython vs. Jython vs. PyPy

 

Python은 다양한 실행 환경을 선택할 수 있는 언어이다.

대표적인 구현체로는 CPython, Jython, PyPy가 있으며, 사용 목적과 환경에 따라 적절한 구현체를 선택하면 된다.

 

구현체 특징 실행 방식
CPython Python의 표준 구현체 Python 코드를 바이트코드(.pyc)로 컴파일 후 인터프리팅
Jython Java 플랫폼 기반 구현체 Python 코드를 Java 바이트코드로 변환 후 JVM에서 실행
PyPy JIT 컴파일러 내장 구현체 실행 중 자주 사용되는 코드를 기계어로 컴파일하여 고속 실행

 

  • 다양한 패키지를 안정적으로 사용해야 할 때 -> `CPython`
  • Java와 Python 코드를 통합하고자 할 때 -> `Jython`
  • 성능 최적화가 필요한 경우, 빠른 실행 속도를 원할 때 -> `PyPy`

 


✅ Java의 실행 과정

Java는 C언어와 다르게 컴파일 후 바이트코드로 변환하고, JVM 위에서 실행된다.

 

1️⃣ 컴파일

: 소스 코드를 바이트코드(.class)로 변환

 

Java 컴파일러(javac)는 소스 코드를 읽어 들여 JVM이 이해할 수 있는 바이트코드(.class 파일)로 컴파일한다.
이 바이트코드는 플랫폼에 독립적이며, 어디서든 JVM만 있다면 실행할 수 있다.

 


 

2️⃣ 클래스 로딩 및 링크

: JVM이 바이트코드를 메모리에 로드하고 링크

 

JVM이 클래스 로더를 통해 필요한 .class 파일들을 메모리에 적재한다.

이후 링크 단계에서 필요한 클래스들 간의 참조를 해결하고 초기화 과정을 수행한다.


3️⃣ 실행 (인터프리트 또는 JIT 컴파일)

: JVM이 바이트코드를 해석하거나 JIT 컴파일하여 실행

 

메모리에 적재된 바이트코드는 JVM에 의해 실행된다.

  • 인터프리터가 바이트코드를 한 줄씩 해석하며 실행하거나
  • JIT 컴파일러가 자주 사용되는 코드를 기계어로 변환해 실행 속도를 높입니다

 

Java에서 프로그램을 실행하면 내부적으로는 OS가 java 명령어로 JVM 프로세스를 생성하고,
JVM은 main 메서드가 포함된 클래스부터 실행을 시작한다.

 


 

✨ 추가 질문

[ fork(), exec() 시스템 콜 말고 다른 방식으로 프로세스를 적재할 수 있을까? ]

일반적으로는 fork()와 exec()을 통해 로더가 수행된다.

 

[ 링커와 로더의 차이 ]

- 링커: 오브젝트 파일을 결합해 하나의 실행 가능한 파일을 만드는 역할
- 로더: 실행 파일을 메모리에 적재하는 역할
반응형

'⚙️ CS > 운영체제' 카테고리의 다른 글

[운영체제] 데드락 (Deadlock)  (0) 2025.04.29
[운영체제] IPC  (0) 2025.04.29
[운영체제] 동기화  (0) 2025.04.29
[운영체제] 스케줄링  (0) 2025.04.28
'⚙️ CS/운영체제' 카테고리의 다른 글
  • [운영체제] 데드락 (Deadlock)
  • [운영체제] IPC
  • [운영체제] 동기화
  • [운영체제] 스케줄링
dev-heyjin
dev-heyjin
  • dev-heyjin
    개발 기록
    dev-heyjin
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • 🎯 Programming (8)
      • 💪 Algorithm (16)
      • ⚙️ CS (31)
        • 네트워크 (15)
        • 운영체제 (15)
        • 데이터베이스 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    데이터베이스
    DB
    해킹
    RDS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev-heyjin
[운영체제] 프로그램 실행 과정
상단으로

티스토리툴바