CPU 와 Main Memory

황상익·2024년 11월 11일
0

CS

목록 보기
12/18

자바 언어로 우리는 프로그램(명령어, 코드 및 정적인 데이터의 묶음이며 아직 실행되지 않은 상태를 의미)을 짠다.

public static void main(String[] args) {
    log.info("My First Programs");
}

하나의 애플리케이션에 있는 데이터들이 메모리에 로드, 프로세스 생성
compiler가 바이트 코드로 쓰여진 class 파일을 만들고 interpreter가 한줄 씩 해석, -> 기계어로 번역
프로그램이 메모리에 적재되는 순간 프로스세가 된다고 보면 된다.
메인 메모리에 로드된 데이터들이 CPU와 연산에 의해 프로그램 실행 동작

CPU는 모든 실행이 되는 명령과 데이터들을 메인 메모리에서 가져옴

논리주소와 물리주소

프로세스는 실행을 위해 메모리에 적재되면 프로세스를 위한 독자적 주소 공간이 생김 = Logical Address
논리주소는 프로세스마다 독립적 할당. 프로세스의 메모리 영역에 할당된 주소들은 논리주소.
웹 애플리케이션에서 작성한 코드들이 프로세스의 메모리 영역에 할당, 각 논리주소 부여. 그리고 웹 애플리케이션이 실행, 메모리에 적재되면 기억장치 메모리의 주소도 있기 때문에 할당되는 주소를 physical address라고 함

주소 Binding

논리 주소황 물리 주소를 사용, 서로 주소 값이 매칭 되지 않아 문제 발생
주소 바인딩은 프로그램의 명령어와 데이터를 메모리에 적재할 때,, 메모리 주소를 결정
프로그램에서 사요하는 심블(전역변수, 함수 등) 메모리의 어떤 주소가 있어야 실행 될때 그 주소를 사용, (읽기/쓰기) 할 수 있음

메모리 번지를 언제 결정하느냐에 따라 세가지 방식이 나뉨

  • compile time bindging
  • load time binding
  • execution time binding

컴파일 시간 바인딩


지금 현재 Logical Addrss에서 0x00100000 ~ 0x00198000 주소 범위에 func() 함수 내의 데이터와 변수 등이 저장 그리고 Physical address 또한 같은 주소를 부여

컴파일 시간 바인딩은 논리주소와 물리 주소 동일

  • 특징
    - 논리주소와 물리주소 동일
    - 정확히 말하자면, 논리 주소를 물리주소로 변환
    - 컴파일 시간에 절대 코드를 생성
    - 절대 코드란, 코드가 이미 정해진 메모리 주소에 로드
    - 프로그램에 메모리 내에 적재할 위치를 컴파일 시간에 결정
    - 컴파일 시간에 물리 메모리 주소 결정
    - 멀티 프로세스, 멀티 스레드 환경의 프로그래밍에서 이 방식을 사용 하기 힘듬.
    이미 다른 프로세스가 명령한 주소를 소유하고 있다면 사용 X. physical address 바인딩 되어 수행된다고 가정 -> 이 방식 사용 X

적재 시간 바인딩


로딩할때 물리 주소를 결정하는 방식. 따라서 프로그램 내부에서 사용하는 주소랑 물리주소 다름
적재 시간 바인딩에서는 프로그램 내부에서 상대 주소라는 개념을 도입해서 사용.
data 0 번지 부터 98000번지에 위치 Ram 로드 될 때 위치가 10만 번지 로드 => 상대 주소에 10만의 값만 더해 주면 됨.

  • 특징
    - 논리 주소와 물리 주소가 다르다.
    • 적재 시간에 물리주소를 결정
    • 컴파일 터임과 달리 주소가 변경되기 때문에 재배치 가능한 로드의 특징을 갖는다
      • 재배치 가능한 코드를 가지면, 주소가 변경 되어도 다시 적재
    • 로드 타임 바인딩은 프로그램 안에서 사용, 메모리 주소를 이 프로그램 전체를 로딩, 이 프로그램이 메모리 어느 위치에 로딩 되는 지에 따라 주소 변경

적재 시간 바인딩의 단점은 프로그램 안에 코득들과 데이터, 명령어들이 많은데 이것을 로딩할 때마다 주소를 결정하게 되면 메모리를 로딩할때 시간이 오래 걸린다는 단점. 실제로는 잘 사용되지 않음

실행 시간 바인딩


실행시 물리주소를 변경
실행시간 바인딩의 특징은 연산 더하기, 더하기 연산을 하는 위치를 보면 하드웨어. 즉 더하기 연산을 수행하기 위한 하드웨어가 별도로 필요 MMU (CPU 코어 안에 탑재, 실제 주소 -> 메모리 주소)
하드웨어 성능이 좋아져 실행 시간 바인딩 하더라도 성능 Issue는 큰 문제 없음

동적 적재

컴파일 타임, 적재 시간, 실행 시간 방식 전부 프로세스가 실행되기 위해 프로세스 전체가 메모리 위에 올라와야 함. 이 경우 프로세스의 크기가 메모리의 크기보다 크면 안됨

메모리 공간을 보다 효율적으로 사용 -> 동적 적재 방식 등장
동적 적재 에서 각 루틴은 실제 호출 되기 전까지 메모리에 올라가지 않고 재배치한 상태로 디스크에서 대기
자바 언어에서 객체를 만들 때 사용되는 방식이 바로 동적 적재(동적 로딩) 방식
필요한 시점에 메모리로 로딩해서 사용

  1. CPU가 해당 루팅 수행 요청
  2. 메모리에 해당 루틴 적재 되었는지 확인
  3. 적재되지 않았다면 재배치 연결 적재기를 호출, 필요한 루틴 적재
  4. CPU는 요청한 루틴 수행

루틴이 필요한 경우에만 적재

스와핑

프로세스가 실행되기 위해서는 메모리에 있어야 하지만, 프로세스는 실행 중 임시로 예비 저장 장치로 내보내어 졌다가 실행을 계속 하기 위해 다시 메모리로 돌아 올 수 있음
-> backup store 에는 하드디스크나, ssd 같은 storage 를 의미

20개 최대 프로세스를 올릴 수 있다고 가정, 메모리가 꽉 찬 상태에서 21번째의 프로세스 실행, 이미 실행 중인 프로세스를 잠시 backup store 저장, 빈 공간에 새로운 프로세스를 집어 넣는다.

처음 실행 준비가 된 모든 프로세스들은 준비 리스트에 들어가 있음, CPU 스케줄러가 다시 실행할 프로세스를 선정시 디스패처를 호출, 디스패처는 준비 리스트에 있는 다음 프로세스가 메모리에 올라와 잇는지 확인. 만약 올라와 있지 않다면 디스크에서 불러들인다. 만약 실행 시킬 프로세스를 위한 공간이 메모리에 없다면 공간을 만들기 위해 현재 메모리에 올라와 앗는 프로세스를 내보내고 실행시킬 프로세스를 메모리에 적재

프로세스의 Context-Swithcing 비용은 크기 때문에 현대 운영체제에서는 스와핑이 사용되지 않는다. 대신 스와핑을 변형한 방식을 사용한다고 한다.(Ex. UNIX, Linux, Windows 등) 이 부분에서는 다루지 않을 것

스와핑은 swap-in, swap-out 의 단위가 프로세스(process)인 반면, VMM 은 페이징(paging)이라는 단위로 스와핑을 실시

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글