프로그램 실행 과정
- 사용자가 프로그램 실행 요청
- 프로그램 정보를 읽어 메모리에 로드
- 프로그램이 실행되면 OS는 메모리(RAM)에 공간을 할당함
- 프로세스 생성
- CPU는 기계어 코드 실행
- 입출력 및 시스템 호출
- 프로그램 종료
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