CS05 - 메모리구조, CPU, 가상 메모리

Bibi·2022년 1월 18일
3

코드스쿼드

목록 보기
1/1

220117

CS05 - 메모리 모델

현대 운영체제들은 프로세스를 실행할 때 마다 프로세스 메모리 모델을 생성해 관리한다. 메모리 관리 모델에 대한 지식과 동작 방식을 이해하면 프로그래밍 언어 동작과 처리 흐름을 이해하는 데 도움이 된다.

메모리 구조 이해하기

CPU와 메모리

  • CPU에서는 연산을 하고,
  • 메모리에서는 연산에 필요한 정보저장을 한다.
  • CPU와 메모리는 연결되어 정보를 불러와 연산을 한 후 결과를 다시 메모리에 저장함

순차 접근과 임의 접근

램 RAM : Random Access Memory 라는 뜻이다.

  • 임의 접근 Random Access : 메모리 주소를 가지고 찾는 위치에 바로 접근하는 것 - 빠르다 (현대의 컴퓨터)
  • 순차 접근 Sequential Access : 처음부터 순서대로 메모리를 다 뒤지는 것 - 느리다(초기의 컴퓨터)

메모리 구조

메모리구조

https://babbab2.tistory.com/25

1. 스택 영역

  • 함수에 대한 정보를 저장한다 - 지역변수, 매개변수, 리턴값 등
  • 함수 종료(리턴) 시 저장된 메모리도 해제됨
  • 이름과 같이 후입선출 방식으로 저장된다.
  • 컴파일 타임에 결정됨 - 메모리 크기가 정해져 있음
  • CPU에 의해 관리 및 최적화됨 - 속도가 빠름

스택의 장점 : (힙에 비해) 속도가 빠름, 직접 메모리 해제를 할 필요가 없음

스택의 단점 : 메모리 크기의 제한, 지역변수만 액세스 가능

2. 힙 영역

동적으로 할당된 데이터들이 저장되는 공간

  • 동적 할당 = 프로그래머가 할당/해제하는 것
    • malloc, calloc 으로 메모리 할당
    • 할당 - 스위프트에서는 직접 할당하지 않음
    • 해제 - 스위프트에서는 ARC가 참조되지 않는 메모리를 해제해 줌
  • 참조 타입의 값이 저장됨 - 클래스 인스턴스, 클로저
  • 사용 후 메모리 해제를 하지 않으면 메모리 누수(memory leak) 발생
  • 유일하게 런타임에 결정됨 - 메모리 크기가 정해져 있지 않음

힙의 장점 : 메모리 크기 제한 없음, 모든 함수에서 액세스 가능 (전역 범위)

힙의 단점 : (스택에 비해) 속도가 느림, 메모리를 직접 관리해야 함(메모리 누수 위험)

3. 데이터 영역 - GVAR/BSS 영역

프로그램에 사용될 변수들 저장 - 전역변수 또는 static 변수

  • 프로그램 시작 시 할당, 종료 시 해제
  • BSS 영역 - 초기화되지 않은 전역변수들을 저장 - block started by symbol
  • GVAR(Data) 영역 - 초기화가 완료된 전역변수들을 저장

4. Text(Code) 영역

우리가 작성한 소스코드가 저장되는 공간

  • 컴파일러로 번역된 기계어 형태로 저장됨

힙과 스택의 메모리 관계

힙과 스택은 같은 메모리 영역을 공유함.

  • 힙은 낮은 메모리 주소부터 할당받음 (0x00000000 ...)
  • 스택은 높은 메모리 주소부터 할당받음 (0xffffffff ...)

ARC - Automatic Reference Counting

스위프트에서 사용되는 힙 메모리 관리 방식.

클래스 인스턴스가 더 이상 필요하지 않을 떄 (= 참조되지 않을 때) 메모리를 자동으로 해제해 준다.

메모리의 RC(Reference Count, 참조 횟수)를 계산해, 참조 횟수가 0이 되면 해제함.


CS05 - 메모리 모델 (수업)

컴퓨터 구조의 3요소 : CPU, 메모레, 입출력장치(I/O)

클락 clock

모든 하드웨어에 들어 있는 작은 시계.

수정체가 흔들리며 주기를 반복하는 역할

클락의 1주기마다 일을 한다. 즉 클락이 작업 단위이다.

클락 주기 : 오르락 + 내리락 이 1 주기임.

단위 : Hz(헤르츠). 1Hz = 오르락+내리락.

Hz가 높다 = 1초에 더 많은 일을 한다 = 더 성능이 좋다.

프로그램 실행 (로딩)

컴파일된 코드는 메모리에 올라간다.

메모리

메모리에는 명령어 저장 영역과 값 저장 영역이 나누어져 있다

  • Program : 프로그램이 올라가는 영역(컴파일된 코드) - 명령어
  • Data : 데이터가 올라가는 영역 (변수, 객체 등 바뀌는 값) - 값

메모리 1600MHz : 버스의 크기(1초에 얼마나 많은 데이터를 CPU와 주고받을 수 있느냐)

CPU( = 프로세서)

Central Process Unit?

CPU의 저장장치인 레지스터가 있고,

1클락마다 메모리에서 레지스터로 코드를 가져와 처리하는 역할을 한다.

레지스터 크기에 따라(bit) 몇 비트 CPU인지 결정된다 - 32bit, 64bit CPU

CPU에는 매우 다양한 종류의 레지스터가 존재한다. (보통 몇십개가 존재)

IR (Instruction)

CPU가 처리하는 작업 단위. (명령.)

명령어 + 오퍼랜드 로 IR이 구성된다.

CPU 입장에서 가장 중요한 명령어는

  • Load : 메모리 -> 레지스터, Store : 레지스터 -> 메모리
    • 한 클락 내에 끝나지 않는다. (느리다)
    • 이 명령이 많을수록 프로그램이 느려진다.
  • Branch : 조건문 및 분기문
    • Load, Store보다 더 느리다.

즉 변수를 많이 쓸수록 CPU 작업이 느려진다.

메모리 모델

프로그램 하나가 실행될 때, 운영체제가 메모리를 할당한다.

Stack Frame

함수 호출

Heap Allocation

힙 공간은 썼다 지웠다 하는 곳인데, 크고 작은 것을 섞어서 저장하다 보면 사용 효율이 떨어진다.

그래서 처음부터 "리전"을 나눠 작은/중간/큰 크기의 대상을 저장한다.

Virtual Memory 가상 메모리

프로그램을 많이 돌리려면 메모리가 많이 필요한데, 실제 물리 메모리는 턱없이 부족하다.

그래서

  • 현재 실행 중인 프로세스에 필요한 것만 메모리만 올려 사용한다.

  • 현재 실행 중이지 않은 프로세스에 필요한 것들은 가상 메모리에 페이지 단위로 따로 저장해 준다. - 실제 물리 메모리가 아닌 별도 공간에 저장

빠르게 움직이는 클락 주기에 맞춰 메모리에 올라가는 작업들을 매 순간 바꿔치기 하기 때문에, 인간은 동시에 실행되고 있다고 느끼는 것이다.

Stack Overflow와 Out of Memory

힙과 스택은 한 메모리를 공유한다.

  • 스택오버플로우 : 스택에 함수를 호출하고 호출하고 호출하고.. 하다가 더 이상 호출할 수 있는 메모리가 남아 있지 않을 때 발생
  • Out of Memory (힙오버플로우) : 객체를 생성하고 생성하고 생성하고.. 하다가 더 이상 생성할 수 있는 메모리가 남아 있지 않을 때 발생

둘 다 프로그램을 죽이는 오류이므로, 발생하지 않도록 해야 한다.

메모리를 적게 쓸 수 있는 방법으로 동작하도록 메모리 사용량 확인과 알고리즘 공부가 필요하다.


힙 영역 사용 (malloc함수, free함수)

힙 영역이 사용되는 과정.. (C언어 기준)

  • malloc() : 메모리에(m) 할당(alloc) 하는 함수
    • 매개변수의 크기만큼 메모리 공간을 할당받는다.
  • free() : 메모리에서 해제하는 함수
    • 메모리를 할당받은 대상인 매개변수를 메모리에서 해제한다.
  1. malloc()을 통해 어떤 변수 사용을 위해 메모리 공간을 일정 크기만큼 할당받는다.
  2. 할당받은 메모리를 이용해 필요한 작업을 한다.
  3. free()를 통해 할당받았던 메모리 공간을 해제한다.
    1. 이를 하지 않으면 메모리가 계속 점유되어 있어 메모리 누수가 발생한다.

가상메모리 관리 방식 (리눅스 기준)

가상메모리란?

메모리 관리 방식의 하나.

각 프로그램에 물리적 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식.

왜 사용하나?

  • 논리적으로 메모리를 확장해 사용 가능
    • 물리 메모리의 공간을 확장해 사용 가능
    • (실제 물리 메모리의 공간 이상으로 데이터를 저장하는 건 아님)
    • 연속적으로 가상 메모리에 매핑할 수 있음
  • 물리 메모리 공간을 매번 파악할 필요가 없어 효율적
    • 유저는 가상 메모리 공간만 신경쓰면 되고, 나머지는 OS가 알아서 관리해 줌
  • 메모리 관리에 효율적
    • 연속적이지 않은 메모리를 논리적으로 연속적인 메모리 형태로 사용 가능 - 처리속도 더 빠름

페이지, 프레임, 세그먼트

  • 프레임 Frame : 물리 메모리의 단위 (실제 메모리 블록)

  • 페이지 Page : 가상 메모리의 단위

    • 하드웨어에 의해 정해진 고정 사이즈
    • 페이징 기법 : 메모리의 효율적 사용을 위한 관리 기법
  • 세그먼트 Segment : 프로그램의 논리적 단위

    • 세그먼테이션 기법 : 프로그램의 논리적 단위를 나눠 서로 침범하지 않도록 보호해 주는 기법

페이지 사이즈 = 프레임 사이즈 (32bit 기준 4kb)

실제 메모리 관리에서는 페이징 + 세그먼테이션 기법을 혼용함.

MMU

Memory Management Unit

: 가상 주소를 물리 주소로 변환하는 작업을 수행하는 하드웨어.

CPU 코어 내부에 있다.

  • 동작하는 프로세스는 OS가 준 가상 메모리 주소만을 본다.
  • 실제 데이터는 (가상 메모리가 아닌) 물리메모리(RAM) 또는 디스크에 저장된다.
  • 실제 데이터 처리를 위해 가상 메모리 주소 -> 물리 메모리 주소 의 변환 과정이 필요하다 - 페이지 테이블

페이지 테이블

가상 메모리 주소를 물리 메모리 주소로 변환해 주는 표.

  • 가상 메모리 주소 : VPN + Data Offset 로 구성
    • VPN : Virtual Page Number - 가상 주소
    • Data Offset : 오프셋
  • 페이지 테이블 : VPN 을 인덱스로 하는 물리 메모리 주소를 알려준다.
  • 물리 메모리 주소 : 페이지 테이블로부터 도출한 물리 메모리 주소 + Data Offset 을 이용해 실제 물리 메모리 주소를 찾아간다.

페이지 테이블을 이용해 연속적 처리가 가능해진다.

0개의 댓글