KOCW.이화여자대학교.반효경.운영체제
위 강의를 바탕으로 학습 및 정리했습니다
메모리는 주소를 통해서 접근하는 장치
-> 메모리 주소는 크게 2가지
프로그래머가 바라볼 때 -> 심볼릭 주소(변수이름, 함수이름 등)
컴파일 후 실행파일 등이 되었을 때 -> 로지컬 주소
실행될 때 -> 물리적 주소
논리 주소 -> 물리 주소 변환(주소 바인딩)은 누가 해줌?
-> 운영체제 x ,하드웨어가 해줌
오리지널 의미는 메모리에서 프로세스를 통채로 쫒아내는거
중기 스케줄러
스와핑엔 runtime 바인딩이 좋음
linking 하면 실행파일 코드에 라이브러리 코드가 포함이됨
-> Static Linking
라이브러리가 별도의 파일로 존재
-> 라이브러리 필요할 때 파일형태로 찾아서 메모리에 올림 (stub이라는 라이브러리 위치 찾기 코드가 있음)
-> 연결
-> Dynamic Linking (== Shared library / .so, . dll)
Dynamic 장점
고정 분할
가변 분할
가장 처음 찾아지는데에 할당
프로그램 사이즈보다 큰 거중에 가장 작은거에 할당 (best fit)
제일 큰 hole에 할당 (worst)
빈공간들을 한데 모아서 큰 hole로 만드는 방법
비용이 많이 듬
runtime 바인딩에서만 컴팩션 가능
불연속할당은 위처럼 레지스터 2개 만으로 주소 할당하기 힘듬
-> 프로그램 주소공간이 여러개로 짤려서 각각이 다른 부분에 올라가기 때문에 어려움
페이징 기법
-> 보통 사용하는 페이지 크기는 4KB
-> 프로세스가 4GB라고 했을 때 페이지 약 100만개 생김
-> 페이지테이블 100만개 필요
주소 접근 + 데이터 접근 -> 시간 너무 오래 걸림
안쪽 페이지 테이블 = 4KB
물리적인 주소를 가지고 논리적 주소를 얻어내기 쉬운 구조
-> 하지만 그 역은 페이지 테이블을 싹 검색해봐야 하는 구조
원래 page table의 장점은 논리적 주소를 가지고 물리적 주소를 금방 얻어낼 수 있는 구조인데 이는 그닥 효율적인 구조가 아님
+여러 프로세스가 p번째 페이지를 모두 갖고 있을 텐데 어느 프로세스의 p번째 테이블인지도 pid를 통해 따로 기록해놔야함
-> 병행 search가 가능한 associative resiater 사용 (근데 비싸다)
같은 프로그램이 프로세스 3개 생성하면
-> 사용하는 코드는 같고 데이터 부분만 다름
-> 다 따로 올리면 메모리 낭비
-> 따라서 shared code들은 한 copy만 메모리에 올리고 공유함
제약조건
(Shared memory는 서로 다른 프로세스가 커뮤니케이션을 위해 공유하는 것(읽기/쓰기 다 가능)이므로 차이가 있음)
CPU가 논리주소를 줌(s/d)
주소를 찾아갔을 때 segment 길이(limit)보다 긴 부분을 d(offset)이 지정하고 있으면 주소 변환해주면 안됨(자기 범위가 아닌 부분을 접근하려는 불순한 요청임)
STLR = 3인데 s = 5 라면 위와 같이 비슷한 상황(불순한 접근)
외부조각 발생
-> 외부조각 중에 어떤 부분에 세그먼트를 할당해야하냐의 문제 발생
현실적인 구현을 생각하면 Segmentation이 편함
연속할당에서 발생한 문제와 해결방법 비슷
Protection / Sharing의 관점에선 Paging보다 효과적
Allocation은 크기 기준으로 나눠서 세그먼트 기법과 잘 안맞음
pure한 segmentation을 실제로 시스템에서 사용하지 않음 (메모리 관련 이슈)
-> paging 기법을 근간으로 사용
-> 실제 시스템에서 사용하는 방법
segment 크기가 page 크기의 배수가 되게함
물리적 메모리는 page 단위로 잘라놓고 관리
대신 의미 단위로 관리하는 것들은 segment table을 통해 관리