EARLY SYSTEM
컴퓨터의 물리메모리 : 초기 운영체제
- 메모리에 상주하는 루틴의 집합
- 물리메모리에 하나의 실행중인 프로그램이 존재
- 특별한 가상화에 대한 개념 없었음
- STACK, HEAP, DATA, TEXT
MULTI PROGRAMMING
- 여러 프로세스가 실행 준비 상태
- OS 는 프로세스를 CPU에게 전환하면서 실행
- 이 과정을 계속 반복하는 것은
TIME SHARING(시분할)
- 기존에 실행되던 프로세스 상태를 디스크에 저장하는데 디스크에 저장하는것은 IO가 발생하므로 느리다. 또한 다르프로세스 메모리공간침법 위험도이썽서 프로세스간 ISOLATION이 보장안되었다.
Virtual Memory
- 이런 문제 해결 위해 메모리 가상화 개념 도입
- 각 프로세스마다 가상의 메모리 주소 체계를 도입해 실제 물리 메모리공간과 매핑
- 이 과정에서 page table, MMU가 등장하게 된다.
- page table은 가상 memory의 공간을 page 단위로 나눠 물리 memory의 주소와 mapping시키는 table이다.
- 따라서 서로 다른 process들의 가상 memory 상에서의 주소가 같다고 하더라도 실제 물리 memory에서의 주소는 다른 page를 가리키게 된다. 이러한 방식으로 process간 isolation을 보장하게 된다.
메모리 관리 목적
- 투명성
- 실행중인 프로그램이 가상 메모리 존재를 모르게
- 효율성
- 시간과 공간적으로 효율적
- 너무 느리지 않아야하고 메모리도 최소한으로 사용
- 보호
- os커널 자체를 다르프로세스로부터 보호
- 프로세스간 고립
메모리 관리 이슈
- 배치
- 메모리 여러 빈공간중 어느곳에 새로운 프로세스를 삽입할 것인가
- 재배치
- 메모리에 올라가있던 프로세스가 종료되어 빈 공간이 생길 때 이러한 빈 공간을 어떻게 최소화 할지
- 보호
- 메모리 상의 여러 프로세스 및 os가 어떻게 서로의 공간을 침범하지 않을지에 대한
- 반입
- 요청을 하는 시점에 반입을 할지 , 요청이 올 시점을 예측해 반입을 할지
메모리 관리 종류
단일 사용자 전용 시스템
memory를 동시에 점유할 수 있는 process의 수가 최대 1개이기 때문에 배치, 재배치를 고려할 필요가 없다. 만약 주어진 memory보다 더 큰 process가 들어오게 될 경우, overlay 기법을 사용하게 된다.
고정 분할 다중 프로그래밍 시스템 (Fixed Partition Multi Programming System)
- 절대 번역 어셈블러
- 메모리를 초기에 고정 크기로 분할 시킨 뒤에 각각 독립 큐를 운용
- 자신이 배정된 구간을 다른 프로세스가 점유하고 있으면 비워질때 까지 대기해야한다.
- 재배치 가능 어셈블러
- 메모리를 초기에 고정 크기로 분할시킴
- 하나의 공통 큐를 운용해 각각의 세그먼트에 분배해 재배치한다.
- 절대번역 어셈블러에 비해 효율적이나 구현이어렵다.
위의 두 방법 모두 내부 단편화(internal frargment)현상이 발생한다. 메모리 낭비가 심해진다.
- segment의 크기보다 더 작은 process가 들어오게 될 경우 해당 segment 내부에 빈 공간이 생기게 되는 현상이다.
가변 분할 다중 프로그래밍 시스템 (Variable Partition Multi Programming System)
내부 단편화 문제 해결위해 가변분할 다중 프로그래밍이 등장했다. 하나의 큐를 운용하지만 메모리를 초기에 분할시키지 않고 통합해 관리한다. 외부 단편화 현상일 발생한다. compaction 은 memory 전체에서 외부 단편화 현상을 제거하는 것이고, coalescing 은 특정 두 process 사이의 외부 단편화 현상을 제거하는 것이다.
하나의 process가 종료됐을 경우 해당 process가 차지하고 있던 공간에 새로운 process가 들어오지 못하고 계속 빈 상태로 유지되는 현상을 뜻한다.
재배치 기법
여러 fragmentation이 발생했을 경우 여러 fragmentation중 하나를 선택해 새로운 process를 삽입해야한다. 물론 해당 framentation이 process의 크기보다 작을 경우 삽입이 불가능하겠지만, 가능한 후보 fragmentation이 여러 개라면 그 중 하나를 선택해야만 할 것이다.
- first fit
- memory의 처음부터 탐색해 알맞는 첫번째 후보를 선택
- best fit
- 메모리의 처음부터 탐색해 가장 크기가 x작은 후보(크기차이가 적은) 선택
- worst fit
- 메모리의 처음부터 탐색해 가장 크기가 큰 후보 선택
- next fit
- 메모리의 처음부터가 아닌 직후부터 탐색해 알맞는 첫 후보를 선택
프로세스 실행 과정
- 디스크에는 실행파일이 저장되어있다. 디스크에파일이 메모리에 올라가 프로세스가 된다. 디스크상에서 실행 파일이 저장되는 포멧은 elf ㅍ멧이다. 프로세스가 메모리 올라갈때와는 구조가 다르다.
disk에 저장되는 파일은 stack/heap을 가질 필요가 없다. disk에 저장되는 파일은 disk block 단위로 나눠 저장이 되는데, 대개 그 크기는 4KB이다. 한편, memory에서도 page frame 단위로 나누어 보관을 하는데, 그 크기는 disk block의 것을 따른다.
좌측은 fork 호출전 / 우측은 fork 호출 후이다.
fork() 는 부모 process와 자식 process가 동일한 code를 사용하기 때문에 text 영역은 서로 공유하게 된다(같은 물리 memory를 가리킨다).반면 data와 stack 영역에 대해서는 물리 memory에 새로운 page frame을 생성해 자식 process에게 할당하게 된다. 이러한 방식은 여러 자식 process가 생성될 경우 memory 낭비가 심하다는 단점이 존재한다. 자식 process라고 하더라도 내부에서 지역 변수 및 전역 변수 등을 수정하지 않는 경우라면 굳이 새로운 page frame을 생성하지 않아도 되기 때문이다. 이러한 단점을 해결하기 위해 현대 OS는 대부분 COW (Copy On Write) 방식을 채택하고 있다.
좌측은 COW 방식에서의 fork() 호출 직후이고, 우측은 fork() 호출 후 전역 변수에 대한 변경이 일어난 뒤이다. COW 방식에서는 fork() 를 한다고 해서 바로 data 및 stack 영역에 대한 새로운 page frame을 생성하지 않고 우선 부모 process의 것을 공유한다. 이후 자식 process에서 값 변경이 발생한 시점에 새로운 page frame을 생성해 자식 process에게 할당하게 된다.
exec( )의 경우에는 fork() 와는 다르게 동작하는데, exec() 는 실행중이던 process의 모든 memory 영역을 교체하게 된다. 기존에 사용하던 page frame과의 연결을 끊고, exec( ) 호출 시 넘겨준 새로운 실행 파일을 disk에서 읽어들여 새로운 text page frame, data page frame, stack page frame을 생성해 연결한다.
'Operating System' 카테고리의 다른 글
[Operating System] Segmentation (0) | 2022.12.31 |
---|---|
[Operating System] Paging Mechanism (0) | 2022.12.31 |
[Operating System] 공평한 스케줄러 (0) | 2022.12.28 |
[Operating System] MLFQ Multi-level Feedback Queue Scheduling (2) | 2022.12.28 |
[Operating System] 스케줄링 (0) | 2022.12.19 |