(참고 강의 : http://www.kocw.net/home/search/kemView.do?kemId=1046323)
(계산 시간의 경우 100ns는 실제 메모리 값에 접근할 때 필요한 거고, 4단계면 페이지 테이블 4개 있으니까 400인거임 ㅇㅋ? 20은 일단 TLB에 가서 있는지 없는지 확인을 해야 하니까 둘다 더한거고)
page table에서 frame number가 0이라면 메모리에 페이지가 없다는 뜻인데,
굳이 다시 한번 valid, invalid로 현재 물리 메모리에 페이지가 없다는 뜻을 알려주는 이유는 뭘까?
PageTable 각 entry 마다 아래의 bit들을 둔다.
Protection bit은 다른 프로세스에 접근하는 걸 방지하는 용이 아니다.
그런건 애초에 주소 변환시에 걸러진다.
page는 stack, data, code 영역들 중에 하나일텐데, code는 읽기만 해야 하고, stack은 쓸 수도 있고, 이렇게 역할이 다르지 않은가. 그걸 표현하기 위해 존재하는 것이다.
몇 번 봤다. 페이지 번호가 page table의 인덱스와 일치하기에, 빈 페이지라도 할당해야 하니까.
뭔소린지 모르겠지? 아래 그림을 보자.
이제 모든 프로세스는 하나의 페이지 테이블로 관리한다.
대신 프로세스를 구별해야 되니까 Process-id(PID)가 있어야 겠지.
CPU는 PID와 페이지 번호(p)를 가지고 page table에 간다.
전부 다 뒤져야 한다. 모든 프로세스들이 섞여 있으니까.
찾으면 맨 위부터 얼마나 떨어져 있는지(f)값을 구할 수 있을 것이다.
이 f와 d로 물리적 메모리에 어디 있는지 찾을 수 있다.
page table 전부 뒤져야 한다고 했는데, TLB처럼 병렬으로 싹다 동시에 찾아야 효율이 나올 것이다.
컴퓨터에서 한글 프로그램을 3개 실행해놨다고 하자.
프로세스 3개가 생성될 것이고, 각 프로세스에서 뭘 타이핑 했냐에 따라 data,stack은 달라지겠지만
(1: 안녕하세요/2 : hello/3 : hi)
프로그램 code는 3개 다 동일할 거 아닌가? 이런 것들은 한번만 올리면 얼마나 좋을까?
프로세스 1,2,3 모두 ed1,2,3가 겹친다면, 한번만 올리는 것이다.
대신
"shared code는 모든 프로세스의 logical address space에서 동일 위치에 있어야"
는 것인데,
logical address가 ed 1 / 2 / 3 순서로 모두 동일해야 한다는 것이다.
왜?
code 안에 logical address가 적혀있는데, 저 위의 20,30의 위치가 동일해야 참조해서 불러올 거 아닌가?
여기까지가 불연속 메모리 할당(Noncontiguous allocation) 중 Paging 방법이었다.
다음은 Segmantation이다.
paging이 동일한 크기의 page로 잘랐다면,
segmentation은 "의미" 단위로 자른다.
2가지 필터가 있다.
Segment-table length register(STLR)에 프로그램이 사용하는 segment 수를 저장한다고 했는데,
만약 s가 더 크면, 말이 안된다. 탈락!
offset인 d가 limit보다 큰 값을 요구한다? 탈락!
segment table은 page table보다 많은 정보가 들어간다. 왜? 크기가 다 다르니까!
따라서 frame이 아닌 base로 정확한 위치를 찾아야 한다.
(paging에서는 몇 번 프레임 하면 바로 찾을 수 있었다. 왜? 크기가 다 같으니까)
이렇게 한 프로세스를 여러 의미있는 단위인 segment로 잘라 메모리에 적재한다.
Protection
Sharing
의미 단위로 잘랐으니 공유, 보안에 있어 훨씬 효과적이다.
Allocation
segment 길이가 동일하지 않으므로 가변분할 방식과 동일한 문제점 발생