일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Swift
- android java
- 커스텀팝업
- 백준
- 버블정렬
- Xcode
- 플러터
- Android
- customPopup
- label
- swift baekjoon
- deeplink
- 안드로이드
- text to speech
- 안드로이드스튜디오
- 자바
- C언어
- IOS
- 연결리스트
- xocde
- 예외처리
- FLUTTER
- storyboard
- 보호와 보안
- Firebase
- TextField
- BAEKJOON
- 링크드리스트
- 준코딩
- Android Studio
- Today
- Total
준코딩
주 메모리 & 가상 메모리 본문
메모리?
:메모리는 기억장치라는 뜻을 가지고 있다. 원하는 작업을 컴퓨터에서 처리하기 위해서는, 처리대상의 내용이나
처리결과를 잠시 기억하고 있어야 할 필요성이 생기는데, 이때 메모리가 사용된다.
CPU에 의해 제어된 장치로 즉시 필요한 프로그램이나 데이터가 기억됨
->일반적으로 컴퓨터에서 메모리라고 하면 메인메모리(주기억장치)를 가리킵니다.
주기억장치의 종류
-캐쉬메모리, RAM, ROM, 등등
기본 하드웨어
-주 메모리와 처리기에 내장되어 있는 레지스터들은 CPU가 직접 접근할 수 있는 유일한 저장장치 이다.
모든 실행되는 명령어와 데이터들을 CPU가 직접적으로 접근할 수 있는 주 메모리와 레지스터에 있어야 한다.
만약 데이터가 메모리에 없다면 CPU가 데이터를 처리하기 전에 메모리로 이동시켜야 한다.
주소 연계(Address Binding)
-데이터의 주소를 결정하는 것, 물리적 메모리의 어느 부분에 적재할 지 결정하는 것
연계 되는 순간에 따라 3가지로 분류
1.컴파일 시간 연계(compile time): 물리적인 메모리가 많아도 이미 주소가 결정되어 변경할 수 없는 비효율적인 방법
2.적재 시간 연계(load time): 프로그램이 실행 되었을 때 연계가 이루어진다.
3.실행 시간 연계(execution time): 현재 사용하는 방법, 프로그램이 실행된 후에도 주소를 변경할 수 있다.
논리 대 물리주소 공간(logical, Physical address space)
-CPU는 보통 논리주소로 접근한다.
-메모리에 주어지는 주소는 물리주소이다.
컴파일 시간 연계, 적재 시간 연계 는 동일한 가상/물리 주소를 가지지만 실행 시간 연계는 두 개가 서로 다르다.
->프로그램의 실행 중에는 이와 같은 가상 주소를 물리 주소로 변환해야 하는데 이 변환 작업은 하드웨어 장치인
메모리 관리기(MMU: Memory Management Unit)에 의해 실행된다.
동적 적재(Dynamic Loading)
-메모리 공간을 효율적으로 이용하기 위해서는 동적 적재를 해야 한다.
-프로그램 실행에 반드시 필요한 루틴/데이터만 적재하는 것
스와핑
-프로세스가 실행되기 위해서 메모리에 있어야 하지만 필요한 경우 프로세스는 실행 도중에 임시로 보조 메모리로
교체되어 나갔다가 다시 메모리로 되돌아 올 수 있다.
연속 메모리 할당
-주 메모리는 운영체제뿐만 아니라 여러 사용자 프로세스도 수용해야 한다.
그리고 이 각 영역은 목적에 맞도록 효율적으로 관리되어야 한다.
-메모리를 분할하여 여러 개의 프로그램을 수용하여 다중 프로그래밍
가능하게 하는 것
페이징
-논리주소 공간이 연속된 하나의 공간에 모두 모여 있어야 한다는 제약을 없앤다.
->디스크에 연속적인 공간이 있는지 찾을 필요가 없다.
세그먼테이션
-페이징처럼 메모리를 같은 크기가 아닌 서로 다른 크기의 논리적 단위인 세그먼트로 분할 한다.
-세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법처럼 미리 분할해 둘 수 없고,
메모리에 적재될 때 빈 공간을 찾아 할당하는 기법
가상 메모리?
-어떤 프로세스를 실행할 때 프로세스 전체가 메모리에 적재되지 않고도 실행이 가능하도록 하는 기법
->필요한 부분만 메모리에 적재 되면 실행이 가능하기 때문에 물리 메모리 용량을 초과하는 프로그램도 동작 가능.
-대체로 가상 메모리 = “요구 페이징” 을 의미함
->CPU가 처리하는데 필요한 페이지만 즉, 요구되는 페이지만 메모리에 적재하는 것
요구 페이징(Demand Paging)
->초기에 필요한 것들만 적재하고, 페이지들이 실행 과정에서 실제로 필요할 때 적재하는 기법
장점
1.실제 필요한 페이지들만 메모리로 읽어오므로 사용되지 않는 페이지를 메모리로 가져오지 않음으로써
시간 낭비와 메모리 공간 낭비를 줄일 수 있다.
2.프로세스가 메모리에 존재하는 페이지들만 접근하는 한 실행은 정상적으로 진행된다.
-> 메모리에 없는 페이지를 접근하려고 하면 “페이지 부재 트랩”을 발생 시킨다.
쓰기-시-복사(Copy on write)
-fork() 를 할 때, 처음에는 메모리내의 같은 페이지를 공유한다.
만약 둘 중 하나가 공유중인 페이지 내용을 바꾸려고 하면, 그때 복사한다.
->복사된 페이지만 바꿈 으로서 효율 개선 가능
페이지 교체(Page Replacement)
-페이지 부재가 발생했을 때 필요한 페이지를 적재해야 하는데, 이때 모든 페이지 프레임이 사용 중 이면
어떤 페이지 프레임을 선택하여 교체할 것인지를 결정하는 기법이다.
기법 종류
1.OPT(OPTimal replacement, 최적 교체)
-가장 오랫동안 사용하지 않을 페이지를 교체하는 기법
->각 페이지의 호출 순서와 참조상황을 미리 예측해야 하므로 실현 가능성이 낮다.
2.FIFO(First In First Out)
-각 페이지가 적재될 때마다 그때의 시간을 기억시켜 가장 먼저 들어와서 가장 오래 있었던 페이지를 교체하는 기법
->이해하기 쉽고, 프로그래밍 및 설계가 간단하다.
3.LRU(Least Recently Used)
-최근에 가장 오랫동안 사용하지 않은 페이지를 교체하는 기법
->각 페이지마다 계수기(Counter)나 스택(Stack)을 두어 현 시점에서 가장 오랫동안 사용하지 않은, 즉 가장 오래전에
사용된 페이지를 교체한다.(계수기나 스택과 같은 별도의 하드웨어가 필요하다.)
4.LFU(Least Frequently Used)
-사용 빈도가 가장 적은 페이지를 교체하는 기법
->활발하게 사용되는 페이지는 사용횟수가 많아 교체되지 않고 사용된다.
->프로그램 실행 초기에 많이 사용된 페이지가 그 후로 사용되지 않을 경우에도 교체되지 않는다.
프레임의 할당
-프로세스 여러 개가 동시에 수행되는 상황에서 각 프로세스에게 얼마만큼의 메모리 공간을 할당할 것인지를 결정해야 한다.
3가지 방식
-균등할당 방식: 페이지 프레임은 균일하게 할당
-비례할당 방식: 프로세스의 크기에 비례해 페이지 프레임 할당
-우선순위 방식: 프로세스 우선순위에 따라 할당 -> CPU에서 실행될 프로세스에게 더 많은 페이지 프레임 할당
쓰레싱(Thrashing)
-집중적으로 참조되는 페이지들의 집합을 메모리에 한꺼번에 적재하지 못하면, 페이지 부재율이 크게 상승해
CPU 이용율이 급격히 떨어질 수 있다.
메모리 사상 파일(Memory-mapped Files)
-파일의 일부 영역을 가상 메모리 일부에 연결해주는 메커니즘이다.
데이터를 파일과 연결돼 있는 가상 메모리 영역에 저장하면 메모리에만 데이터가 저장돼는 게 아니라
연결된 파일에도 저장된다.