[OS] 메모리, 주소할당, 동적 라이브러리
메모리란
- 메모리는 010101010101bit의 연속.
- CPU는 memory에서
PC(program counter)
에 따라서 메모리로부터 명령어를 가져온다.
CPU가 직접접근하는 저장장치
- 레지스터와
메모리
는 CPU가 직접 접근할 수 있는 유일한 범용 저장장치. - 모든 실행되는 명령어와 데이터들은 메모리와 CPU에 이동되어있어야한다.
- 메모리에 명렁어와 데이터가 올라가는 것은 프로그램을 실행하면서
로더
가 메모리에 이진파일로된 프로그램을 올리게 된다.
- 접근 시간 차이
- 레지스터는 CPU clock 1cycle 이내로 접근할 수 있는 매우 빠른 장치.
- 메모리 접근은 이와 다르게, 많은 CPU clock cycle이 필요하기에 CPU의 입장에서 명령어 실행은 끝났으나, 메모리에 접근해서 명령어를 받아오는 시간이 오래걸리기에
stall
되는 현상이 발생한다. - 이런 이유로 CPU와 메인 메모리 사이에는 매우 빠른 속도의 메모리인
캐시
가 존재한다.
- 프로세스간 독립된 메모리 공간 보장
- 여러 프로세스가 메모리에 적재되는데, 개별적인 메모리 공간을 분리해주기 위해서
legal memory address space
를 설정해줘야한다. - 이를 위해
base register
와limit register
를 이용해 영역을 보호한다.
- 여러 프로세스가 메모리에 적재되는데, 개별적인 메모리 공간을 분리해주기 위해서
주소 할당 (address binding)
- 주소는 사용자 프로그램이 어떤 단계에 있는가에따라 다른 형태를 가진다.
-
- 소스코드에서 주소는
symbol
의 형태로 존재한다.ex, int a
- 컴파일러가 symbol을
relocatable address
bind한다.ex, 이 모듈의 시작에서부터 4byte
- linker나 loader가 relocatable address를 absolute address로 bind한다.
ex, 0x0101
- 소스코드에서 주소는
- binding 시점에따른 구분
- compile time binding
- 프로세스가 메모리의 어디서부터 시작할지 미리 결정할 수 있고, 메인 메모리의 내용을 미리 알 수 있다면 컴파일러는
절대 코드
를 생성한다. - 현대 멀티프로세싱 시스템에서는 위 2가지 조건 다 불가능하므로, 사용 X
- 프로세스가 메모리의 어디서부터 시작할지 미리 결정할 수 있고, 메인 메모리의 내용을 미리 알 수 있다면 컴파일러는
- load time binding
- 프로그램을 실행할때, 로더가 프로그램을 메인메모리로 적재할때 논리주소를 절대주소로 바꾼다.
- 이진파일 내부에서 모든 논리주소를 절대주소로 바꾼다는 의미.
- excution time binding
- 프로세스가 실행하는 중간에 한 세그먼트로부터 다른 세크먼트로 옮겨질 수 있다면 실행시간 바인딩이 허용되었다고한다.
- 프로그램을 실행하면서 논리주소를 만날때마다 절대주소로 바꾼다.
- 오늘날 쓰이는 기법.
- compile time binding
논리주소, 물리주소
- 논리주소(logical address) : 컴파일러가 생성하는 주소
- 물리주소(physical address) : 메모리가 취급하게되는 주소, 메모리 주소 레지스터(MAR)에 주어지는 주소
- 컴파일 시간 바인딩, 적재시간 바인딩 모두 동일한 논리주소와 물리주소를 가지지만,
실행시간 바인딩은 논리주소와 물리주소가 다르다.
MMU(memory-management unit
- 프로그램 실행시간에 가상주소(논리주소)를 물리주소로 바꿔주는 장치이다.
- 재배치(기준) 레지스터 속에 들어있는 값은 CPU에서 메모리로 주소가 보내질때마다 더해진다.
동적 적재
- 메모리 공간의 효율적인 사용을 위함.
- 프로세스 전체가 미리 메모리에 올라가있는게 아님.
- 루틴(함수)는 호출되기 전까지는 relocatable 상태로 디스크에 있다가, main이나 다른 함수가 호출하면 호출한 함수가 이미 메모리에 적재되어있는지 확인하고, 없다면 relocatable linking loader가 해당 함수를 메모리로 가져오고 이를 테이블에 기록한다.
- 함수가 필요한 경우에만 적재되므로, 에러처리처럼 간혹 발생하면서도 양이 많은 코드는 프로그램 크기가 클 수는 있어도 프로세스가 실제로 사용하는 메모리는 훨씬 작다.
동적 연결 및 공유 라이브러리
- 동적 연결 라이브러리(DDL) : 사용자 프로그램이 실행될 때, 사용자 프로그램에 연결되는 시스템 라이브러리, 함수, 루틴이 호출될때 동적 라이브러리 주소에서 참조하게된다.
- 정적 연결 라이브러리 : 프로그램을 생성할때, 정적 라이브러리는 이진 프로그램 이미지에 붙여넣어진다.
- 동적 라이브러리의 장점
- 프로그램의 실행파일의 크기를 줄일 수 있다.
- 여러 프로세스가 라이브러리를 공유할 수 있다.
- 이러한 이유로
공유 라이브러리
라고도 불린다.
- 이러한 이유로
REF
Operation System Concept
Difference between compile time ,load time and execution time?
Address binding in Operating System
댓글남기기