운영체제

가상 메모리

xodnek 2021. 8. 14. 01:03

가상 메모리에 대해 설명해주세요.

프로그램의 크기가 물리 메모리보다 큰 경우에 사용합니다. 전체 중에서 사용할 부분만 적재하는 방식입니다.

프로그램이 필요한 전체 메모리를 가상메모리로 바라보고, 이 중에서 현재 실행에 필요한 부분만 물리적 메모리에 올리게 됩니다.

 

가상 메모리의 장점을 무엇이라고 생각하시나요??

메모리를 프로그램의 관점(논리적 관점)과 물리적 관점으로 분리할 수 있습니다.

메인메모리보다 큰 프로그램 실행이 가능합니다.

절대 실행되지 않는 코드는 적재되지 않습니다.

각 프로세스에 필요한 데이터만 적재하므로, 메모리 용량 절약이 가능합니다.

더욱 많은 프로세스를 적재할 수 있으므로 다중 프로그래밍 정도, CPU 사용률, 처리량도 높아집니다.

프로세스의 용량이 가벼워지므로 swapping과 fork()성능이 올라갑니다.

 

요구 페이징이 무엇인지 아시나요??

필요한 데이터만 적재하게 되는 경우 프로세스가 적재되지 않은 페이지를 요구할 수도 있습니다.

이것이 페이지 부재(fault)라고 합니다. 해당 페이지를 적재시키도록 운영체제에게 요구하는 것이 요구페이징입니다.

 

요구 페이징이 발생하면 디스크 작업으로 인해 프로세스가 잠시 정지됩니다. 하지만 프로세스의 지역 참조성 때문에 요구 페이징은 자주 발생하지 않습니다.

하지만, 요구 페이징은 매우 비싼 작업입니다.

동작과정으로 보게 되면,

1. 요구한 페이지의 유효비트를 검사합니다.
2. 무효의 이유가 페이지 부재라면 페이지 부재 트랩을 발생 시킵니다.
3. 디스크에서 해당 페이지를 찾습니다.
   디스크 I/O는 CPU를 사용하지 않는 작업이므로 CPU를 양보하기 위해 프로세스를 waiting상태로 변합니다.
4. 빈 프레임을 찾고 페이지를 할당합니다.

5. 페이지 테이블의 무효비트를 유효비트로 바꿔주며 로딩 완료 인터럽트를 보냅니다.

6. 로딩 완료 인터럽트를 수신하게되면 프로세스가 CPU 기회를 얻을 수 있도록 ready상태로 바꿉니다.

   스케줄러에 의해 CPU가 할당되었다면 멈춰진 인스트럭션부터 재개됩니다.

 

요구 페이징 종류는 무엇이 있나요??

일반 요구 페이징과 순수 요구 페이징이 있습니다.

일반 요구 페이징은 필요해질 것 같은 페이지도 미리 예측하여 적재하는 것입니다.

순수 요구 페이징은 지금 필요한 것만 적재하는 것입니다.

 

페이지가 부족한 경우 어떻게 하실 건가요??

새로운 페이지를 적재하기 위한 free frame이 부족한 경우, 빈 프레임을 확보해야 합니다.

그렇게 하기 위해서

다른 프로세스를 종료 시키거나,

다른 프로세스를 일시정지하고 swap out하거나

해당 프로세스가 사용하고 있던 페이지를 교체합니다.

 

다른 프로세스를 종료하면 그 프로세스를 그냥 버리실건가요??

프로세스가 희생되는 것이니 실질적으로 사용하지 않는다고 생각합니다. 시스템의 시간당 처리량이 낮아지기 때문에 시스템 성능을 효율적으로 이끌어 낼수 없기 때문입니다.

 

다른 프로세스를 일시정지하고 swap out은 언제 쓰면 좋다고 생가하시나요??

다중 프로그래밍 정도(동시에 적재할 수 있는 프로세스의 수)가 매우 높을 떄 좋다고 생각합니다.

프레임의 개수는 한정되어 있는데, 너무 많은 프로세스들이 적재되어 있다면, 어느 프로세스도 프레임이 부족합니다.

과할당이라고 부르게 되는데 이 경우에 일부 프로세스를 스왑 아웃했다가 여유가 생겼을 떄 스왑인하는 것이 최적이라고 생각합니다.

 

해당 프로세스가 사용하고 있던 페이지를 교체하는 것은 어떻게 생각하시나요??

해당 프로세스가 사용하고 있던 페이지라는 것은 자주 사용하지 않는 페이지를 해체하여 빈 프레임을 확보하는 방법입니다.

지역성의 원리를 생각해보면 가장 보편적이라 생각합니다.

 

가장 보편적이라면, 문제점은 없다는 것인가요??

과할당이 발생한다면 프로세스당 프레임 수가 매우 적을 것 같습니다.

자주 사용하는 페이지의 개수가, 프레임의 수보다 많아질 수도 있습니다.

새 페이지를 얻어야 할 때, 자주 사용되는 페이지가 희생될 수도 있습니다.

희생된 자주 사용는 페이지를 적재하기 위해, 요구 페이징이 다시 발생할 것이며 비싼 비용이 발생합니다.

 

페이지 교체 과정에 대해 설명해주실 수 있나요??

1. 희생된 프레임의 변경점을 저장하기 위해 디스크에 씁니다.

2. 페이지 테이블에서 엔트리를 무효로 변경합니다.

3. 디스크에서 새 페이지를 읽어 희생된 프레임에 적습니다.

4. 페이지를 불러오면 엔트리를 유효로 변경해줍니다.

 

설명해주신 페이지 교체 과정은 디스크 연산이 2번 일어나는데 좋은 방법이 있을까요??

디스크가 발생 할 때마다, 프로세스가 waiting 상태로 변화하기 때문에 2번 접근하게 됩니다.

1. 디스크에 희생된 프레임의 변경점을 적기 위해 한 번

2. 디스크에 새로운 페이지를 읽기 위해 한번

 

새로운 페이지를 읽는 것은 어쩔 수 없지만, 희생된 프레임의 변경점을 적기 위한 로직은 개선 가능합니다.

변경된 적이 없는 프레임은 굳이 디스크에 적지 않아도 되기 때문입니다.

 

그래서 페이지 테이블에 변경비트를 추가하여, 읽기 전용 페이지거나 변경 비트가 설정되어 있지 않은 페이지라면 디스크 연산을 1번 줄일 수 있을 거라고 생각합니다.

'운영체제' 카테고리의 다른 글

메모리 할당(3)  (0) 2021.08.14
메모리 할당(2)  (0) 2021.08.13
메모리 할당(1)  (0) 2021.08.13
주메모리의 관리  (0) 2021.08.13
데드락  (0) 2021.08.11