프로그램이 실행한다는 뜻은 그 프로세스가 메인 메모리에 올라가 있다는 뜻과 같다.
따라서 메인메모리란, CPU가 직접 접근 가능한 저장 장치이다.
프로세스들은 독립적인 메모리 공간을 갖는다. 각 프로세스는 베이스 레지스터와 리밋 레지스터로 자기만의 영역을 설정하여 메모리를 보호한다.
메모리 공간 보호는 하드웨어로 부터 수행되며 사용자 모드에서 생성된 모든 주소를 레지스터와 비교하는 방식이다. 그 flow는 아래와 같다.
주소할당
프로그램이 실행되기 위해서는 메모리에 올라가야한다. 프로세스가 종료되면 이전 프로세스가 사용 했던 기억 공간이 가용 고간이 되며 다른 프로세스를 위해 사용 된다.
프로그램은 binary file로 저장되어 있으며 프로그램이 메모리에 어떻게 올라가는지는 아래와 같다.
compile time binding : 프로세스가 메모리 내에 들어갈 위치를 컴파일 시간에 미리 알 수 있으면 컴파일러는 절대 코드를 생성할 수 있다. 그러나 위치가 변경되어야 한다면 이 코드는 다시 컴파일 되어야 한다.
load time binding : 메모리 내의 어느 위치에 올라오게 될지를 컴파일 시점에서 알지 못하면 컴파일러는 일단 binary 코드를 재배치 가능 코드로 만든다. 이 경우 심볼과 진짜 주소와의 파인딩은 프로그램이 메인 메모리에 실제 적재되는 시간에 이루어지게 된다. 재배치 가능 코드는 주소가 바뀌어도 코드를 다시 적재만 하면 된다.
execution time binding : 프로세스가 실행 중간에 메모리 내의 다른 세그먼트로 옮겨질 수 있다면 이를 바인딩이 실행 시간까지 허용되었다 라고 한다.
excution time에 진행 되는 run time address binding에는 MMU가 도움을 준다.
MMU란, CPU 코어 안에 탑재되어 가상 주소를 실제 메모리 주소로 변환해주는 장치이다.
DLL (dynamic linked libraries): 프로그램이 실행될 때, 사용자 프로그램에 사용되는 시스템 라이브러리이다.
연속 메모리 할당(Contiguous Memory Allocation)
프로세스의 구성 요소가 메모리에 연속된 주소로 저장되는 방식을 연속 메모리 할당이라고 한다.
연속 메모리 할당에는 두 가지 메모리 분할 방식이 있다.
- 고정 분할
고정 분할은 시스템 생성시 메인 메모리가 이미 특정 크기로 고정 된 파티션들을 분할되는 방식이다.
장점
원리가 단순하고 시스템 생성 시 메모리가 미리 분할되므로 운영체제 오버헤드가 줄어든다.
단점
파티션 수에 따라 프로세스 수가 제한받는다. 크기가 작은 프로세스는 효율적인 공간 활용이 안된다.
- 동적 분할
주기억장치로 적재될 때 필요한 크키만큼 메모리를 할당하는 것이다. 파티션의 크기와 갯수가 가변적이다.
동적분할은 외부 단편화 문제가 존재한다. 필요한 크기의 메모리를 할당하기 때문에 내부 단편화는 발생하지 않지만 프로세스가 재배치 되는 과정에서 메모리가 사용되지 못하고 남는 부분이 생긴다.
페이징(Paging)
페이징이란 물리적인 메모리를 쪼개어 논리적 메모리를 각 프레임에 올리는 것이다. 이러한 방식은 외부 단편화를 해결 할 수 있다. 뿐만 아니라 CPU를 낭비하지 않고 사용할 수 있는 장점이 있다.
스와핑(Swaping)
CPU에서 시행되지 않는 프로세스는 메모리가 아닌 하드디스크와 같은 저장 장치에 보관하고 실행할 때만 메모리에 올리는 방식이다. 즉, ready나 wait 상태의 프로세스를 뒷단에 저장하고 running 상태일때만 메모리에 올린다.
'STUDY > 운영체제' 카테고리의 다른 글
[운영체제] 데드락(Dead lock) (0) | 2022.02.13 |
---|---|
[운영체제] 프로세스 동기화 (0) | 2022.02.06 |
[운영체제] CPU 스케줄링 (0) | 2022.01.17 |
[운영체제] 쓰레드 (thread) (0) | 2022.01.10 |
[운영체제] 프로세스 간의 통신 (IPC) (0) | 2021.12.29 |