인프런 워밍업 클럽2 cs <day11>

인프런 워밍업 클럽2 cs <day11>

운영체제

가상메모리 | 세그먼트, 페이징

RAM | 가변분할, 고정분할

(세그먼트,페이징이랑 가변분할이랑 고정분할이랑 갑자기 뭔차이지? 라는 생각이 들어서 이전 수업 듣고 까먹지 않게 적어놨다)

(가상메모리 ram 차이가아니고 그냥 가변분할은 어떤 종류다~ 말하는거같기도하고)

가상메모리 개요

  • 컴퓨터마다 메모리의 크기가 달라, 작업할 프로세스크기 > 메모리 일 경우 -> 실행불가

    • 문제 해결 방법 : 가상메모리를 사용.
      메모리 관리자가 프로세스크기와 할당할 번지를 신경쓰지 않도록 0x0 번지부터 할당한다고
      여기게 한다.

    • 메모리 관리자 덕분에 프로세스와 메모리는 직접적으로 부딪힐 일이 없다.
      ? 가상메모리 안에 메모리 관리자가 들어있나여? 사진이 안에 들어가있네 가상메모리 관리자라고 해야되나

    • 가상메모리 크기는 이론적으로는 무한, cpu 비트 수 + 메모리 크기에 정해진다.

  • 프로세스 처리 양 > 메모리 크기 일때

    • 처리하지 못한 프로세스를 하드디스크에 있는 스왕엽역으로 이동

    • 처리가 필요할 때 물리 메모리로 가져와서 실행 시킨다.
      - 32bit = 4GB => 메모리 크기도 4GB
      - 메모리 크기가 4GB 일 때, 프로세스 4GB *5 개 작업해야한다. => 디스크의 스왑영역으로 이동

    • 동적 주소변환 (DAT) : 메모리 관리자는 물리메모리와 스왑여역까지 합쳐 프로세스가
      사용하는 가상주소를 물리주소로 변환

  • 실제 0x0 번지 물리주소에는 운영체제 영역 -> 프로세스들은 사용 x

    • 가상메모리 시스템에서는 나머지영역을 가변분할 방식, 고정분할 방식으로 나뉜다.
      -가변분할 (세그먼테이션) / 고정분할방식 (페이징) / 페이지드 세그먼트 (혼용)

  • 메모리 관리자는 가상주소 - 물리주소 => 1대1 매핑 테이블로 관리

image

세그멘테이션 (배치 정책)

  • 세그멘테이션 -> 프로세스를 함수, 모듈 등으로 세그먼트를 구성한다.

    • 사용자 입장 : 세그먼트들(함수 + 모듈 ..)은 서로 인접하지 않는다.
      프로세스 입장 : 영역들이 서로 인접해 있다.

image

  • 논리주소

    • 논리주소는 사용자, 프로세스 CPU 사용
      논리주소 -> 물리주소 변환은 메모리관리자가 담당

  • 메모리 관리자는 세그멘테이션 테이블을 가지고 물리 메모리 주소를 계산한다.

    • 논리주소 -> 물리주소 변환 과정
      cpu에서 논리주소 전달 -> 메모리 관리자가 몇번 세그먼트인지 알아낸다
      -> 메모리 관리자 내에 있는 Segment Table Base Register 를 이용해서 물리 메모리 내에 있는 세그멘테이션을 찾는다.
      (여기서 STBR 와 세그멘테이션 테이블은 다르다. STBR에서 세그멘테이션을 찾고 찾은 걸로 세그먼트번호 참조)
      -> 세그먼트 번호를 인덱스로 Base Address, BoundAddress를 찾는다.
      (운영체제는 컨텍스트 스위칭이 일어날 때마다 STBR의 내용을 해당 프로세스의 값으로 바꿔줘야한다.)
      -> Bound Address는 메모리의 크기를 나타낸다.
      메모리 관리자는 cpu에서 받은 논리주소와 Bound Address의 크기를 비교한다.
      -> 논리주소 < Bound Address 일 경우, 논리주소 + Base Address = 물리주소 구하기.
      논리주소 > Bound Address 일 경우, 메모리를 침범했다고 생각하고 에러를 내보낸다.

    image

  • 세그먼트 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은 운영체제가 컨텍스트 스위칭할 때 마다 해당 프로세스의 것으로 업데이트해준다)

image

  • 세그멘테이션 vs 페이징

    • 세그멘테이션 : 프소세스마다 크기가 달라서 bound Address가 필요하다.

    • 페이징 : 모든 페이지가 크기가 동일해서 Bound Address가 필요하지 않다.

  • 페이징의 내부단편화

    • 세그멘테이션 : 논리적인 영역별로 세그먼트를 나눈다.
      페이징 : 논리적인 영역별로 나누기보다 정해진 크기로 나눈다.
      특정 영역만 공유하거나 권한 부여가 어렵다.

    • 페이지 테이블의 크기를 얼만큼씩 나눌지가 제일 중요하다,

    • 프로세스 많아질수록, 페이지테이블 늘어난다. => 프로세스가 실제로 사용할 수있는 메모리영역🔽

    • 페이지 테이블도 물리 메모리의 운영체제 영역에 저장되어 있다.
      -> 페이지 테이블이 크면 사용자 영역이 부족해진다

    • STBR로 세그멘테이션을 찾는다고 했는데 그럼 세그멘테이션이 겁나 많아서 세그멘티에션 테이블도 많다는 건가? 위와 같은 맥락인 것 같다.

페이지드 세그멘테이션(배치정책)

  • 세그멘테이션 + 페이징 장점 취합

    • 세그먼트로 나눠 관리해서 다른 프로세스와 공유, 권한 부여가 쉽다.

    • 오버헤드가 적고 페이지 크기를 정해 나눠서 할당 시킨다.

  • 메모리 접근 권한 : 메모리 특정번지에 부여된 권한

    • 읽기(READ), 쓰기(Write), 실행(EXECUTE)

  • 프로세스는 영역마다 접근권한이 있다.

    • CODE영역 : 프로그램 그자체. 수정되면 안됨. 읽기 실행권한

    • DATA 영역 : 일반변수, 전역변수, 상수로 선언한 변수가 저장. 읽기권한 쓰기권한은 없거나 있다.

    • HEAP,STACK영역 : 읽기 쓰기 권한

  • 메모리 접근 권한 검사 : 논리주소에서 물리주소로 변환할 때마다 실시된다.
    권한비트를 추가해서 검사를 한다.
    권한이 없는 메모리가 접근 시 에러를 발생시킨다.

  • 페이지드 세그멘테이션 : 세그멘테이션 테이블 + 페이지 테이블 사용

    • 권한비트 , Bass Addres(페이지넘버), Bound Address(페이지개수) 로 변환 시킨다.

    image

  • 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은 메모리 관리자 안에 있는데 어캐그럼? 험~

 

image

댓글을 작성해보세요.

채널톡 아이콘