2011년 2월 23일 수요일

유저모드와 커널모드

■ 유저모드와 커널모드
 
Windows OS를 기준으로 설명드리자면, 프로세스(프로그램)를 실행하게 되면 유저모드와 커널모드를 오가면서 실행될 수 있습니다.
 
유저모드유저가 접근할 수 있는 OS영역내에서 동작되는 실행모드입니다.
커널모드 유저모드로는 접근 할 수 없도록 되어있는 시스템영역(커널)에 접근하기 위해 동작되는 실행모드입니다.
 
이렇게 모드가 나뉜 이유는 보안성과 안전성의 확보 때문입니다. 만약에 유저(프로그래머)가 수시로 시스템영역을 맘대로 휘젓고 다닐 수있다면 가령, 메모리 할당하다가 운영체제가 사용하는 영역을 침범하는 등의 일이 가능하다면 곤란하겠죠.
 
그래서 민감한 영역내에 접근할 때를 제외하고 유저들이 마음대로 접근해도 되는 영역에 대해서 유저모드로 접근이 되도록 하고 커널에 요청해서 처리할 문제가 있을때만 일시적으로 커널모드로 전환해서 커널내의 처리요청을 처리하고 일을 마치면 다시 유저모드로 전환되서 실행이 되도록 하는 겁니다.
 
예를들어 쓰레드, 파일, 세마포어, 같은 커널오브젝트를 다룰때 CreateXXX()계열 함수를 호출하면 이 호출되는 시점은 유저모드에서 실행되지만 이 함수가 실행되면 커널모드로 전환되서 커널에게 오브젝트 생성을 요청을 하는겁니다.
( 함수이름으로 봐선 유저가 직접 만드는 듯한 착각을 일으켜줍니다만 아니더군요ㅎㅎ )
그리고 커널에서 만들어지든 실패하든 결과가 나와서 함수가 리턴되면 바로 자동으로 유저모드로 돌아오게 됩니다. 
 
※ 유저모드와 커널모드의 전환은 속도면에서 상당한 시간을 처리합니다.
 
 
■ CPU 싸이클
 
CPU 싸이클은...Cycle은 CPU가 한번 연산하는데 걸리는 연산단위입니다
여기서는 "싸이클 = 연산" 정도로 보시면 될것같네요. 즉, 유저모드에서 커널모드로 전환하는데 CPU연산이 들어간다 라는 의미로 보시면 되고요. 상당히??? 인지는 잘 모르겠지만 CPU소모가 일어나는 건 맞습니다.
 
예를들어 동기화 객체를 쓸때 4가지 크리티컬섹션, 세마포어, 뮤텍스, 이벤트 를 쓰는데 크리티컬 섹션이 유저모드 동기화고, 나머지 3가지가 커널모드 동기화를 합니다. 즉 크리티컬 섹션으로 동기화 할 때의 장점이 유저모드로만 동작되기 때문에 유저모드->커널모드->유저모드로의 전환으로 소모되는 CPU싸이클이 다른 3가지 동기화모드와 달리 없어 가볍고 빠르게 사용할 수 있다는 것입니다

댓글 없음:

댓글 쓰기