인프런 워밍업 클럽2 cs <day11>
운영체제
가상메모리 | 세그먼트, 페이징
RAM | 가변분할, 고정분할
(세그먼트,페이징이랑 가변분할이랑 고정분할이랑 갑자기 뭔차이지? 라는 생각이 들어서 이전 수업 듣고 까먹지 않게 적어놨다)
(가상메모리 ram 차이가아니고 그냥 가변분할은 어떤 종류다~ 말하는거같기도하고)
가상메모리 개요
컴퓨터마다 메모리의 크기가 달라, 작업할 프로세스크기 > 메모리 일 경우 -> 실행불가
문제 해결 방법 : 가상메모리를 사용.
메모리 관리자가 프로세스크기와 할당할 번지를 신경쓰지 않도록 0x0 번지부터 할당한다고
여기게 한다.메모리 관리자 덕분에 프로세스와 메모리는 직접적으로 부딪힐 일이 없다.
? 가상메모리 안에 메모리 관리자가 들어있나여? 사진이 안에 들어가있네 가상메모리 관리자라고 해야되나가상메모리 크기는 이론적으로는 무한, cpu 비트 수 + 메모리 크기에 정해진다.
프로세스 처리 양 > 메모리 크기 일때
처리하지 못한 프로세스를 하드디스크에 있는 스왕엽역으로 이동
처리가 필요할 때 물리 메모리로 가져와서 실행 시킨다.
- 32bit = 4GB => 메모리 크기도 4GB
- 메모리 크기가 4GB 일 때, 프로세스 4GB *5 개 작업해야한다. => 디스크의 스왑영역으로 이동동적 주소변환 (DAT) : 메모리 관리자는 물리메모리와 스왑여역까지 합쳐 프로세스가
사용하는 가상주소를 물리주소로 변환
실제 0x0 번지 물리주소에는 운영체제 영역 -> 프로세스들은 사용 x
가상메모리 시스템에서는 나머지영역을 가변분할 방식, 고정분할 방식으로 나뉜다.
-가변분할 (세그먼테이션) / 고정분할방식 (페이징) / 페이지드 세그먼트 (혼용)
메모리 관리자는 가상주소 - 물리주소 => 1대1 매핑 테이블로 관리
세그멘테이션 (배치 정책)
세그멘테이션 -> 프로세스를 함수, 모듈 등으로 세그먼트를 구성한다.
사용자 입장 : 세그먼트들(함수 + 모듈 ..)은 서로 인접하지 않는다.
프로세스 입장 : 영역들이 서로 인접해 있다.
논리주소
논리주소는 사용자, 프로세스 CPU 사용
논리주소 -> 물리주소 변환은 메모리관리자가 담당
메모리 관리자는 세그멘테이션 테이블을 가지고 물리 메모리 주소를 계산한다.
논리주소 -> 물리주소 변환 과정
cpu에서 논리주소 전달 -> 메모리 관리자가 몇번 세그먼트인지 알아낸다
-> 메모리 관리자 내에 있는 Segment Table Base Register 를 이용해서 물리 메모리 내에 있는 세그멘테이션을 찾는다.
(여기서 STBR 와 세그멘테이션 테이블은 다르다. STBR에서 세그멘테이션을 찾고 찾은 걸로 세그먼트번호 참조)
-> 세그먼트 번호를 인덱스로 Base Address, BoundAddress를 찾는다.
(운영체제는 컨텍스트 스위칭이 일어날 때마다 STBR의 내용을 해당 프로세스의 값으로 바꿔줘야한다.)
-> Bound Address는 메모리의 크기를 나타낸다.
메모리 관리자는 cpu에서 받은 논리주소와 Bound Address의 크기를 비교한다.
-> 논리주소 < Bound Address 일 경우, 논리주소 + Base Address = 물리주소 구하기.
논리주소 > Bound Address 일 경우, 메모리를 침범했다고 생각하고 에러를 내보낸다.
세그먼트 3번이 0x750번지로 접근
cpu의 요청을 받은 메모리 관리자, STBR 을 이용해서 물리 메모리 내에 있는 세그멘테이션을 찾는다.
-> 세그먼트 번호를 인덱스로 세그멘테이션 테이블을 참조한다. 3번 세그먼트, BA 500
-> 논리주소 > Bound Address 이므로 에러를 발생시킨다.세그멘테이션 장점 :
메모리를 가변적으로 분할할 수 있다.
코드영역,데이터영역,힙,스택 모두 모듈로 처리가능 => 각 영역의 공유와 접근보호가 쉽다.
세그멘테이션 단점 :
외부단편화 발생
페이징(배치정책)
고정분할 방식 사용
메모리 할당 시 정해진 크기로 페이지를 나눈다. =>관리하기 쉬움, 외부단편화 발생하지 않음
논리주소공간에서는 페이지, 물리주소 공간에서는 프레임이라고 부른다.
페이징 주소변환
페이지 넘버 (인덱스 ) = 논리주소 / 페이지크기
오프셋 = 논리주소 % 페이지크기
메모리관리자는 페이지테이블을 가진다.
CPU 32bit , 논리주소공간 4GB 물리주소 공간 2GB (논리 > 물리 크기를 설정함으로써 스왑영역을 사용하는 걸로 가정)
논리주소공간을 16MB 256페이지로 나눈다.
물리주소 공간(2GB) -> 16MB * 128 로 나눈다
CPU가 논리주소를 메모리 관리자에게 넘긴다.
-> 메모리관리자 안에 있는 PageTableBaseRegister를 이용해서 페이지 물리 메모리에 있는 페이지 테이블을 찾는다.
-> 페이지 번호는 인덱스로, 프레임 번호를 알아낸다.
-> 오프셋을 이용해 물리주소로 변환한다.
ex 1번 인덱스의 프레임 번호는 1번. 프레임번호 + 오프셋 = 물리주소 => 1477217
(페이지 테이블에 프레임 = Invalid 일경우 스왑영역에 저장된 부분임)
(PTBR은 운영체제가 컨텍스트 스위칭할 때 마다 해당 프로세스의 것으로 업데이트해준다)
세그멘테이션 vs 페이징
세그멘테이션 : 프소세스마다 크기가 달라서 bound Address가 필요하다.
페이징 : 모든 페이지가 크기가 동일해서 Bound Address가 필요하지 않다.
페이징의 내부단편화
세그멘테이션 : 논리적인 영역별로 세그먼트를 나눈다.
페이징 : 논리적인 영역별로 나누기보다 정해진 크기로 나눈다.
특정 영역만 공유하거나 권한 부여가 어렵다.페이지 테이블의 크기를 얼만큼씩 나눌지가 제일 중요하다,
프로세스 많아질수록, 페이지테이블 늘어난다. => 프로세스가 실제로 사용할 수있는 메모리영역🔽
페이지 테이블도 물리 메모리의 운영체제 영역에 저장되어 있다.
-> 페이지 테이블이 크면 사용자 영역이 부족해진다STBR로 세그멘테이션을 찾는다고 했는데 그럼 세그멘테이션이 겁나 많아서 세그멘티에션 테이블도 많다는 건가? 위와 같은 맥락인 것 같다.
페이지드 세그멘테이션(배치정책)
세그멘테이션 + 페이징 장점 취합
세그먼트로 나눠 관리해서 다른 프로세스와 공유, 권한 부여가 쉽다.
오버헤드가 적고 페이지 크기를 정해 나눠서 할당 시킨다.
메모리 접근 권한 : 메모리 특정번지에 부여된 권한
읽기(READ), 쓰기(Write), 실행(EXECUTE)
프로세스는 영역마다 접근권한이 있다.
CODE영역 : 프로그램 그자체. 수정되면 안됨. 읽기 실행권한
DATA 영역 : 일반변수, 전역변수, 상수로 선언한 변수가 저장. 읽기권한 쓰기권한은 없거나 있다.
HEAP,STACK영역 : 읽기 쓰기 권한
메모리 접근 권한 검사 : 논리주소에서 물리주소로 변환할 때마다 실시된다.
권한비트를 추가해서 검사를 한다.
권한이 없는 메모리가 접근 시 에러를 발생시킨다.페이지드 세그멘테이션 : 세그멘테이션 테이블 + 페이지 테이블 사용
권한비트 , Bass Addres(페이지넘버), Bound Address(페이지개수) 로 변환 시킨다.
cpu에서 논리주소를 메모리 관리자에게 넘긴다.
-> 세그먼트를 찾는 방식으로 세그먼트를 찾는다.
-> 권한비트로 세그먼트 권한을 위반하는지 검사한다.
(권한 위반 시 프로세스 종료)
-> 페이지 넘버 = 인덱스. 페이지 넘버에서 인덱스를 참조해서 프레임을 알아낸다.페이지드 세그먼트 단점 : 세그멘테이션테이블과 페이지 테이블을 참조할 때 총 메모리 접근이 두 번이다.
=> 현재 운영체제는 페이지드 세그먼트와 페이징 기능을 적절히 섞어 작업한다.
알고리즘
삽입 정렬
정렬된 영역 맨 끝 원소와 정렬되지 않은 영역 첫 원소와 크기를 비교하여 정렬하고
정렬되지 않은 영역에서 비교하는 원소A > 정렬된 영역 원소B 경우 => 정렬된 영역 원소 다음 원소와 비교
해당원소 자리에 정렬된 영역 원소B 복사
정렬되지 않은 영역에서 비교하는 원소A < 정렬된 영역 원소B 경우 => 정렬된 영역 원소 이전 원소에 A 삽입
function InsertionSort (arr) {
for(let i =1; i< arr.length; ++i){ //정렬되지 않은 배열. 첫번째원소는 정렬되었다고 가정
let insertingData = arr[i];
for(let j =i-1; j>=0;--j){ //정렬된 배열
if(arr[j] > insertingData ){
arr[j+1] =arr[j];
}else{
break;// for문탈출
}
}
arr[j+1] = insertingData;
}
}
오늘의 질문
메모리 관리자는 어디에 위치해있나? cpu안? 혹은 메모리마다 가지고 있나?
cpu 와 메모리 관리자는 따로 존재한다.
CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품 이라고 한다.
테이블은 메모리에 할당되어있다고 하지만 그럼 STBR이랑 PTBR은 메모리 관리자 안에 있는데 어캐그럼? 험~
댓글을 작성해보세요.