ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 15. 메모리 낭비 방지
    운영체제/운영체제 정리 2020. 1. 5. 00:23

    보조기억장치 안에는 OS 및 다른 실행 파일들이 들어있다. 처음에 power On을 하면 OS는 메인 메모리로

     

    올라간다. 그 후 다른 실행 파일들인 프로그램들이 메인 메모리로 올라오게 된다. OS에서 가장 중요한 점은

     

    CPU를 관리해야 하는 점이었다. 즉 이제 까지 우리는 OS의 Process management를 살펴보면서 CPu scheduling과

     

    동기화 문제들을 다루었었고 이제는 OS에 memory management를 다루어 보려고 한다.

     

    H/W들 즉 자원들을 적절히 관리하여 Application들에게 나누어 주는 게 OS였고 이제는 두 번째로 중요한 메인 메모리 

     

    관리에 대해서 얘기해보자.

     

     

    시간이 지나면서 처리하는 데이터가 커지고 프로그램 크기가 증가하면서 메모리에 용량은 커졌지만 여전히 메모리는 부

     

    족하다. 따라서 우리는 메모리 관리에서 어떻게 이 부족한 메모리들을 효과적으로 사용할 수 있을까에 대해서 배워야 한다

     

     

     

    CPU가 메모리 중에 몇 번지를 읽겠다고 주소를 보낸다. 그러면 메모리는 저장돼 있는 데이터를 CPU에 보내준다.

     

    (CPU에 다시 보내주고 계산된 결과가 다시 저장되니 데이터는 양방향이다.)

     

    메모리에는 즉 주소가 있고 데이터가 있다. 그러면 프로그램은 어떻게 메인 메모리로 올릴까

     

    우선 프로그램이 무엇인지를 알아보자.

     

    high level language인 main.c 를 compile 해서 어셈블리 파일을 만들고 어셈블러가 어셈블리 파일을 main.o로 만든다,

     

    main.o에는 기계어로 변환돼있고 오브젝트 파일이라고 부른다.

     

    이제 오브젝트 파일을 링크해준다.  즉 오브젝트 파일을 엮어 실행 파일을 만들고 라이브러리 함수들을

     

    연결해준다. 이제 실제 main.exe 실행파일이 만들어진다. 즉 이 실행파일이 하드디스크 안에 들어있게 되는 것

     

    이 main.exe를 실행시키기 위해서는 메인 메모리로 올려야 실행할 수 있다.

     

     

    이 메인 메모리로 올리는 것을 load 적재한다 라고 한다.  적재해주는 프로그램을 loader라고 부른다.

     

    하나의 프로그램이 개발돼서 실행되려면 컴파일러 -> 어셈블러 -> 링커 -> 로더로 진행되게 된다.

     

    하나의 프로그램 실행 파일 안에는 code 부분 ( 기계어에 해당 ), data, 또 메인 메모리로 올라가게 되면

     

    지역변수와 매개변수 등을 저장하는 stack도 생기게 된다.

     

    즉 메모리에 구조 (Address, Data)는 어떤지 메인 메모리로 올라가는 프로그램은 어떤 영역(코드, 스택, 데이터)을 갖게

     

    되는지 알아보았다.

     

     

    이 실행파일은 메모리에 몇 번지에 적재되도록 설계되었을까?

     

    이게 참 애매하다. 오늘 1000번지에 있어도 내일 1000번지에 있을 가능성은 거의 없기 때문

     

     

    그래서 mmu를 사용하는 것

     

    mmu는 앞서 말했듯이 프로세스가 다른 영역을 침범하지 못하도록 cpu address가 바로 메모리로

     

    가지 않고 mmu를 경유한다고 하였다. 

     

    즉 Cpu가 내는 주소가 해당 프로세스 메모리 범위 주소 안에 있는지를 mmu가 감시해서 ( limit와 base register을 통해)

     

    혹시 실행되면서 자기 영역 밖을 침범한다면 바로 mmu에서 CPU로 전기신호가 가고 인터럽트를 통해

     

    바로 종료하게 된다고 배웠다.

     

    오늘 말하려는 mmu는 재배치 레지스터에 대해서 말하려고 하는데 (Relocation register)

     

    p1 프로그램을 처음 만들 적에 0번지에 적재되는 것으로 만들지만 실제 메모리에는 1000번지에

     

    적재돼있는 상황을 예로 들어보자

     

    이때 Relocation register에 1000이라는 값을 넣어두어서 Cpu는 0번지에 있다 생각하고 0번지를

     

    내지만 실제로는 1000번지로 가게 된다. 

     

    다음 날 p1이 5000번지에 적재되었다고 하면 mmu에 relocation register는 5000으로 바뀌는 것

     

    즉 p1이 어느 번지에 있던 상관없이 Cpu는 0번지에 있다고 실행하게 되고 mmu가 변환해 주게 된다.

     

    따라서 Cpu가 보는 주소와 메모리가 보는 주소가 따로 있게 된다.

     

    CPu가 내는 주소 : Logical Address 논리 주소

     

    실제 메모리로 가는 주소 : Physical Address 물리 주소

     

    예를 들어 Cpu는 항상 모든 프로그램이 0번지에 돈다고 생각하지만 mmu가 모두 바꿔준다고 생각하자

     

     

     

    운영체제의 목적은 뭘까?

     

    효율을 높게 만드는 것이 주된 이유이다. 가능한 메모리가 낭비돼서는 안 되겠다.

     

    메모리 낭비 방지 방법들

     

    -Dynamic Loading ( 동적 적재 )

    (Loading 이란 메인 메모리로 만들어진 실행파일을 올리는 것 )

     

    : 프로그램 실행에 반드시 필요한 루틴/데이터만 적재한다.

     

    오류처리 루틴은 오류가 일어나야지 사용되고, 배열도 다 사용되지는 않고, 자바의 모든

     

    클래스가 다 사용되지는 않듯이 실행 시 필요하면 그때 해당 부분을 메모리에 올리자는 것

     

    가장 필수적인 것만 올리자. 

     

     

    -Dynamic Linking ( 동적 연결 )

     

    : 여러 프로그램에 공통적으로 사용되는 라이브러리를 중복으로 올리는 것은 낭비다.

     

    하나만 올려놓자. 따라서 실행 파일 만들 적에 link 하지 말고 일단 메모리에 로드된 다음에 필요시

     

    링크하게 된다.

     

    따라서 오직 하나의 라이브러리 루틴만 메모리에 적재되고 다른 애플리케이션 실행 시 이 루틴과 연결된다.

     

    -Swapping

     

    : 메모리에 적재되어 있으나 현재 사용되지 않고 있는 프로세스를 메모리 활용도를 높이기 위해

     

    Backing store로 몰아내는 것.

     

    메모리에 올라와는 있는 데 사용이 안되고 있네?  OS가 하드디스크의 일부분을 지정해서 이 프로세스의

     

    현재 이미지 그대로 몰아낸다. 그러면 메모리가 다시 나게 되고 다른 프로세스가 쓰게 된다.

     

    (swap - out )

     

    backing store에서 다시 프로세스를 사용하려면 이미 그 메모리 번지에 다른 프로세스가

     

    사용 시 다른 번지에 적재되게 되지만 mmu relocation register 값만 바꿔주면 되니 문제없다.

     

    (swap - in )

     

    프로세스 크기가 크면 backing store 입출력에 따른 부담이 커진다.

     

     

    '운영체제 > 운영체제 정리' 카테고리의 다른 글

    17. 내부 단편화와 페이지 테이블  (0) 2020.01.20
    16. 외부 단편화와 페이징  (0) 2020.01.10
    14. 모니터  (0) 2019.12.31
    13. 교착상태 ( Deadlock)  (0) 2019.12.15
    12. 임계구역과 세마포어  (0) 2019.11.18
Designed by Tistory.