#1
메모리 : 주소를 통해 접근하는 매체
메모리는 주소가 매겨짐
바인딩 : 주소를 결정
언제하는가? 3가지가 있음
symbolic -> logical -> physical
프로그래머 입장에서 주소에 대한 개념은 숫자가 아니라 변수같은 심볼
컴파일하면서 숫자주소가 될거고
실행이 되려면 물리주소로 변환이 돼야함

언제 되는가

cpu가 아는 건 logical
주소변환을 해줘야함

주소변환을 해주는 하드웨어, mmu

가장 단순한 방법이 레지스터 두개로
논리주소를 요청하면 물리주소로 변환해서 해당되는 위치로 감
지금은 0부터 3000이 14000부터 17000인거
혹시 이때 4000을 요청하면?

트랩이 발생(sw interrupt)
cpu제어권이 os에 넘어가게됨
잘못된 주소를 참조하려했음 그에 따른 로직이 실행될거

프로그램을 메모리에 동적으로 올림

프로그래머가 직접

프로세스를 메모리에서 통째로 쫓아내는거 하드디스크로
이렇게 쫓아내는 곳을 backing store 혹은 swap area라고 부름
쫓겨나는게 swapout 다시들어오는게 swapin
swapper(중기스케줄러)가 판단해서 쫓아냄

파일 입출력과 다르게 옮길 양이 많음
swap time은 양에 비례함
seek타임은 헤더를? 옮길때 드는 시간 이게 대부분임
근데 swap에서는 transfer time도 중요하긴함?
원래 스와핑은 통째로 쫓겨나는건데
부분부분 일부페이지만 쫓겨났다 들어왔다 하는 것도 스왑아웃이라고 함

컴파일하고 링킹해서 실행파일을 만드는데
따로 코딩해서 링킹하기도하고
원래 있는거 라이브러리를 링킹하기도 함
라이브러리를 찾을 수 있는 포인터만 코드에 있고
라이브러리 자체는 포함이 안됨
보통 파일 형태로 존재
이제 물리적인 메모리를 어떻게 관리할 것인가

메모리는 일반적으로 두 영역으로 나뉨
사용자 영역 관리방법



가변분할을 쓰게 되면 Hole이 생김
이게 산발적으롱 생김
그럼 운영체제는 어디는 쓰고 안쓰고를 관리해야겠죠 // 할당기?
프로그램이 실행될때 어디다 새로운 프로그램을 넣을 것인가 - 동적 할당

어느 홀에 사이즈n인 프로그램을 넣을 것인가
: hole이 n보다 커야함
세가지 알고리즘이 있음
-> first, best가 속도와 공간 이용률 측면에서 낫더라


외부조각들을 한데 모아서 큰 홀을 만듦
비용이 많이 드는 작업
런타임 바인딩이 지원돼야 가능
효율은 작은 애들을 옮기는게 낫겠죠
어떤 걸 이동시킬 것인가를 결정하는 문제도 있음
실제 사용되는건 불연속 할당임
0608
사용자 영역을 관리하는 기법중 불연속할당 방식의 하나
페이지 별로 주소변환을 해야하니 이제 단순하진 않음
페이징 기법은

프로그램을 구성하는 논리적인 메모리를 동일한 크기의 페이지로 잘라서 페이지 별로 물리적인 메모리에 자리가 있으면 올라갈 수 있게 됨
논리->물리 주소변환을 위해 페이지 테이블이 필요
페이지 테이블 : 논리적이 페이지가 물리적인 어느페이지 프레임에 들어가는지 1번이 어디있는가 하는 테이블, 페이지 개수만큼의 엔트리가 들어있음
* 테이블이나 배열 : 인덱스를 이용해 접근할 수 있는 자료구조

논리적인 주소가 들어오면 앞부분은 주소, 뒷부분은 오프셋을 나타냄
테이블 내에 p번째에 저장된 f 프레임번호를 찾고 그 안에서 d를 찾음
d : 상대적인 내부주소, 변환해도 바뀌지 않음
앞에서는 레지스터로 변환을 했었는데 그러기에 용량이 너무큼
프로그램마다 별로도 테이블을 가지므로 대강 백만개의 테이블이 필요함
그래서 페이지테이블은 메모리에 저장

메모리에 접근하려면 두번의 접근이 필요함

tlb에 캐싱

2단계방식



페이지테이블도 계층적으로 관리

쫓아들어가서 데이터를 찾음
페이지가 4kb니까 안에들어가는 페이지테이블도 4kb짜리
엔트리는 4바이트 그럼 테이블 하나에 1k개의 엔ㄴ트리를 넣을 수 있음


오프셋 : 2의 12승 바이트 4k바이트를 구별하려면 12비트가 필요함
단계별 페이지테이블을 찾아들어가려면 테이블이 어디있는지도 나눠서 적히겠지

똑같이 10칸씩 주나봄

32가 아니라 64비트라면??
..
2단계 페이지 테이블
페이지테이블도 자리를 차지하는데 왜쓰냐
안쓰는 공간도 다 엔트리로 바꿔야함
최대 논리주소크기만큼 그걸 다 만들어야함
단계를 두면 사용되는 것들에 대해서만 안쪽 테이블이 만들어짐

안쓰이는 건 null로 들어있음

페이지테이블을 두개보다 많이 쓸수 있지
2,3,4단계 이렇게 하면 테이블을 위한 메모리를 덜 쓸수있는데
한번 주소변환을 할때 여러번 접근해야하는 상황이 생김
tlb : 주소변환을 전담해주는 일종의 캐시 메모리

의미있는 덩어리
세그먼트 테이블을 통해 물리주소로 변환
이 테이블은 엔트리개수가 세그먼트 개수가됨
세그먼트 내에서의 오프셋
오프셋이 세그먼트테이블길이보다 작아야함
벗어나면 폴트

레지스터두개
하나는 테이블의 위치
하나는 엔트리의 개수
번호랑 오프셋이 잘못된 곳을 참조하지 않는지 확인해야함

의미단위로 하는일은 세그멘테이션이 유리하고
크기가 균일하지 않아서 홀이 생김,
페이징은 균일한 크기로 나눔
테이블을 위한 메모리낭비가 있음

각각의 프로세스가 세그먼트를 공유
코드는 공유하고 private한건 따로씀?

세그먼트+페이지
세그먼트안에 페이지테이블도있음
이 챕터의 메인은 주소변환
운영체제는 주소변환을 하지 않음 ; 하드웨어(mmu)가 해줌
cpu가 논리주소를 주면 물리주소를 돌려줌
os는 하는게 없음

중간에 운영체제가 개입하려면 중간에 또 제어권이 넘어가야함
하드웨어가 해주는 주소변환을 통해 이뤄짐
그래서 여기까진 운영체제가 하는 일이 없음