[Preemption(선점) 이란?]
윈도우3.1같은 운영체제는 멀티태스킹환경 이라고는 하지만 사실
그렇지 않죠 한프로그램(한프로세스)이 에러가 날 경우에 보면 시스템
전체가 죽어버리는 일이 허다한 경우가 많습니다. 이는 완벽한 멀티
태스킹환경을 구현하지 않아서 그런거죠.
좀 발전된 윈95는 어떻습니다. 한프로그램이 에러가 나서 죽어도 다른
프로그램들에는 지장없이 그프로그램만 없애버릴수 있어서 좋죠..
그러나 어떨때는 다같이 죽어버리는 일도 있기는 하지만 좀 나아지기는
나아졌죠.
유닉스는 어떻습니까, 이에 관해선 아주 완벽하다고 볼수있죠..
아마 거의 프로세스 하나 때매 시스템이 죽는 상황은 없습니다.
그만큼 잘구현되어 있어서 그런것입니다..
이렇게 프로세스를 수행도중에 중간에서 그수행을 막아버리는 것을
선점(preemption)시킨다고 합니다. cpu는 하나이고 수행시킬 프로세스
는 여러개가 있다면 프로세스마다 번갈아 가며 cpu를 할당 받아 수행
시키면 되겠죠(이일은 커널의 cpu스케쥴링모듈에서 담당).
이를 위해 당연히 프로세스의 수행을 중간에서 짤라버릴수 있어야 할
것입니다. 이를 바로 선점 시킨다고 하는겁니다.
[유저모드와 커널모드]
지금 커널의 어떤모듈이 수행되고 있다면 현재 커널모드하에 있다고
말하고 사용자의 프로그램이 수행되고 있는 상황이라면 유저모드에
있다고 합니다. 이는 개념적인 차원이 아니라 하드웨어적으로 완전히
구분되어 동작이 되는 상황입니다.
그럼 왜 이렇게 나눠놨을까요..? 커널이 만약 사용자 프로그램에 의해
엑세스 될수 있다면 어떨까요. 어떤 사람이 메모리에 있는 커널코드에
엑세스하여 이를 바꿔버리는 프로그램을 짜서 돌린다면 시스템은 완전히
박살나는거죠.. 그럼 당연히 외부에서 이 커널부분에는 엑세스 못하도록
하는 조치가 있어야 할것은 명백합니다.
이를 위해 어떤방법을 쓰냐 하면 우선 cpu에 보면 하드웨어적으로 이를
위한 특별한 플래그를 두고 있게됩니다.
이 플래그를 이용해서 이전에는 수행 시킬수 없었던 명령코드를
수행시킬수 있게하고 운영체제와 연계하여 특정메모리 부분을 엑세스
하지 못하도록 하는 등의 일을 할수있는거죠
이런 방법으로 커널의 코드를 수행시킬때는 이 플래그를 세트시켜
메모리의 어떤부분도 엑세스할수있는 상태로 만들며 이를 커널모드
또는 슈퍼바이져 모드라고도 합니다.
플래그가 세트되지 않은 유저모드에선 커널의 영역에는 함부로 침범
못하는거죠.
이렇게 해서 커널의 프로세스와 사용자의 프로세스가 그 동작모드에
있어서 구분되어지며 커널만이 각종장치(메모리나 모든하드웨어 장치)
를 엑세스 할수있게 하여 이들을 보호할수 있게되는겁니다.
[시스템 콜]
위에서 보면 유저모드의 프로세스는 하드웨어 장치를 엑세스 할수
없으므로 커널이 이를 대신해줄것을 요청하게 되는데 이를 위해
커널에는 시스템 콜이라는 서비스를 해주게 됩니다.
유저모드에 있는 프로세스는 커널코드를 수행하기 위한 어떤 함수
코드를 호출하게 되고 이에 의해 모드가 커널모드로 바뀌고
커널의 해당부분에 접근하여 커널코드를 수행하는 것입니다.
이를 시스템 콜 호출이라고 하기도 하고 전문용어로는 Trap(트랩)
이라고 합니다. 이렇게 해서 원하던 동작의 커널코드를 수행하고서는
다시 유저모드로 복귀하여 이 시스템콜을 불렀던 프로세스가 계속
수행을 하게 되죠.
[페이징(Paging) system]
메모리는 바이트의 연속적인 공간입니다, 바이트마다 주소를 할당
하여 엑세스하게 되는데 단순히 이런방식 으로만 메모리 접근을
행할 경우에 다음과 같이..
* 프로세스를 메모리에서 재배치
* 가상기억장치 의 활용
* 공유메모리 기법의 사용
* 가상주소의 사용
위 외에도 여러가지의 이유가 있지만 하여튼 이러한 능력을
커널에 부여 시킬수 없게 됩니다...
그래서 생각해낸것이 메모리를 일정한 크기(1Kbyte또는4Kbyte)
로 짤라서 보게하고 각각을 페이지라는 의미로 구분하여
순서 번호를 부여하게 하는겁니다.
페이지 크기는 주로 화일시스템의 블럭크기와 같게 해줍니다.
이렇게해서 무슨 페이지의 몇번째 위치라는 방식으로 메모리를
가리키게 되는거죠.
--- PFDT(페이지 프레임 데이타 테이블)
이를위해 메모리를 페이지로 나누어 페이지번호를 부여하고
해당 페이지의 실제주소가 어딘지의 정보를 가지는 PFDT를
커널이 마련하게 됩니다
이를 바탕으로 커널은 페이징방식의 주소를 CPU와 협력하여
실제주소를 계산하게 됩니다.
각 프로세스들은 메모리의 주소공간을 차지하고 있게되는데
커널은 페이징방식에 의해 프로세스들의 주소공간을 접근하며
이를 위해 각 프로세스의 메모리 위치정보를 [페이지 테이블]
이라는 항목으로 마련하여 엑세스하고 관리하게 됩니다.
[스왑핑(SWAPPING) SYSTEM]
우리가 처음 유닉스 계통의 시스템을 깔때보면 하드디스크에
스왑(swap)파티션을 잡아주게 됩니다.
흔히들 알고 있기로 요것은 실제메모리의 크기 한계를
극복하기 위해 가상메모리를 마련하는거다 라고 알고들 있습
니다..
이는 아주 큰 오해를 불러 일으키기에 충분한 잘못된 설명
입니다.
그럼 이게 원래 뭐하는데 쓰이는 물건인고 정확하게 정의하면
"메모리에서 수행될수있는 프로세스 갯수의 한계를 극복하기
위한 가상메모리이다"
라고 표현해야 정확한 표현입니다. 의미가 완전히 달르죠.
앞서 표현한 실제메모리 크기 한계를 극복한다는 것으로 해
버리면 실제 메모리보다 큰 프로세스도 수행 시킬수 있다는
말이 되는데 이를 위해 스왑영역이 있는게 아닙니다.
스왑영역은 현재 수행되고 있는 프로세스들이 메모리에
꽉차서 새로운 프로세스를 생성시키기에 충분한 메모리가
확보되질 못할때 (즉, 남아있는 메모리양이 새로 생성될
프로세스의 크기보다 적을때)
새로운 프로세스를 생성시키기에 충분한 메모리가 확보될때
까지 실행중에 있지 아니한 프로세스를 일단 스왑영역으로
대피시키기 위한 장소입니다.
원래 이를 위해 스왑영역을 쓰게 되고 나중에
Demand Paging(요구 페이징) 시스템이 커널에 포팅됨에
따라 화일 시스템이나 스왑영역을 위에서 논의된바있는
페이지로 볼수있게 하여 흔히들 알고 있는 가상 메모리가
구현이 되는 것이니 정확히 이해 하시길 바랍니다..
즉, 흔히들 생각하는 메모리 크기보다 큰 프로세스를 실행
시킬수 있기 위해선 ^^ ....