CS Operating System - Process Address Space

Huisu·2025년 1월 16일
0

CS

목록 보기
12/25
post-thumbnail

프로세스 주소 공간에 대해 설명해 주세요.

프로세스 주소 공간이란 무엇인가요?

프로세스가 메모리를 할당받으면, 자신만의 방법으로 메모리를 관리하기 위해 이 공간들을 어떤 구조로 관리하는데, 이를 프로세스 주소 공간이라고 한다. 메모리는 한정되어 있기 때문에 프로세스는 다양한 방법으로 메모리를 절약하려고 시도한다.

https://velog.velcdn.com/images%2Fklm03025%2Fpost%2Fcd3ef853-de73-4a07-b062-263ff9d1acdc%2Fimage.png

  • Stack 영역
    • 함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역
    • Stack 영역의 값은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
    • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
    • 재귀 함수가 너무 깊게 호출되거나 함수가 지역 변수를 너무 많이 가지고 있어 Stack 영역을 초과하면 Stack Overflow가 발생
  • Heap 영역
    • 런타임에 크기가 결정되는 영역
    • 사용자에 의해 공간이 동적으로 할당 및 해제
    • 주로 참조형 데이터 등의 데이터가 할당
    • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
  • Data 영역
    • 전역 변수나 Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역
    • 어떤 프로그램에 전역/Static 변수를 참조하는 코드가 존재한다면 이 프로그램은 컴파일된 후에 data 영역을 참조
    • 프로그램의 시작과 함꼐 할당되며 프로그램이 종료되면 소멸
    • 초기화하지 않은 변수가 존재한다면 이는 BSS에 저장
  • Text 영역
    • 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
    • 프로그램이 수정되면 안 되기에 ReadOnly 상태로 저장

초기화하지 않은 변수들은 어디에 저장될까요?

전역 변수와 정적 변수는 데이터 영역의 BSS 영역에 저장된다.

지역 변수는 Stack 영역에 저장된다.

일반적인 주소 공간 그림처럼 Stack과 Heap의 크기는 매우 크다고 할 수 있을까요? 그렇지 않다면 그 크기는 언제 결정될까요?

Stack은 생성과 동시에 크기가 정해진다.

Heap은 필요에 따라 동적으로 확장 혹은 축소를 하게 된다.

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

Stack에서 할당의 의미는 이미 생성되어 있는 Stack에 대해 포인터의 위치만 바꿔 주는 단순한 CPU Instruction이다.

반면 Heap에서의 할당은 요청된 chuck의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기 떄문에 더 많은 CPU Instruction이 필요하다.

따라서 Stack이 더 빠르다고 할 수 있다.

다음과 같이 공간을 분할하는 이유가 있을까요?

데이터를 공유하고 자료 구조의 특성을 활용하기 위해서다.

Code 영역 같은 경우 같은 프로그램 자체에서 모두 같이 사용하기 때문에 공유하여 관리하고, Stack 영역에서는 스택 구조의 특성을 활용하기 위해서이다.

또한 Data 영역에서는 전역 변수를 따로 저장해 프로그램의 여러 함수들에서 모두 참조할 수 있다.

스레드의 주소 공간은 어떻게 구성되어 있을까요?

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6xNT5%2Fbtq4qFkQwpy%2FK72YbmktrUHgkfRNEgZxm0%2Fimg.png

스레드는 자신이 속하는 프로세스의 Stack 영역만 복사해서 가져오고, 나머지 Code 영역 Data 영역 Heap 영역은 공유하여 사용한다.

이 외에도 각 스레드는 스레드 로컬 스토리지(TLS)라는 고유한 데이터 영역을 가질 수 있다. 이는 각 스레드가 자신만의 전역 변수를 가질 수 있게 한다.

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

Stack 메모리 영역과 Heap 메모리 영역은 이름이 같은 자료구조와는 몇 가지 공통점이 있지만, 그렇다고 완전히 같은 개념은 아니다.

Stack 영역: 이 영역은 자료구조의 스택처럼 후입선출 방식으로 동작한다. 함수가 호출되면, 해당 함수의 지역 변수와 매개변수, 반환 주소 등이 스택에 쌓이고, 함수가 종료되면 그 정보는 제거된다. 즉, 가장 최근에 들어온 데이터가 가장 먼저 나가는 구조이다.

Heap 영역: 이 영역은 자료구조의 힙과는 다르게 동작한다. 자료구조의 힙은 자료의 우선순위에 따라 정렬되는 반면, 메모리의 힙 영역은 동적으로 메모리를 할당하고 해제하는 역할을 한다. 따라서 자료구조의 힙과는 직접적인 연관이 없다.

IPC의 Shared Memory 기법은 프로세스 주소 공간의 어디에 들어가나요? 그 이유가 있을까요?

IPC의 Shared Memory 기법은, 말 그대로 두 개 이상의 프로세스가 메모리를 공유하는 방식이다. 이 공유 메모리는 일반적으로 프로세스의 힙 영역에 할당된다.

동적 할당: 힙 영역은 동적 메모리 할당을 위한 공간이다. 공유 메모리의 크기는 프로세스 간의 통신 요구 사항에 따라 다르므로, 이를 동적으로 할당받을 수 있는 힙 영역에 위치하는 것이 적합하다.

생명주기 관리: 공유 메모리는 생성된 후에는 여러 프로세스가 접근할 수 있으며, 모든 프로세스가 사용을 완료한 후에 해제된다. 이는 힙 영역의 메모리가 프로그래머에 의해 명시적으로 할당/해제되는 방식과 일치한다.

Stack과 Heap 영역의 크기는 언제 결정되나요? 프로그램 개발자가 아닌, 사용자가 이 공간의 크기를 수정할 수 있나요?

Stack은 생성과 동시에 크기가 정해진다.

Heap은 필요에 따라 동적으로 확장 혹은 축소를 하게 된다.

일반적으로 프로그램 사용자가 직접 스택과 힙의 크기를 수정하는 것은 불가능하다. 이들 영역의 크기는 운영체제의 메모리 관리 정책과 프로그램의 코드에 의해 결정되고 사용자는 그저 사용할 뿐이다.

그러나 고급 사용자나 관리자는 운영체제의 설정을 통해 이러한 값들을 변경할 수 있을 수 있다. 예를 들어, Linux에서는 'ulimit' 명령을 사용하여 프로세스의 스택 크기를 조정할 수 있다.

0개의 댓글