본문 바로가기

운영체제

[운영체제] Direct Execution과 Limited Direct Execution

728x90
반응형

본 글의 일부분은 서적 'Operating Systems: Three Easy Pieces by Remzi H.Arpaci-Dusseau, Andrea C.Arpaci-Dusseau' 내의 이미지와 내용을 포함하고 있습니다 :)

 

 

이번 시간에는 Direct Execution과, Limited Direct Exeucution에 대해서 배워보고자 합니다!

 

 

Direct Execution

 

Direct Execution이란, Program에서 어떤 코드를 돌리던지 OS는 간섭하지 않는 것입니다!

즉, OS가 PCB를 생성하고 인자를 stack에 할당 해주는 등 초기 작업을 다 마친 후에

프로그램의 main()을 호출해서 실행함으로써 OS에서 프로그램으로 영역이 넘어간 다음에는

프로그램이 메모리를 할당하던, 새로운 프로세스를 생성하던 간섭하지 않는 것이죠!

 

이렇게 CPU 위에서 프로그램이 직접 돌아가는 것이 바로 Direct Execution입니다.

OS가 단순한 라이브러리 수준의 역할을 한다고 볼 수 있겠죠.

 

하지만 이런 방식을 사용했을 때 생기는 문제가 있습니다.

 

문제. 만약 프로세스가 잦은 입출력 요청을 하거나, 자원을 너무 많이 쓴다면?

 

프로세스가 Operation에 의해서 CPU나 메모리로부터 자원을 너무 많이 얻고자 한다면 자원 관리가 제대로 이루어지지 않겠죠.

뿐만 아니라 disk에 입출력을 너무 잦게 요청한다면 프로세스 상태가 바뀌면서 context switching이 빈번하게 일어나는 등의 비효율이 발생할 수 있습니다!

 

 

따라서, 우리는 이를 해결하기 위해서 User mode와 Kernel mode로 컨트롤 영역을 나누기 시작합니다.

즉, User mode일 때에는 입출력이나 공간 할당과 같은 코드의 접근을 막고,

Kernel mode로 진입하면 자원을 요구하거나 프로세스를 생성하는 등의 수행을 해도 막지 않는 것이죠.

이 때, User mode에서의 코드를 응용프로그램 코드, Kernel mode에서의 코드를 커널 코드라고 합니다.

 

그렇다면 우리가 응용프로그램의 코드가 있는 User mode에서, 필요할 때면 Kernel mode로 진입할 방법이 있어야겠죠?

예를 들어서, fork와 같이 프로세스를 생성하는 operation을 수행하고자 하면

우리가 있는 User mode에서 Kernel mode에게 프로세스를 생성해달라고 부탁할 방법이 있어야 하는 것입니다.

 

그걸 위해 존재하는 것이 바로 System Call 입니다!

응용 프로그램은 system call을 이용하여 파일 시스템 접근, 프로세스간의 통신과 생성 및 소멸, 메모리 할당과 같은 일을 수행할 때에 커널에게 부탁하게 됩니다.

그러면 커널은 주어진 일을 다 한 다음에 user mode로 다시 돌아오게 되는 것이죠.

이러한 방식을 Limited Direct Execution이라고 합니다.

 

 

아래는 Limited Direct Execution의 프로토콜을 간단하게 나타낸 것입니다!

먼저 OS가 boot될 때는 아래와 같이 어떤 event가 왔을 때 어떤 handler를 수행해야 할지 셋팅해 줍니다.

 

 

아래는 프로그램이 수행되고자 할때, kernel mode와 user mode간에 어떤 동작이 이루어지는지를 나타낸 것입니다.

 

728x90
반응형