일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BalancedTree
- InnoDB 버퍼 풀
- 기능별 구조
- N+1
- Blue-Green
- ci/cd
- 카카오 2차 코딩테스트
- mysql
- 주간회고
- 계층별 구조
- 월간회고
- 도커
- useMutation
- 어댑티브 해시 인덱스
- db
- 메서드명
- jacoco
- 프리코스
- 백기선 스터디
- DeleteAll
- 멀티쓰레드 프로그래밍
- 회고
- SQL 실행순서
- Jenkins
- java
- 블로그 병행
- useQuery
- B+TREE
- 클래스
- 우테코
- Today
- Total
Haneul's Blog
[운영체제] 효율적인 메모리 관리 방법(Feat: 가상메모리, 페이징과 세그멘테이션) 본문
먼저 페이징과 세그맨테이션을 알아보기 전에 알아야 할 지식부터 아래에 차근차근 설명해보겠습니다.
프로세스가 실행되기 위해서는 프로그램 코드를 메인 메모리에 저장해두어야 합니다.
하지만 엄청난 용량을 가진 게임이 있어서 메인 메모리가 가진 저장용량을 넘긴다면? 아니면 많은 서비스를 동시에 실행시키고 있어서 메모리에 용량이 부족해진다면?
물론 메인 메모리의 크기가 크다면 상관없지만 메인 메모리는 보조 기억 장치에 비해서 상대적으로 비싼 편입니다. 그래서 일반적인 사용자들은 이 메인 메모리의 비용을 고려하지 않을 수가 없습니다.
그리고 근본적으로 생각해서 현재 실행중인 프로세스의 프로그램 코드를 모두 메인 메모리에 저장해둘 필요가 있을지를 생각해봅시다.
게임을 예로 들어보면 롤을 하려고 하는데 롤이 가진 모든 프로그램 코드를 메모리에 넣어두고 게임을 할 필요가 있을까요? 지금 당장 게임을 하는데 필요한 프로그램 코드만 메모리에 넣어두고 실행할 수 있는 방법이 있으면 좋을 것 같다는 생각이 듭니다.
이렇게 필요한 프로그램 코드만 메모리에 적재할 수 있게 해주는 것이 가상 메모리의 존재입니다.
가상 메모리
결국 가상 메모리는 메모리가 실제 메모리보다 많아 보이게 해주는 기술이며 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하게 해줍니다.
애플리케이션이 실행될 때, 실행에 필요한 부분만 메인 메모리에 올라가게 되고 나머지는 디스크에 남게 되어 메인 메모리의 보조 기억장치처럼 작동하게 됩니다.
이는 빠르지만 작은 메인 메모리와 크지만 느린 기억장치는 적절히 잘 조합하여 하나의 크고 빠른 기억장치처럼 동작하게 해주는 것입니다.
간단하게 동작 방식을 말하자면 CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억 장치로 내보내고(swap-out) 다른 프로세스의 메모리를 불러오는(swap-in) 작업을 swap과정이라고 합니다.
이러한 swap에는 디스크 전송 시간이 들기 때문에 메모리 공간이 부족할 때 Swapping이 이루어지게 됩니다.
결국 가상 메모리는 메모리를 관리하기 위한 방법 중 하나로 여러 프로세스를 메인 메모리에 적재하기 위함이나 다중 프로그래밍 시스템에서 여러 프로세스를 동작할 수 있도록 하는 메모리 관리 작업이라고 할 수 있습니다.
가상 메모리를 사용하게 되면서 어느정도 메모리를 효율적으로 사용할 수 있게 되었지만 더욱 욕심을 부려서 디스크에 있는 프로그램을 어떻게 메인 메모리에 적재할 것인지도 생각해보면 좋을 것 같습니다.
연속 메모리 관리
프로그램 전체가 하나의 커다란 공간에 연속적으로 할당되는 방법으로 고정 분할 기법과 동적 분할 기법이 있습니다.
고정 분할 기법은 주 기억 장치가 고정된 파티션으로 분할되어서 내부에서 단편화가 발생하고,
동적 분할 기법은 파티션들이 동적으로 생성되면서 자신의 크기와 같은 파티션에 적재되면서 외부 단편화가 발생합니다.
이렇게 연속 메모리 관리 기법을 사용하게 되면 단편화가 발생하는 것을 볼 수 있습니다.
여기서 내부 단편화와 외부 단편화라는 단어가 보이는데 조금 더 자세하게 설명해보자면 아래와 같습니다.
내부 단편화
프로세스가 요청한 양보다 더 많은 메모리를 할당할 때 발생하게 되며, 메모리 분할 자유 공간과 프로세스가 사용하는 공간의 크기 차이를 의미합니다.
외부 단편화
메모리 할당 및 해제 작업의 반복으로 작은 메모리가 중간 중간 존재할 수 있는데, 이렇게 사용되지 않는 메모리가 존재하여 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황을 의미합니다.
위처럼 연속 메모리 관리 기법을 사용하게 되면 단편화가 발생할 수 밖에 없는 환경이 됩니다.
그렇다면 불연속 메모리 관리 기법은 어떻게 될지 확인해봅시다.
불연속 메모리 관리
프로그램 일부가 서로 다른 주소 공간에 할당될 수 있는 방법으로, 연속 메모리 관리 기법을 사용하면 단편화가 생기는게 이를 해결하기 위해 제시된 기법입니다.
외부 단편화 해결을 위한 페이징과 내부 단편화 해결을 위한 세그멘테이션으로 나누어집니다.
페이징
프로세스를 일정한 크기의 페이지(고정 크기)로 분할하여 메모리에 적재하는 방식입니다.
논리(가상) 메모리는 페이지라는 고정 크기의 블록으로 나누어지고, 물리 메모리는 프레임이라고 불리는 페이지과 같은 크기의 블록들로 나누어지고, 페이지는 순서에 상관 없이 물리 메모리에 있는 프레임에 매핑되어 저장됩니다.
이 말은 즉슨 모든 프로세스는 하나의 페이징 테이블을 갖게 되고 여기에는 메인 메모리가 적재되어 있는 페이지 번호와 해당 페이지가 위치한 메모리의 시작 주소가 있다는 것입니다.
이를 통해서 가상 메모리 페이지들이 각각 실제 메인 메모리의 어디 프레임에 적재되어 있는지 알아낼 수 있습니다.
이렇게 되면 CPU는 논리 주소로 프로그램이 설정한대로 연속적인 주소값으로 명령을 내리고 이는 메모리로 가기전에 각 페이지의 실제 메모리 주소가 저장되어 있는 테이블에서 물리 주소로 변경됩니다.(MMU-Memory Management Unit 라는 하드웨어 장치로 이를 가능하게 해줌)
만약 프로세스가 프레임의 정수배보다 살짝 작다면 할당된 마지막 프레임은 전부 사용되지 않고 남아버리는 내부 단편화가 발생합니다
세그멘테이션
가상 메모리를 서로 크기가 다른 논리적 단위로 분할한 것을 의미하고, 프로세스를 물리적 단위인 페이지가 아닌 논리적 단위인 세그먼트로 메모리에 적재하는 방식입니다.
분할 방식을 제외하면 페이징과 세그멘테이션이 동일하여 매핑 테이블의 동작 방식이 동일합니다.
세그먼테이션은 프로그램의 중요한 부분과 중요하지 않은 부분을 분리하여 저장할 수 있고 같은 코드 영역은 한 번에 저장할 수 있고 내부 단편화를 해결해줍니다.
하지만 세그멘테이션은 가변적인 크기를 가져가기 때문에 외부 단편화가 발생할 수 있다는 단점도 있습니다.
참고 자료
https://m.blog.naver.com/rbdi3222/220623825770
운영체제 ] 내부단편화, 외부단편화란
오늘은 내부단편화, 외부단편화에 대해 정리해 보았습니다. 우선 내부단편화에 대해서 알아보겠습니다. 여...
blog.naver.com
https://steady-coding.tistory.com/524
[운영체제] 페이징과 세그멘테이션
cs-study에서 스터디를 진행하고 있습니다. 메모리 메인 메모리 (Main Memory, Physical Memory, 주기억장치) CPU가 직접 접근할 수 있는 기억 장치로, 프로세스가 실행되려면 프로그램 코드를 메인 메모리
steady-coding.tistory.com
https://ahnanne.tistory.com/15
[운영체제] 가상 메모리(Virtual Memory System)
들어가기 전.. 메모리(memory)란? 메모리란 프로그램과 프로그램 수행에 필요한 데이터 및 코드를 저장하는 장치임. 메모리는 크게 내부 기억장치인 주기억장치와 외부 기억장치인 보조 기억장치
ahnanne.tistory.com
'운영체제' 카테고리의 다른 글
[운영체제]공유자원 관리엔 뮤텍스와 세마포어! (0) | 2022.10.09 |
---|