프로세스의 동작: 프로그램 카운터(PC)가 가리키는 주소의 다음 명령어를 실행시키는데, 해당 주소는 메모리의 주소를 의미하며, 결국 메모리에 접근해서 명령어를 읽어와 CPU로 명령어를 수행하는 것이 프로세스의 동작임.
캐시 메모리: 자주쓰는 데이터나 프로그램이 있으며, 캐시 메모리에 올려놓고 처리를 함.
** 예를들어, for 문을 1000번 돌리는 과정이 존재하면, 1000번을 결국 돌리는건 자주쓰는 데이터나 프로그램으로 보고, 캐시 메모리에 넣어서 CPU와 상호작용해 빠르게 처리하는 느낌임. **
(2) 기억장치 계층구조
기억장치 계층구조: 레지스터, 캐시메모리, 메모리, 보조기억장치의 기억장치 계층구조가 존재하며, 위로갈수록 접근속도가 빠르지만, 비트당 기억장치 비용이 높으며, 용량이 적어지며, 아래는 그 반대임.
** 적절한 비용으로 높은 성능을 내기 위해서 기억장치 계층구조를 만들었음. **
(3) 메모리 관리
메모리 관리자가 하는 역할에 대한 내용이다.
메모리 호출: 언제 새로운 프로세스를 보조기억장치로부터 메모리에 올려둘 것 인지에 대한 내용임.
메모리 배치: 다음에 실행될 프로세스를 메모리 내의 어느 곳에 배치를 할 것인가에 대한 내용
메모리 교체: 한정된 메모리의 크기로 인해 메모리가 꽉 찬 상태에서 새로운 프로세스를 메모리에 적재해야 할 때, 어떤 프로세스를 제거하고 그 곳에 어떤 새로운 프로세스를 넣을 것인지에 대한 내용
그 외: 메모리를 고정 또는 동적 어떤걸로 분할을 할 것인지와 메모리에 프로세스를 적재할 때 고정된 위치 또는 유동적인 위치에 적재를 할 것인지에 대한 고민이 존재함.
✅ 2. 단일 프로그래밍 환경
과거의 운영체제부터 메모리 관리는 어떻게 변해왔는지에 대한 변천사를 알아볼 것임.
(1) 단일 프로그래밍 이란?
단일 프로그래밍: 하나의 프로세스만 메모리를 전용하는 사용하는 것이며, 쉽게 말해 프로그램 하나만 동작하는 시스템.
연속 메모리 할당: 하나의 프로세스만 동작하기 때문에, 프로세스는 하나의 연속된 블록으로 메모리에 할당이 됨.
(2) 단일 프로그래밍의 문제점
단점1: 메모리의 용량을 초과하는 프로세스는 실행을 못한다는 단점이 존재함.
단점2: 프로세스가 하나만 올라가, 실행이 되는데 실제로 돌아가는 프로세스의 명령어 또는 데이터의 부분은 작을 수 있기 때문에 그 외 나머지 공간은 사용되지 않지만 메모리에 계속 적재되어있는 문제가 있음. ( 메모리 낭비 심함 )
단점3: 주변장치 등 자원의 낭비가 심함. 쉽게 말해, 계산 위주의 프로세스라면 CPU를 많이 사용하지만, 그 외 입출력 장치의 사용이 적기 때문에 비효율적이며, 반대로 입출력 위주의 프로세스라면 입출력 장치를 많이 사용하지만 CPU의 사용이 적기 때문에 입출력 장치 또는 CPU 둘 중 하나가 일을 안하고 쉬는 형태로 될 수 있음.
** 즉, CPU나 입출력 장치가 쉴 때 다른 프로세스에게 자원을 주면 좀 더 효율적으로 많은 처리를 할 수 있다는 의미임. **
✅ 3. 다중 프로그래밍 환경
(1) 다중 프로그래밍 이란?
다중 프로그래밍: 여러 개의 프로세스가 메모리에 동시에 적재되는 것을 의미함.
** 즉, 여러 프로세스가 CPU 연산과 입출력을 서로 안쓸 때 사용하면서 장치들이 쉬지 않고 일을 하는 느낌이며, 이렇게 되면 CPU 이용도와 시스템 처리량이 증가 할 수 있음. **
(2) 메모리 분할
메모리 분할: 다중 프로그래밍 환경에서 여러 프로세스가 메모리에 적재되기 위한 방법을 의미한다.
메로리 분할 초기 방식: 분할 된 메모리 공간에 하나의 프로세스가 적재되는 방식이다.
** 초기 방식에서 메모리를 어떻게 분할 할 것인지에 따라 후기에는 크게 고정 분할, 동적 분할 2가지 종류로 나뉘게 됨. **
(3) 메모리 분할 - 고정 분할
고정 분할: 메모리를 분할 할 때, 고정 된 크기로 분할하는 방식
프로세스 배치 방법1: 고정된 크기로 분할 된 영역마다 큐를 두고, 큐에 들어온 프로세스는 해당 분할영역에만 적재 방식
** 즉, 각각의 프로세스의 크기들이 분할 된 메모리의 크기에 맞게 큐에 들어가서 대기하며, 수행되는 원리임. **
[ 절대 번역 ]
a 주소: 0~100 번지
b 주소: 100~200 번지
c 주소: 200~300 번지
- c 주소에 할당되는 프로세스 내부의 변수들은 200~300 번지 사이에 할당 되어야함.
- 즉, 절대 번역은 컴파일 과정에서 주소 참조 부분을 상수로 못박아버리는 느낌임.
절대 번역 및 적재: 절대 적재는 고정된 크기의 메모리 내 안에서만 적재가 된다는 의미이며, 절대 번역은 메모리를 분할 했을 때, 프로세스 메모리의 시작점을 0으로 잡으면 안되기 때문에, 특정 물리적 위치(예:5000 번지)를 시작점으로 계산하여 코드를 생성하는 특징임. ( 주소 참조 부분을 상수로 못박는 개념 )
효율성 낮음: 절대 적재와 절대 번역을 하게 되면, 해당 분할 된 메모리 내에서만 사용이 되기 때문에 들어갈 큐의 위치가 정해져 있게 됨. 즉, 작업 큐의 이전 프로세스가 돌아가고 있다면 수행이 될 수 없어 대기를 해야하며, 다른 분할 메모리가 사용이 안되고 있어도 그곳을 사용 할 수 없다는 단점이 있음.
프로세스 배치 방법2: 방법1 의 경우 큐가 여러개 있어서 들어갈 메모리의 위치가 정해져 있었다면, 방법2 는 하나의 큐만 사용해, 큐에 들어온 프로세스는 어느 분할영역에든 적재가 될 수 있음.
재배치 가능 번역 및 적재: 분할 된 메모리 공간 어디에 들어갈지 모르기 때문에, 고정된 방식은 불가능하며, 그렇기 때문에 재배치 가능한 컴파일을 통해서 들어갈 곳의 시작 주소값을 더하는 느낌으로 메모리 공간을 할당받아 적재되는 느낌임.
** 쉽게 말해, 프로그래밍 시점에 프로그램 내부의 변수나 함수 주소는 먼저 0번지부터 시작하는 상대적인 주소로 지정이 되며, 추가적으로 실제 시작 주소를 더해서 수정해야 한다는 정보도 기재를 해둠. 이후로, 프로그램이 실제 메모리에 올라갈 때 즉, 적재 시점에 운영체제가 할당 해줄 분할된 메모리의 시작 주소를 더하며, 메모리 공간을 할당해줌. **
복잡함: 효율적으로 메모리를 사용할 수 있지만, 프로그램이 실행될 때마다 주소를 실시간으로 계산해주거나, 적재 시점에 코드를 수정해주기 때문에 복잡함.
내부 단편화: 프로세스의 크기가 분할영역의 크기보다 작아서 분할영역 내에 남게 되는 메모리가 발생 하는 문제를 의미함.
** 그렇기 때문에, 수행할 프로세스의 크기를 미리 알고 그에 맞춰 고정 분할을 하면 좋지만, 현실적으로는 불가능함. **
(4) 메모리 분할 - 동적 분할
동적 분할: 각 프로세스에 필요한 만큼만 메모리를 할당해주는 방식이다. ** 분할경계가 고정되어 있지 않음. **
외부 단편화: 프로세스가 메모리에 할당되고 반환되는 작업이 반복됨에 따라, 메모리 내부의 작은 공백이 생기는 문제
** 쉽게 말해, 프로세스 크기에 맞게 할당이 되는데, 크기가 제각각인 프로세스들이 할당되고 반환이 되면, 프로세스 사이의 중간에 메모리 공백이 생길 수 있는데, 이 공백을 외부 단편화 문제라고 함. **
해결 방법: 통합, 집약을 통해서 문제를 어느정도 해결함.
통합: 인접된 공백을 큰 공백으로 만들어서 외부 단편화를 해결하는 방법임.
** 단, 인접된 공백이 아닌 흩어져 있는 공백은 통합을 못시킴. **
집약: 메모리 내의 모든 공백을 하나로 모아서 큰 공백으로 만들어 외부 단편화를 해결하는 방법임.
** 자세히 말하면, 떨어져 있는 프로세스 A,C,E.. 등을 옮겨서 공백을 인접하게 만들어서 통합하는 개념임. **
단, 집약을 하려면 프로세스를 옮겨야 하는 작업이 필요하며, 그렇기 때문에 프로세스가 크다면 그만큼 복사해서 옮기는데 큰 오버헤드가 발생할 수 있음.
(5) 메모리 보호
다중 프로그래밍 환경에서는 메모리를 잘 보호해줄 필요가 있음.
메모리 보호: 분할 된 메모리 내의 프로세스들은 서로의 할당 영역을 침범하지 않게 해줘야 하는 개념임.
하한-상한 레지스터: 레지스터 두개애 시작 주소와 끝 주소를 넣어 메모리의 크기를 제한하는 것임.
프로세스 자신이 할당 된 분할 메모리의 범위를 넘어가서 영역을 사용해야 한다면, 시스템 호출을 통해서 해결함.
✅ 4. 메모리 배치기법
(1) 메모리 배치기법 이란?
메모리 배치기법: 동적 분할 다중 프로그래밍에서 새로 반입이 된 프로그램이나 데이터를 메모리의 어느 위치에 배치할 것인가를 결정하는 기법을 의미한다.
** 쉽게 말해, 메모리의 공백중에서 어디에 새로운 프로세스를 배치할 것인가에 대한 기법을 의미함. **
종류: 새로운 프로세스가 어디에 적재가 될지 정하는 방법으로 최초 적합, 후속 접합, 최적 적합, 최악 적합 방법이 있음.
(2) 최초 적합
최초 적합: 프로세스가 적재될 수 있는 빈 공간 중에서 가장 먼저 발견되는 곳에 할당하는 방식임.
예를들면, 프로세스A(35MB) 할당 요청이 들어오면, 공백 1부터 크기를 확인하며 넘어가게 되는데, 공백1은 30MB 짜리 이기 때문에 할당이 불가능하므로, 다음 공백을 확인하고 크기에 맞으면 넣는 방식임.
(3) 후속 적합
후속 적합: 앞선 최소 적합은 리스트의 첫 번째 부터 확인하며, 넘어가는데 후속 적합의 경우 이전에 탐색이 끝난 그다음 부분부터 시작해 사용 가능한 빈 공간을 순서대로 찾는 방식임. ( 즉, 최초 적합의 변형임 )
(4) 최적 적합
최적 적합: 필요한 공간을 제공할 수 있는 빈 공간 중 가장 작은 곳을 최적의 공간으로 보고 선택하여 할당하는 방식임.
큰 빈 공간을 최대한 많이 남겨 놓기 위해 최대한 프로세스 크기에 맞게 넣는 방식이라고 보면 됨.
(5) 최악 적합
최악 적합: 필요한 공간을 제공할 수 있는 빈 공간 중 가장 큰 곳을 선택하여 할당하는 방식임.