[CS] 프로그램 실행 과정

Joo·2024년 6월 24일

CS & Algorithm etc

목록 보기
3/33

프로그램 실행 과정

  1. 사용자가 프로그램 실행 요청
  2. 프로그램 정보를 읽어 메모리에 로드
  3. 프로그램이 실행되면 OS는 메모리(RAM)에 공간을 할당함
  4. 프로세스 생성
  5. CPU는 기계어 코드 실행
  6. 입출력 및 시스템 호출
  7. 프로그램 종료

1. 사용자가 프로그램 실행 요청

2. 프로그램 정보를 읽어 메모리에 로드

  • 운영체제(OS)는 프로그램 실행 파일을 하드디스크(HDD)나 SSD에서 찾아 읽음
  • 프로그램 실행 파일에는 코드, 데이터, 초기화된 데이터, 초기화되지않은 데이터 등 정보가 포함되어 있음
  • OS는 이 파일을 메모리(RAM)로 로드함 = "로딩"

3. 프로그램이 실행되면 OS는 메모리(RAM)에 공간을 할당함

  • OS는 프로그램이 실행되기 위해 필요한 메모리 공간을 할당함
  • 메모리는 프로그램의 코드, 데이터, 힙(Heap), 스택(Stack) 등으로 나누어짐
  • 코드 영역에는 실행할 명령어들이, 데이터 영역에는 초기화된 전역 변수들이, 힙 영역에는 동적으로 할당되는 메모리들이, 스택 영역에는 함수 호출과 관련된 정보들이 저장됨

4. 프로세스 생성

  • 메모리에 로드된 프로그램은 OS에 의해 프로세스로 생성됨
  • 프로세스는 실행 중인 프로그램의 인스턴스를 의미하고, 고유한 프로세스 ID를 가짐 (여러번 실행하면 인스턴스 여러개 생성)
    • 예를 들어, Chrome 브라우저를 세 번 실행해서 Google, Naver, Yahoo 각각에 접속했다면 똑같은 프로그램의 인스턴스가 3개 말들어짐
    • 인스턴스 각각을 식별하기 위해 프로세스라 부르고, 이 상황에서 프로세스 별 실행할 기계어 코드는 동일함
    • 실행됐을 때 사용자 명령이나 결과는 다르지만 CPU는 같은 내용을 연산함
    • 작업관리자에서 확인 가능
  • 프로세스에는 프로그램 카운터(PC), 레지스터, 스택 포인터 등의 정보가 포함되어 있음

5. CPU는 기계어 코드 실행

  • 메모리에 로드된 프로그램의 기계어 명령어들을 하나씩 읽어와서 실행
  • 프로그램 카운터(PC)는 현재 실행 중인 명령어 주소를 가리키며, 명령어가 실행될 때마다 다음 명령어의 주소로 업데이트 됨
  • CPU는 명령어를 실행해 연산을 수행하고, 결과를 메모리나 레지스터에 저장

6. 입출력 및 시스템 호출

  • 프로그램은 실행 중에 파일 입출력, 네트워크 통신, 사용자 입력 처리 등 작업 수행
  • 이러한 작업들은 시스템 호출 통해 OS 커널 모드에서 처리됨 (파일 읽거나 쓰는 작업은 파일 시스템 관리 기능 통해 이루어짐)

7. 프로그램 종료

  • 프로그램이 종료 명령 만나거나 사용자가 프로그램을 종료하면, 프로그램의 실행이 종료됨
  • OS는 프로그램이 사용하던 메모리와 자원들을 해제하고, 프로세스 종료시킴
  • 프로그램의 종료 상태는 OS에 의해 기록됨

* 주 기억 장치는 전원이 꺼지면 데이터가 사라짐 → 메모리(RAM)

* 보조 기억 장치는 데이터를 영구적으로 저장하는 데 사용됨 → HDD, SSD, USB 메모리, 외장 하드


메모리의 구조

프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간 네 가지

1. 스택(Stack) 영역

  • 함수 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역
  • 함수 호출과 함께 할당되며, 함수 호출 완료되면 소멸함
  • 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 함
  • push 동작으로 데이터 저장하고 pop 동작으로 데이터 인출함
  • LIFO(Last-In First-Out, 후입선출)에 따라 동작해서, 가장 늦게 저장된 데이터가 가장 먼저 인출됨 → 아이스크림 콘
  • 컴파일 타임에 따라 크기가 결정됨
  • 메모리의 높은 주소에서 낮은 주소 방향으로 할당됨
  • 그러다가 힙 영역을 침범하는 경우, stack overflow 발생 (데이터가 넘쳐 흐림)
  • 자료구조로서의 스택(깊이 우선 탐색(DFS))과 메모리 영역으로서의 스택

2. 힙(Heap) 영역

  • 사용자가 직접 관리할 수 있는, 관리해야 하는 메모리 영역
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨 (필요시 메모리 할당한다는 뜻)
  • FIFO(First-In First-Out, 선입선출)에 따라 동작해서, 가장 먼저 데이터가 가장 먼저 인출됨
  • 런타임에 따라 크기가 결정됨
  • 메모리의 낮은 주소에서 높은 주소 방향으로 할당됨
  • 그러다가 스택 영역 침범하는 경우, heap overflow 발생
  • 자료구조로서의 힙(너비 우선 탐색(BFS))과 메모리 영역으로서의 스택

3. 데이터 영역 / BSS 영역

  • 전역 변수와 정적 변수가 저장되는 영역
  • RAM의 데이터 영역에는 ROM의 데이터 영역에서 복사 및 초기화 된 전역 변수와 정적 변수 저장되어 있음
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함
  • 전역 변수와 정적 변수를 선언할 때, 값을 초기화했으면 데이터 영역에 생성되고, 초기화하지 않았으면 BSS 영역에 생성됨
    • BSS(Block Started by Symbol) 영역은 프로그램 실행 시작 전, OS 커널에 의해 0으로 자동 초기화됨
    • 전역 변수와 정적 변수를 프로그램 내에서 초기화하지 않아도 0으로 자동 초기화되는 이유!

* 정적 변수 : 특정 블록 내에서만 접근할 수 있는 변수로, 블록이 종료되더라도 값이 유지됨. 주로 함수 내에서 사용되어 함수 호출 간 값을 유지함.

4. 코드 영역

  • 실행한 프로그램의 코드가 저장되는 영역으로, text 영역이라고도 부름
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함

참조 : https://code4human.tistory.com/129

profile
적당히 공부한 거 정리하는 곳

0개의 댓글