티스토리 뷰
디스크에 있는 프로그램을 실행시키면 그 프로세스(실행중인 프로그램)는 가상 주소 공간(가상 메모리의 공간)을 할당 받는다. 가상 주소 공간은 논리 주소로 이루어져 있는 공간이며 일부는 물리 메모리로 구성 되어 있고 일부는 디스크로 구성 되어 있다.
프로세스를 실행 시키기 위해서는 이 논리 주소를 물리 주소로 바꾸는 변환 과정이 필요한데, 이것이 매핑 되어 있는 테이블이 바로 페이지 테이블이다. 만약 가상 메모리의 어떤 페이지를 읽었는데 그것이 실제 물리 메모리에 있었으면 페이지 hit이다. 하지만, 물리 메모리가 아니라 디스크에 있었다면 페이지 miss가 일어나며 운영체제가 디스크에 있는 페이지를 물리 메모리로 올리는 과정을 해주어야 한다. 그리고 나서 페이지 테이블을 수정하는 역할 까지 담당한다.
페이지 테이블은 프로세스의 가상 메모리 : 물리 메모리 의 매핑 정보를 갖고 있는 테이블이다.
주소 바인딩
주소 바인딩이란 논리 주소를 물리 주소로 바꾸는 것을 말한다. CPU는 논리 주소를 사용하기 때문에 프로세스를 실행 시킬때는 그 논리주소를 MMU라고 하는 하드웨어를 통해 빠르게 물리 주소로 변환하는 과정을 거쳐야 한다. 쉽게 정리 하자면, 가상 메모리는 논리 주소로 이루어져 있고 CPU는 가상 메모리에 올라와 있는 프로세스의 코드를 한줄한줄 읽으면서 실행 시킨다. 이때, 가상 메모리의 논리 주소는 실제 주소가 아니기 때문에 물리 주소로 변환하는 과정을 거쳐야 하는 것이다. 그 과정은 MMU(Memory Management Unit)이라는 하드웨어를 통해 빠르게 변환한다.
MMU를 통한 주소 바인딩 과정을 살펴보자.
CPU가 논리주소 346번지를 읽었다. 이때 이 주소를 MMU를 통해 물리 주소로 변환해야 한다.
MMU 속에는 base register와 limit register가 있다. base 레지스터는 물리주소의 시작번지를 갖고 있으며 limit 레지스터는 프로세스의 크기를 나타낸다. 즉 cpu가 읽은 논리 주소에 base 레지스터에 담긴 값을 더하면 실제 물리 메모리의 물리 주소를 구할 수 있게 되는 것이다.그리고 limit레지스터를 통해서 cpu가 이상한 부분을 요청 하지 않았는지 검사 할 수 있다.
흐름을 정리해보면
프로세스는 가상 메모리에서 가상 주소 공간을 갖는다 -> CPU는 가상 메모리에 있는 프로세스를 읽는다. -> 논리 주소를 MMU속의 base register를 통해 실제 물리 주소로 변환하는 과정을 거친다. -> 이제 진짜 CPU가 프로세스를 read할수 있게 된다.
메모리는 0번지부터 시작하는 OS영역과 프로세스가 올라가는 영역으로 나뉘어 있다.
이 프로세스 영역에 프로그램을 로드시켜야 하는데 프로그램을 자르지 않고 연속적으로 메모리에 할당하는 것을 연속할당이라고 하고 프로그램을 잘라서 메모리의 여러 부분에 로드 시키는것을 불 연속 할당이라고 한다.
연속 할당에는 고정 분할과 가변 분할 방식이 있다.(프로세스를 자르지 않음)
고정 분할 방식에서 분할보다 프로그램의 크기가 작을 경우 내부 조각이 생기며, 분할보다 큰 프로그램만 있을 경우 그 분할에 프로그램이 로드 되지 못하여 외부 조각이 생길 수 있다.
가변 분할 방식은 프로세스가 종료 되었을때 그 공간보다 큰 프로세스만 존재 할때 외부 조각이 생길 수 있다.
이 외부,내부 조각들을 HOLE이라고 하는데 홀을 한곳에 모으는 작업을 Compaction이라고 한다.
연속할당기법은 프로세스를 자르지 않고 그대로 메모리에 로드 시킨다. 다만 메모리를 어떤 방식으로 구분할것이냐에 따라 고정 분할, 가변 분할 방식으로 나뉘는것이다. 고정 분할 방식은 미리 메모리를 잘라 놓는것이고 가변 분할 방식은 그때 그때 프로세스의 크기만큼 메모리를 잘라서 사용한다.
하지만 연속 할당 기법은 외부,내부 조각이 발생하기 때문에 좋지 않은 방식이다.
이 문제를 해결하기 위해 프로세스를 잘라서 메모리의 여러군데에 로드 시키는 방식인 페이징,세그멘테이션 방식이 존재한다. 그 방법들은 2부에서 소개 하도록 하겠다.
위에서 얘기했던 MMU를 통한 논리주소 -> 물리 주소 변환 과정은 연속 할당 기법에 적용되는 방식이다.
불연속 할당 기법은 페이징 테이블 또는 세그멘테이션 테이블을 사용한다.
'컴퓨터 공학과 졸업 > 운영체제' 카테고리의 다른 글
메모리 관리 기법 - 2 (0) | 2018.10.26 |
---|---|
동기화를 제공하는 세가지 방식 (1) | 2018.10.18 |
스케쥴링 알고리즘 (0) | 2018.10.17 |
식사하는 철학자 문제 요약 (0) | 2018.08.10 |
busy waiting (0) | 2018.08.10 |
- Total
- Today
- Yesterday
- Babel
- return type
- storybook
- design system
- mobx
- react hooks
- typescript
- promise
- reducer
- Action
- reflow
- atomic design
- rendering scope
- await
- type alias
- useRef
- javascript
- state
- Polyfill
- es6
- props
- async
- react
- Next.js
- computed
- hydrate
- webpack
- useEffect
- server side rendering
- reactdom
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |