컴퓨터의 4가지 핵심 부품 : CPU, 메모리, 보조기억장치, 입출력장치
주기억장치에는 크게 RAM(Random Access Memory)과 ROM(Read Only Memory), 두 가지가 있습니다. 메모리라는 용어는 보통 RAM을 지칭합니다. 컴퓨터의 작동 원리를 파악하기 위해 알아야 할 더 중요한 주기억장치는 RAM입니다. 따라서 특별한 언급이 없는 한 주기억장치는 RAM이라고 생각해도 무방합니다.
메모리
메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품입니다. 주기억장치인 RAM을 보통 메모리라고 합니다.
CPU는 메모리에 올려져있는 명령어를 단지 실행할 뿐입니다.
CPU의 속도에 비해 하드디스크는 너무 느리기 때문에 CPU는 RAM을 통해 프로그램 데이터를 가져옵니다.
우리가 어떤 프로그램을 작동시키면 RAM은 하드디스크로부터 데이터를 복사해 임시 저장하고 필요 시마다 CPU에게 데이터를 넘깁니다.
그러나 RAM도 CPU에 비하면 속도가 굉장히 느리기 때문에 CPU 내부나 근처에 캐시메모리를 두어 데이터를 저장합니다.
캐시메모리는 다시 레지스터와 호흡하는데,
레지스터는 CPU 내부에서 데이터를 일시적으로 저장하는 장치로 속도가 가장 빠른 메모리입니다.
cf) 게임을 실행하다보면 '로딩중'이라는 메세지가 나오는데,
이는 하드디스크에서 RAM으로 데이터를 전송하는 과정이 진행 중임을 나타낸다.
메모리 계층
레지스터로 갈 수록 속도는 매우빠르지만 용량이 적고, 디스크로 갈 수록 속도는 느려지지만 용량은 커집니다.
캐시 메모리
속도 차이를 해결하기 위해 계층과 계층 사이에 존재하는 계층을 캐싱 계층이라고 합니다. 캐시메모리와 디스크 사이에 존재하는 RAM을 디스크의 캐싱 계층이라고 할 수 있습니다.
비싸고 한정된 캐시메모리를 효율적으로 사용하기 위해서는 몇 가지 기준이 있습니다.
시간지역성 / 공간지역성
- 시간 지역성(temporal locality)
한 번 접근된 데이터는 가까운 미래에 다시 사용될 확률이 높음
- 공간 지역성(spatial locality)
한 번 접근된 데이터의 주변 데이터도 미래에 접근될 확률이 높음
캐시히트 / 캐시미스
- 캐시 히트
캐시에서 원하는 데이터를 찾는 것
- 캐시 미스
찾는 데이터가 캐시에 없어 주 메모리로 가서 데이터를 찾아오는 것
웹 브라우저의 캐시
보통 사용자의 정보나 인증 관련 사항을 웹 브라우저에 저장해 서버에 요청 시 활용합니다.
쿠키
키-값으로 이루어진 만료기한이 있는 저장소입니다. 보통 서버에서 만료기간을 정하여 모든 클라이언트 요청마다 함께 보내집니다.
저장용량이 작고, 보안에 취약합니다. 다시보지 않기 창 등을 설정하는데 이용할 수 있습니다.
웹스토리지
키-값으로 이루어진 만료기한이 없는 저장소입니다. HTML5 부터 지원이 가능하며, 클라이언트에서만 수정이 가능합니다.
- 로컬스토리지
: 웹브라우저를 닫아도 데이터가 유지됩니다. 자동로그인 기능에 활용할 수 있습니다.
- 세션 스토리지
: 탭 윈도우 단위로 스토리지가 생성되고 탭을 닫으면 데이터가 휘발됩니다. 비로그인 장바구니, 입력폼데이터 유지 등에 사용할 수 있습니다.
가상 메모리
메모리가 실제 메모리보다 많아 보이게 하는 기술로, 어떤 프로세스가 실행될때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에서 착안하여 고안되었습니다.
애플리케이션이 실행될때 실행이 필요한 일부분만 메모리에 올라가고 나머지는 디스크에 남게 됩니다. 즉 디스크가 RAM의 보조 기억장치 처럼 작동 결국 빠르고 작은 기억장치(RAM)을 크고 느린 기억장치(디스크)와 병합하여, 하나의 크고 빠른 기억장치(가상 메모리)처럼 동작하게 하는 것 입니다.
등장 배경
초창기 컴퓨터는 사용가능한 RAM의 용량이, 가장 큰 실행 애플리케이션의 주소 공간보다 커야했습니다.
그렇지 않을 경우 '메모리 부족' 오류에 의해 해당 애플리케이션을 실행할 수 없었습니다.
이후 프로그래머가 애플리케이션 일부분만 기억장치에 올려 실행하도록 지정할 수 있게하는 오버레이 기법을 사용하여 메모리 부족 문제를 해결하고자 했으나 전반적인 메모리 문제로 해결할 수 없었습니다. (오버레이를 사용한 프로그램은 그렇지 않은 프로그램보다 덜 사용했지만, 애초에 시스템이 프로그램을 위한 충분한 메모리를 갖추지 않은 경우 오류가 발생 함)
그래서 여기서 더 발전한 가상 메모리 기법은 애플리케이션을 실행하는데 얼마나 많은 메모리가 필요한지 집중하지 않고 대신, 최소한 얼마만큼의 메모리가 필요한가에 집중하여 문제를 해결했습니다.
이렇게 접근하는 방식이 가능한 이유는 메모리 접근은 순차적이고 지역화 되어있기 때문입니다. 그렇다면 애플리케이션의 일부분만 메모리에 올린다면 메모리에 올라가지 않는 나머지는 보조기억장치 (디스크)에 위치해야합니다.
가상 메모리의 핵심은 보조기억장치 입니다!
MMU
가상메모리를 구현하기 위해서는 컴퓨터가 특수 메모리 관리 하드웨어를 갖추고 있어야합니다.
- MMU는 가상주소를 물리주소로 변환하고, 메모리를 보호하는 기능을 수행 합니다.
- MMU를 사용하게 되면, CPU가 각 메모리에 접근하기 이전에 메모리 주소 번역 작업이 수행됩니다.
- 그러나 메모리를 일일이 가상 주소에서 물리적 주소로 번역하게 되면 작업 부하가 너무 높아지므로, MMU는 RAM을 여러 부분(페이지, pages)로 나누어 각 페이지를 하나의 독립된 항목으로 처리 합니다.
- 페이지 및 주소 번역 정보를 기억하는 작업이 가상 메모리를 구현하는 데 있어 결정적인 절차 입니다.
페이징
고정분할 방식으로 메모리를 분할하여 가상주소를 물리 주소로 변환하는 방법입니다. 외부 단편화의 해결 방법으로, 주소를 불연속적으로 할당하는 메모리 관리 구조를 말합니다.
*알아야할 용어
Page(페이지) : 가상 메모리를 일정한 크기로 나눈 블록
Frame(프레임) : 물리 메모리를 일정한 크기로 나눈 블록
페이지 크기 = 프레임 크기
단편화를 최소화하기 위해 메인메모리와 가상메모리를 같은 크기로 분할해 가지고 와서 할당합니다.
- 가상메모리는 하나의 분할된 영역을 page(페이지) - 논리주소
- 물리메모리는 하나의 분활된 여역을 Frame(프레임) - 물리주소(실제의 주소)
페이지와 프레임의 크기는 같기때문에 단편화(자투리 공간)를 줄여서 메모리를 효율적으로 사용할 수 있습니다.
즉, 맨 처음 언급했듯이 고정분할 방식(고정된 크기로)으로 메모리를 분할하여 가상주소를 물리 주소로 변환하는 방법입니다.
이때 가상메모리에서 어떤 페이지를 가지고 왔고 어떤 프레임에 넣었는지에 대한 기록표가 필요한데 이걸 페이지 사상 테이블(page table)에 담습니다. 각 각의 row는 페이지에 대한 정보를 기억합니다. (페이지를 기억하는게 아님)
가상메모리의 페이지를 주기억장치에 올려서 사용하고 다 사용하면 교체하는 식으로 계속해서 가상메모리를 읽어오는데 이걸 "스와핑"이라합니다.
여기서 "페이지의 크기가 작다" 라는 건 무엇을 뜻할까요?
- 내부단편화(짜투리공간)가 적게 나타납니다.
- 페이지 사상 테이블(page table)이 커집니다. : 크기가 작으니 더 많은 row가 쌓입니다.
- 페이지 부재(가장 필요한 데이터가 없는 상태)가 큼 -> 페이지의 용량이 작으니까 교체 할일이 많음 -> 성능감소 -> 스레싱
- 스레싱(thrashing) : 하드디스크의 입출력이 너무 많아져서 잦은 페이지의 부재로 마치 작업이 멈춘 것 같은 상태를 말합니다.
세그먼테이션?
페이징은 프로세스를 물리적으로 일정한 크기로 나눠서 메모리에 할당하는 것을 의미합니다.
반면, 세그멘테이션은 프로세스를 논리적 내용을 기반으로 나눠서 메모리에 배치하는 것을 의미합니다.
세그멘테이션은 프로세스를 세그먼트(segment)의 집합으로 표현합니다. 이때 세그먼트는 논리 단위로 아래와 같은 것들이 해당됩니다.
- main program
- procedure
- function
- method
- object
- stack
- local variable
- global variable
- etc...
프로세스를 code영역, data영역, stack영역 등으로 나누는 것 또한 세그멘테이션이라고 할 수 있습니다.
세그멘테이션도 페이징과 비슷하게 세그먼트 테이블을 가지고 있습니다. 페이징과 비슷하게 논리주소가
<segment-number, offset>로 이루어져 있습니다. 다만 다른 점은 세그먼트의 크기는 일정하지 않기 때문에, 테이블에 limit 정보가 추가로 들어있다는 점입니다.. 만약 세그먼트의 크기를 초과하는 주소가 들어오면 인터럽트가 발생해 해당 프로세스는 강제 종료됩니다.
세그멘테이션 VS 페이징
세그멘테이션은 페이징보다 보호와 공유 면에서는 더 낫습니다.
세그멘테이션은 read/write/execute 권한을 테이블에 추가하는데, 이때 이것을 논리적으로 나누기 때문에 해당 비트를 설정하기 간단하고 안전하다. 반면, 페이징은 code+data+stack 영역이 존재할 때 이를 일정한 크기로 나누기 때문에 영역이 섞여 비트를 설정하기 까다로워질 수 있습니다.
공유의 측면에서도 마찬가지로, 페이징은 영역이 섞일 가능성이 존재하지만, 세그멘테이션은 정확히 영역을 나누므로 더 효율적으로 공유를 할 수 있습니다..
하지만, 현재 대부분은 페이징 기법을 세그멘테이션보다 많이 사용합니다.
그 이유는 세그멘테이션의 세그먼트 크기가 일정하지 않고 다양하기 때문입니다. 세그먼트의 크기가 다양하기 때문에 다양한 hole이 발생해 외부단편화가 발생하여 메모리 낭비가 크게 됩니다.
참고
https://charles098.tistory.com/106
[ 운영체제 ] 메모리 관리 1 - 페이징(Paging)
드디어 대망의 메모리 관리 파트다. '메모리 계층 구조'부터 '주소 공간'까지 아직 안 읽었다면 읽고 오는 것을 추천한다. 앞의 내용을 숙지하고 있어야 이번 챕터를 잘 이해할 수 있기 때문이다.
charles098.tistory.com
https://velog.io/@uiop9900/%ED%8E%98%EC%9D%B4%EC%A7%95
https://code-lab1.tistory.com/57
[운영체제] 세그멘테이션(Segmentation)이란?, 세그멘테이션 vs 페이징
세그멘테이션(Segmentation)이란? 페이징은 프로세스를 물리적으로 일정한 크기로 나눠서 메모리에 할당하는 것을 의미한다. 반면, 세그멘테이션은 프로세스를 논리적 내용을 기반으로 나눠서 메
code-lab1.tistory.com
'혼자 고민해보기_ 개발 > CS' 카테고리의 다른 글
자료구조 (1) | 2023.11.10 |
---|---|
프로그래밍 패러다임 (선언형과 함수형, 객체지향, 절차형) (1) | 2023.11.09 |
네트워크 OSI 7 계층 (OSI 7 LAYER) (0) | 2023.11.08 |
디자인 패턴 (MVC, MVP, MVVM) (1) | 2023.11.08 |
기술면접 Node (0) | 2023.11.02 |