limit = 120900
base = start address 300040
컴파일 시간에 하는 바인딩
그냥 컴파일 때 특정 주소로 박게 된다.
만약 주소가 바뀌어야 하면 다시,,
적재시간에 바인딩
재배치 가능하도록 컴파일을 한다.
로더가 메모리에 올릴 때 바인딩한다.
실행시간에 바인딩
실행시간에도
메모리 상에서 위치가 막 변한다.
만약, 어떤 공유라이브러리가 있다고 하자.
만약, 로더가 이거를 배치하려고 하면, 링커 단에서 공유라이브러리에 대한 재배치 가능한 오브젝트 파일을 항상 연결해서 실행파일을 만들어야 한다.
이게 낭비이기 때문에, 현재 메모리에 적재된 공유 라이브러리를 찾아서 올리자!
이렇게 하기 위해서는, 실행시간에 적재되어야 한다.
유지보수가 쉬워지겠지.
잦은 적재와 삭제로
프로세스 사이 공간이
정말 파편화가 심하게 되는 경우
0.5N법칙이라는게 있다.
반은 버리더라,,
압축하는 방법
그냥 한 쪽으로 다 몬다.
재배치가 실행시간에 동적으로 정해질 때만 가능하겠지.
이전처럼, 로더에 모두 몰빵되어있다면 힘들다.
탐색시간은 영향을 거의 미치지 않고, 애초에 TLB를 태워도 파이프라인으로 잘 처리가 되서 괜찮다.
set associative에서는 뒷 주소를 사용해서, 한쪽으로만 안 쓰이도록et associative에서는 뒷 주소를 사용해서, 한쪽으로만 안 쓰이도록
중요 커널코드를 고정하는 경우도 있다.
ASID : 프로세스의 번호를 TLB에 넣어 놓는다.
프로세스마다 페이지 넘버는 중복될 수 있다.
다른 프로세스가 접근하는 것을 막기 위해,
그냥 TLB를 날려버리는 거를 방지하기 위함.
프로세스 번호가 다르면 tlb miss를 낸다.
사실 실제로는 멀티레벨로 구현되어 있다.
메모리 접근이 한번 줄어든다. 따라서, (hit) 메모리접근시간 + no_hit 메모리접근시간 * 2 가 된다.
32bit
페이지의 크기 12bit(4kb)
그렇다면, 페이지의 개수 = 페이지 테이블 = 2^20 = 1M
하나당 4Byte니까 4MB가 된다.
p를 이용하여 해시함수를 쓴다
해시 함수의 value는, 프레임 위치 및 원래 페이지 테이블에 있던 각 정보가 담긴다.
충돌 체이닝으로 관리
변형
클러스터 페이지 테이블
hash의 결과가, 한 16개 정도의 페이지를 담은 테이블인거임.
그러면, 거기서 페이지를 뽑아서 쓸 수 있게끔
커널에, 딱 하나의 역 페이지 테이블만 존재합니다.
process id와 page number로 조회를 한다
이 때, 오버헤드가 생길 수 있다.
해시테이블을 이용하면 조금 덜 할 수 있다.
pid, page number로 해시한 결과에다가, 프레임 넘버를 저장하면 바로바로 찾을 수는 있다.
하지만, 해시테이블을 또 참조해야 하는 결과가 있을 수도 있다.
엔트리 안에 프레임 넘버가 있다
그냥 역 페이지 테이블 안에 없으면 메모리에 없는 거임
공유메모리 할당이 조금 애매하다.
생각해볼 점들
페이지 테이블에서, 어떤 페이지가 스왑공간의 어디에 적재되어 있어야 하는 지를 확인하기가 어렵기 때문에, 이를 위한 별도의 공간이 필요하다. 그러면 어차피 그만큼의 공간이 필요한 것이 아닌가?
설마..
다중프로그래밍 정도를 증가시킬 수 있다.
실제 메모리보다 초과해서 사용할 수 있다.
파일시스템 없이 raw하게 불러오고 써서 빠르게 한다.
FLASH 메모리를 하면, 계속해서 써야하므로 적합하지 않다.
공유메모리는 공유 가능유메모리는 공유 가능
즉, 세그멘테이션 포인터를 통해 어떤 세그멘트에 포함되는지를 확인한다.
g는 LDT인지, GDT인지를 나타낸다
세그멘테이션은 반으로 쪼개진다.
반은 공유되는 영역이고,
반은 자기만 쓰는 영역이다.
p는 보호와 관련된 비트이다.