운영체제 - 17

KOCW 운영체제 17강

양희재 교수님 강의를 듣고 쓴 글입니다.


Main Memory Management

OS에서 CPU자원은 process management 에서 관리한다. 그리고 주기억장치 관리는 Main Memory Management 에서 관리한다.


역사

→ 메모리의 용량은 항상 증가하였으나 그에 비교하여 요구하는 메모리의 양도 늘어났기에 메모리는 언제나 부족한 것이다!

따라서 메모리의 낭비 없애기, 가상 메모리 로 메모리를 효과적으로 사용하게 됐다.


os4_1

CPU와 main memory는 간단하게 위와 같이 표현할 수 있다.

  1. CPU에서 데이터를 읽을 곳의 address를 main memory에 보낸다.
  2. main memory 에서 해당 address의 데이터를 제공한다. (반대로 CPU에서 데이터를 main memory로 줄 수도 있다. 양방향이다.)


Loader

C언어 코드가 실행되는 과정을 살펴보며 main memory management가 무슨 일을 하는지 알아보도록 하자.

  1. C source file (test.c file)

    #include<stdio.h>
       
    int main() {
      printf("Hello C lang!");
      return 0;
    }
    

    C언어 source file test.c를 작성한다.


  2. 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로 컴파일 해준다. 그리고 objdumptest.o 의 안쪽을 확인해본 결과이다. 보다시피 기계어로 이뤄져 있다. (컴파일 과정에서 compiler 의해 어셈블리 언어가 됐고, assembler에 의해 object code(위 코드)가 된 것이다.)


    여기서 보면, printf에 관한 코드는 없다. 우리는 분명 printf라는 함수가 <stdio.h> 를 선언했기에 쓸 수 있는걸로 안다. 하지만 정작 실행될 기계어 파일에서는 해당 함수가 안나와있다. 그래서 linker 가 library에서 해당 함수를 찾아 링크를 해주게 되는 것이다.


  3. 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 라는게 더 생긴 것을 볼 수 있다…


  4. 이러한 실행가능한 파일이 실행되기 위해서는 main memory 에 load돼야 한다. 이렇게 load하는 것을 Loader 라 부른다. main memory에 올라간 프로그램은 code, data, stack으로 이뤄진다.

    os17_2


프로그램을 메모리에 load하기

  1. 실행 파일(executable file)을 memory에 올리기

    • 메모리 몇 번지에?

      → OS의 loader가 알아서 고민해준다.

    • 다중 프로그래밍 환경에서는?

  2. MMU(Memory Management Unit) 사용

    • Relocation register

      예시) CPU입장에서는 test.c가 0번지에서 시작하는 것으로 인지. 그러나 실제 main memory에서는 500번지에서 시작.

      MMU가 주소를 다시 결정해준다. 따라서 relocation register값을 바꿔줌으로써 실제로 main memory에 어디에 있는지는 상관없이 똑같이 실행시켜 준다는 것.

  3. 주소 구분

    물리주소 vs 논리주소