Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions 02-OPERATING_SYSTEM/Process Address Space.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Process Address Space
## 💡 프로세스 주소공간에 대해 설명해주세요.

<p align="center"><img src="https://github.com/RecoRecoNi/Tech-Interview/assets/63551948/76522482-2055-4326-ba25-cc157b490913" align="center" width="50%"></p>

`프로세스 주소 공간(Process Address Space)`은 컴퓨터에서 실행 중인 각 프로세스가 메모리에서 사용하는 공간을 나타냅니다. 하나의 프로세스는 메모리의 사용자 영역에 크게 `코드 영역`, `데이터 영역`, `힙 영역`,`스택 영역`으로 나뉘어 저장됩니다.

- `코드(Code) 영역`
- 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장되며 text 영역이라고도 합니다. 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어있습니다. (읽기 전용 공간)
- `데이터(Data) 영역`
- 잠깐 썼다가 없앨 데이터가 아닌 **프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간**입니다. **전역 변수**가 대표적입니다.
- 코드 영역과 데이터 영역은 크기가 고정된 영역이라는 점에서 **정적 할당 영역**이라고도 부릅니다.
- `힙(Heap) 영역`
- 프로그래머가 직접 할당할 수 있는 저장 공간입니다. 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 합니다.
- `스택(Stack) 영역`
- 데이터를 일시적으로 저장하는 공간입니다. 함수의 실행이 끝나면 사라지는 **매개 변수**,**지역 변수** 등이 저장됩니다.
- 힙 영역과 스택 영역은 실시간으로 그 크기가 변할 수 있기 때문에 **동적 할당 영역**이라고 부릅니다.

<br>

## 📑 꼬리질문
### 초기화 하지 않은 변수들은 어디에 저장될까요?
<p align="center"><img src="https://github.com/RecoRecoNi/Tech-Interview/assets/63551948/84f39c52-7f0e-4847-8c28-8944dd7f8736" align="center" width="50%"></p>

- 프로세스의 데이터 영역(Data Segment) 중에서 `BSS(Block Started by Symbol)` 섹션에 저장됩니다.
- 이 섹션은 프로세스의 메모리 공간에서 초기화 되지 않은 **전역 변수, 배열, 정적 변수 등**을 저장하는데 사용됩니다.

### 일반적인 주소공간 그림처럼, Stack과 Heap의 크기는 매우 크다고 할 수 있을까요? 그렇지 않다면, 그 크기는 언제 결정될까요?
- 무조건적으로 크기가 크다고 할 수는 없지만 data와 code 영역은 프로그램 실행 전에 이미 정의되고 크기가 결정되는 **정적 할당 영역**이며, stack과 heap 영역은 프로그램 실행 중에 **동적으로 관리**되므로 상대적으로 작거나 큰 경우가 있을 수 있습니다.

- `Stack`은 함수의 호출과 관계있는 **지역 변수**와 **매개 변수**가 저장되는 영역으로 **컴파일 타임에 크기가 결정**되고 `Heap`은 **런타임에 크기가 결정되는 메모리 영역**입니다.

### Stack과 Heap 공간에 대해, 접근 속도가 더 빠른 공간은 어디일까요?

- `Stack`은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않기 때문에 **접근이 매우 빠릅니다.**
- `Heap`은 메모리를 직접 관리해야하기 때문에 Stack에 비해 **접근 속도가 느립니다.**

### 다음과 같이 공간을 분할하는 이유가 있을까요?
- **데이터를 공유하여 메모리 사용량을 줄이기** 위해서입니다.
- `Code` 영역은 같은 프로그램 내에서 모두 같고, 수정될 일이 없기 때문에 따로 관리하여 공유하고, `Stack` 영역과 `Data` 영역을 나누어 지역변수와 전역변수를 보다 효율적으로 활용할 수 있도록 합니다.
- 또한 여러 스레드가 하나의 프로세스를 독립적으로 제어하기 위한 영역 외의 공통되는 `Code` 영역, `Data` 영역, `Heap` 영역을 공유하여 메모리를 절약하기 위함입니다.

### 스레드의 주소공간은 어떻게 구성되어 있을까요?
<p align="center"><img src="https://github.com/RecoRecoNi/Tech-Interview/assets/63551948/37951b77-4e67-4ba0-8814-e85e298edb08" align="center" width="50%"></p>

`스레드 주소 공간`
스레드 주소 공간이란 스레드가 생성되고 실행되는 동안 접근 가능한 메모리 영역으로 프로세스 주소 공간 내에 형성합니다.

- `코드 영역` : 스레드가 실행할 작업의 함수가 있으며 스레드는 프로세스 코드 영역에 있는 다른 모든 함수를 호출 할 수 있습니다.
- `데이터 영역` : 개별 스레드 전용 공간인 스레드 로컬 스토리지와 프로세스에 의해 공유되는 변수 공간이 있습니다.
- `힙 영역` : 모든 스레드가 동적 할당을 받는 공간으로 프로세스의 힙 공간을 사용합니다.
- `스택 영역` : 프로세스 스택의 일부분을 할당합니다.

### "스택"영역과 "힙"영역은 정말 자료구조의 스택/힙과 연관이 있는 걸까요? 만약 그렇다면, 각 주소공간의 동작과정과 연계해서 설명해 주세요.

- `Stack` 영역의 동작은 LIFO(Last In First Out) 원칙에 따라 메모리의 함수 호출과 관련된 변수, 함수 호출 정보, 복귀 주소 등을 입출력하는 측면에서 자료구조의 Stack과 연관이 있습니다.
- `Heap` 영역의 동작은 프로그램의 실행 중에 사용자에 의해 동적으로 할당되고 해제되는 방식으로 객체를 관리하는 특징이 있습니다. 따라서 자료구조의 Heap과는 연관이 없습니다.

### IPC의 Shared Memory 기법은 프로세스 주소공간의 어디에 들어가나요? 그런 이유가 있을까요?
- `Shared Memory`는 여러 프로세스가 동시에 접근할 수 있는 메모리 영역으로, **공유 메모리 세션**에 위치하게 됩니다.
- 공유 메모리 섹션은 프로세스의 코드(Code), 데이터(Data), 스택(Stack), 또는 힙(Heap) 중 어느 부분에도 직접 위치하지 않습니다.
- 공유 메모리 세션은 메모리에서 독립적으로 관리되며 저장하는 데이터는 각각의 프로세스 주소 공간에 매핑 될 수 있습니다.
- `데이터 세그먼트(Data Segment)`: 공유 데이터(공유 메모리에 저장된 데이터)는 프로세스의 데이터 세그먼트에 매핑됩니다. 이렇게 하면 프로세스가 공유 데이터를 읽고 쓸 수 있습니다.
- `힙(Heap)`: 공유 메모리 섹션을 힙에 매핑하여 동적으로 할당된 데이터를 저장할 수 있습니다. 이는 동적으로 생성되는 데이터 구조 또는 공유 자원에 접근하기 위해 사용될 수 있습니다.
- `기타 세그먼트`: 코드 세그먼트나 스택 세그먼트에 공유 메모리 섹션을 직접 매핑하는 것은 일반적이지 않습니다. 코드 세그먼트는 프로그램 코드를 저장하고, 스택 세그먼트는 함수 호출과 관련된 데이터를 저장하는 데 사용됩니다. 공유 데이터는 주로 데이터 세그먼트나 힙에서 관리됩니다.

<br>

## 🐍 꼬꼬무
### Python에서는 Stack과 Heap 영역을 어떻게 구분할까요?
- 파이썬은 Stack영역과 Heap 영역의 **관리를 추상화** 한 언어입니다.
- 따라서 개발자가 **직접 스택 및 힙을 명시적으로 제어**하지 않고, 파이썬 인터프리터와 가비지 컬렉터가 메모리를 관리합니다.
- 세부적으로, 대부분의 참조자는 Stack 영역에 생성되고, 객체는 heap 영역에 생성됩니다.

- 대부분 참조자는 Stack 영역에 생성되고 객체는 heap 영역에 생성된다.
<p align="center"><img src="https://github.com/RecoRecoNi/Tech-Interview/assets/63551948/31025b16-6cee-4e45-9469-e76e33392536" align="center" width="50%"></p>

### Stack과 Heap 공간에 대해, 할당 속도가 더 빠른 공간은 어디일까요?

- 스택은 이미 할당되어있는 공간을 사용하는 것이고 힙은 사용자가 따로 할당해서 사용 할 수 있는 공간이기 때문에 스택이 훨씬 빠릅니다.
- 스택에서 할당의 의미는 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU Instruction입니다.
- 힙에서의 할당의 의미는 요청된 Chunk의 크기, 현재 메모리 Fragmentation 상황 등 다양한 요소를 고려하기 때문에 더 많은 CPU Instruction이 필요합니다.

### 왜 초기화 하지 않은 변수들을 BSS 섹션에 저장할까요 (data영역과 bss 영역을 구분 하는 이유)?
- 초기화가 되지 않는 변수는 프로그램이 실행될때 값은 저장하지 않고 저장될 영역만 잡아주면 됩니다.
- 초기화된 변수는 그 값도 프로그램에 저장하고 있어야 하기때문에 두 가지를 구분해서 영역을 잡아줍니다.
- 이것이 bss영역과 data 영역을 구분하는 이유입니다.

- 따라서 이러한 bss영역 변수들은 많아져도 프로그램의 실행 코드 사이즈를 늘이지 않게 됩니다.

<br>

## 📚 Reference

- [티스토리 - 프로세스(Process)의 주소공간(Address Space)](https://whereisusb.tistory.com/10)
- [티스토리 - 프로세스 주소 공간에 대해 설명해주세요](https://seongeun-it.tistory.com/181)
- [벨로그 - [운영체제] 프로세스 주소 공간](https://velog.io/@klm03025/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A3%BC%EC%86%8C-%EA%B3%B5%EA%B0%84)
- [티스토리 - 27. 프로세스 - IPC 기법(shared memory)](https://devraphy.tistory.com/418)
- [벨로그 - [운영체제] 프로세스 주소공간](https://velog.io/@klloo/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A3%BC%EC%86%8C%EA%B3%B5%EA%B0%84)
- [티스토리 - [OS] 프로세스 주소 공간](https://dar0m.tistory.com/258)
- [티스토리 - 힙(Heap)과 스택(Stack)의 최대 할당 크기](https://bozeury.tistory.com/90)
- [벨로그 - 메모리 구조를 알아보자](https://velog.io/@hidaehyunlee/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90)
- [티스토리 - 스레드의 공유자원 관리(동기화)](https://development-sehee.tistory.com/24)
- [티스토리 - [OS] 프로세스 간 통신(Inter-Process Communication,IPC)](https://junghyungil.tistory.com/146)
- [티스토리 - CS - 메모리 구조(feat.스택 Vs 힙](https://leemyungjic.tistory.com/26)
- [티스토리 - 스택과 힙 메모리 영역,Stack Heap Memory](https://luv-n-interest.tistory.com/1046)
- [티스토리 - #3 python의 메모리 할당과 관리](https://hkim-data.tistory.com/182)
- [티스토리 - 운영체제 - Process](https://dev-ahn.tistory.com/15)