on
운영체제 - 17
KOCW 운영체제 17강
양희재 교수님 강의를 듣고 쓴 글입니다.
Main Memory Management
OS에서 CPU자원은 process management
에서 관리한다. 그리고 주기억장치 관리는 Main Memory Management
에서 관리한다.
역사
- Core memory
- 진공관 메모리
- 트랜지스터 메모리
- 집적회로 메모리 : SRAM, DRAM
→ 메모리의 용량은 항상 증가하였으나 그에 비교하여 요구하는 메모리의 양도 늘어났기에 메모리는 언제나 부족한 것이다!
따라서 메모리의 낭비 없애기
, 가상 메모리
로 메모리를 효과적으로 사용하게 됐다.
CPU와 main memory는 간단하게 위와 같이 표현할 수 있다.
- CPU에서 데이터를 읽을 곳의 address를 main memory에 보낸다.
- main memory 에서 해당 address의 데이터를 제공한다. (반대로 CPU에서 데이터를 main memory로 줄 수도 있다. 양방향이다.)
Loader
C언어 코드가 실행되는 과정을 살펴보며 main memory management가 무슨 일을 하는지 알아보도록 하자.
-
C source file (
test.c
file)#include<stdio.h> int main() { printf("Hello C lang!"); return 0; }
C언어 source file
test.c
를 작성한다. -
Object file
➜ cLang git:(main) ✗ objdump -t test.o test.o: file format mach-o arm64 SYMBOL TABLE: 0000000000000000 l F __TEXT,__text ltmp0 0000000000000038 l O __TEXT,__cstring l_.str 0000000000000038 l O __TEXT,__cstring ltmp1 0000000000000048 l O __LD,__compact_unwind ltmp2 0000000000000000 g F __TEXT,__text _main 0000000000000000 *UND* _printf
gcc -c test.c
로 컴파일 해준다. 그리고objdump
로test.o
의 안쪽을 확인해본 결과이다. 보다시피 기계어로 이뤄져 있다. (컴파일 과정에서 compiler 의해 어셈블리 언어가 됐고, assembler에 의해 object code(위 코드)가 된 것이다.)여기서 보면,
printf
에 관한 코드는 없다. 우리는 분명printf
라는 함수가<stdio.h>
를 선언했기에 쓸 수 있는걸로 안다. 하지만 정작 실행될 기계어 파일에서는 해당 함수가 안나와있다. 그래서linker
가 library에서 해당 함수를 찾아 링크를 해주게 되는 것이다. -
Executable file : linker에 의해 링크된 결과
➜ cLang git:(main) ✗ gcc -o test_result test.c ➜ cLang git:(main) ✗ ./test_result Hello C lang!!%
로 우리의
object
file에 링크를 하여 실행가능한 파일로 만들어준다.➜ cLang git:(main) ✗ objdump -t test_result test_result: file format mach-o arm64 SYMBOL TABLE: 0000000100008008 l O __DATA,__data __dyld_private 0000000100000000 g F __TEXT,__text __mh_execute_header 0000000100003f40 g F __TEXT,__text _main 0000000000000000 *UND* _printf 0000000000000000 *UND* dyld_stub_binder
dyld_stub_binder
라는게 더 생긴 것을 볼 수 있다… -
이러한 실행가능한 파일이 실행되기 위해서는
main memory
에 load돼야 한다. 이렇게 load하는 것을Loader
라 부른다. main memory에 올라간 프로그램은 code, data, stack으로 이뤄진다.
프로그램을 메모리에 load하기
-
실행 파일(executable file)을 memory에 올리기
-
메모리 몇 번지에?
→ OS의
loader
가 알아서 고민해준다. -
다중 프로그래밍 환경에서는?
-
-
MMU(Memory Management Unit) 사용
-
Relocation register
예시) CPU입장에서는
test.c
가 0번지에서 시작하는 것으로 인지. 그러나 실제 main memory에서는 500번지에서 시작.MMU가 주소를 다시 결정해준다. 따라서 relocation register값을 바꿔줌으로써 실제로 main memory에 어디에 있는지는 상관없이 똑같이 실행시켜 준다는 것.
-
-
주소 구분
물리주소 vs 논리주소