6회차 운영체제 | 메모리 구조 관련 내용 정리

728x90
메모리구조/ 스택/ 힙/ 데이터/ 코드 영역 - 선언하면 어느쪽에 저장되는지 설명하기

메모리 계층 구조 | 기억 장치의 계층 구조

기억장치 계층구조 설명

1) CPU의 레지스터 (Register)

  • 레지스터는 CPU에 위치한 고속 메모리. CPU가 바로 사용할 수 있는 데이터 저장

레지스터 부연설명
CPU 내부

CPU(Center Process Unit) | 중앙 처리 장치
: 컴퓨터에서 기억, 해석, 연산, 제어 4대 주요 기능 관활하는 컴퓨터의 대뇌 장치
CU(Control Unit) | 제어 장치
: CPU의 한 부품으로, 입출력 장치 간 통신 조율을 제어명령어 읽고 해석, 데이터 처리 위한 순서 결정
ALU (Arthmetic Logic Unit) | 산술 논리 장치
: 산술 연산, 논리 연산 계산하는 디지털 회로

2) 캐시 | Cache

  • 캐시는 메인 메모리 접근 빠르게 하기 위해 CPU 칩 내부 or 바로 옆에 탑재하는 작은 메모리
[캐시의 종류]
1) L1 캐시
일반적으로 코어 안에 내장되어 데이터 사용/참조에 가장 먼저 사용CPU가 가장 빠르게 접근하며 L1캐시에서 데이터 못찾으면 L2 캐시를 참조함
2) L2 캐시
L1에 비해 상대적 속도는 느리고, L1에 비해 상대적으로 더 저장 가능
3) L3 캐시
웬만한 프로세서에서는 L3 캐시 메모리는 사용 X (L2 캐시로도 충분히 커버 가능해서)

3) 주 기억 장치 (메인 메모리)

주기억장치로서, 컴퓨터에서 수치, 명령, 자료 등을 기억하는 컴퓨터 하드웨어 장치

보통 하드디스크로부터 일정량의 데이터 복사해서 임시 저장하고, 필요시마다 CPU에 빠르게 전달함

[메인 메모리 구성]
1) RAM (Random Access Memory)
: 빠른 접근 위해 데이터 단기간 저장휘발성 기억 장치 (전원 종료 시 삭제)
2) ROM (Read Only Memory)
: 영구 저장 장치

4) 보조 기억장치

  • 하드 디스크 드라이브 (HDD) : 비휘발성 데이터 저장소, 용량 대비 가격 가장 저렴
  • 솔리드 스테이트 드라이브 (SDD) : HDD보다 더 빨리 데이터 읽고, 쓰고, 액세스 가능

메모리 계층 구조의 필요성

  1. 참조의 지역성 (자주 쓰이는 데이터는 계속 쓰임)
  2. 경제성 :상위 계층 메모리일수록 더 비쌈
  3. 디코딩 (명령어 해독) 속도

→ CPU는 작은 메모리에 더 빨리 접근 가능한데, 큰 메모리 용량만 사용할 경우 디코딩 시간 많이 소요됨


→ 메모리 계층 구조 중에서도 ‘메인 메모리’의 구조를 살펴보자.

(메인) 메모리 구조

기본적으로 프로그램이 실행 중 상태인 ‘프로세스’가 되기 위해선 프로그램을 메모리(메인 메모리)로 가져와야 한다.

  • 메인 메모리는 일반적으로 두 개의 부분으로 나뉘어지는데, 하나는 운영체제를 위한 것이고, 다른 하나는 사용자 프로세스를 위한 것이다.
  • 크게 커널 영역과 유저 영역으로 구분된다 .
  • 커널 영(메모라 상위 주소부터 저장), 유저 영역(메모리 하위 주소부터 저장)

구분하는 이유 : 상호 접근 통제 (침범 X)

메인 메모리의 구조

1. 유저 영역의 메모리 구조

→ 운영체제는 (실행 프로그램을 위해) 유저 영역 안에서도 메모리의 공간을 4가지 구조로 둔다.

유저 영역의 메모리 구조

1) 코드 영역 | Code

  • 사용자가 작성한 프로그램 코드가 (CPU에서 실행할 수 있는) 기계어 명령 형태로 변환되어 저장되는 공간
  • 사용자 작성 코드 (명령문, 제어문, 함수 등)
  • 컴파일 타임에 결정되고 중간에 코드 바꿀 수 없도록 RO(Read Only)로 되어있음
  • 추후에 CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리

2) 데이터 영역 | Data

생명 주기 : 데이터 영역은 프로그램의 시작과 함께 할당, 프로그램 종료 시 소멸

   2-1) BSS segments (Block Started by Symbol)

  • 명시적으로 초기화 되지 않은 X 전역 및 정적 변수들이 저장됨
  • 프로그램 시작 시, BSS 영역 변수들은 자동 0으로 초기화됨

   2-2) Data segments

  • 명시적으로 초기화된 O 전역 및 정적 변수들이 저장됨
  • 프로그램 시작 시, 데이터 영역 변수들은 초기값에 따라 초기화됨

3) 스택 영역 | Stack

  • 호출된 함수 수행 마치고 ‘복귀할 주소 및 데이터(지역변수, 매개변수,리턴값 등)을 임시로 저장하는 공간

생명 주기 : 함수의 호출과 함께 할당. 함수 종료와 함께 소멸

  • 스택 영역에 저장되는 함수의 호출 정보 ‘스택 프레임’
  • LIFO 후입선출 구조. 컴파일 단계에서 스택 영역 크기 결정됨. 그래서 무한정 할당 X

→ 재귀함수 반복 호출, 함수가 지역변수를 메모리 초과할 정도로 多 가진 경우 ‘스택 오버플로우’

(커널 영역 보호 위해) 메모의 높은 주소 → 낮은 주소 방향으로 메모리 할당됨

4) 힙 영역 | Heap

  • 프로그래머가 필요할 때마다 사용하는 메모리 영역

생명 주기 : 메모리 공간이 사용자에 의해 동적 할당, 해제됨 (런타임 단계에서 크기 결정됨)

(커널 영역 보호 위해) 메모리 낮은 주소 → 높은 주소 방향으로 메모리 할당됨

💡 스택과 힙 영역이 서로 상대의 영역 침범해도 스택 오버플로우, 힙 오버플로우 발생함
💡 유저 영역보다 높은 주소에 ‘커널 영역’이 있기 때문에 커널 영역을 보호하기 위해 유저의 스택은 높은 주소에서 낮은 주소로 할당되고, 힙은 낮은 주소에서 높은 주소 방향으로 할당되는 거다. 
 결과적으로 커널 영역의 반대로 데이터가 저장되기 떄문에 커널 영역을 침범할 수 없다.

2. 커널 영역의 메모리 구조

메인 메모리 구조 중 커널 영역

1) 코드 영역 (커널 코드)

  • 시스템 콜/ 인터럽트 처리 코드, 자원 관리 위한 코드, 편리한 인터페이스 제공 위한 코드

2) 데이터 영역

  • 모든 하드웨어들 (CPU, 메모리) 관리하기 위한 자료구조
  • 모든 프로세스들 관리하기 위한 자료구조 (PCB)

3) 스택 영역 (커널 스택)

  • 각 프로세스마다 별도로 두고 있는 프로세스 커널 스택
  • OS 커널이 프로세스 실행 중에 사용하는 스택
728x90