대부분의 처리기는 최소한 두 가지 수행 모드를 지원한다. 권한에 따라 특정 명얼러의 수행이나 다른 제어 등이 제한된다.
권한을 덜 가진 모드를 보통 사용자 모드(user mode), 더 높은 권한을 가진 모드는 시스템 모드(system mode), 제어 모드(control mode), 커널 모드(kernel mode) 등으로 불린다.
커널(kernel)은 중요한 시스템 기능들을 포함하는 운영체제의 일부로 다음과 같은 요소들을 가진다.
- 프로세스 관리
- 프로세스 생성과 종료
- 프로세스 스케줄링과 디스패칭
- 프로세스 교환
- 프로세스 동기화와 프로세스 간 통신 지원
- 프로세스 제어블록 관리- 메모리 관리
- 프로세스에 주소공간 할당
- 스와핑(swapping)
- 페이지와 세그먼트 관리- 입출력 관리
- 버퍼 관리
- 프로세스에 입출력 채널과 장치 할당- 지원 기능
- 인터럽트 핸들링
- 어카운팅
- 모니터링
두 가지 모드를 사용하는 이유는 사용자 프로그램의 간섭으로부터 운영체제 및 프로세스 제어블록과 같은 주요 운영체제 테이블을 보호할 필요가 있기 때문이다. 사용자 프로그램의 경우 그리 높은 수준의 제어 수준이 필요하지 않고, 안전을 위해서도 이러한 권한 자체를 제한해 놓는 것이 바람직하다.
프로그램 모드를 변경하려면 프로그램 상태 워드(PSW)의 한 비트를 사용하여 수행 모드를 나타낼 수 있다. 해당 비트는 특정 사건에 따라서 변하는데, 사용자가 운영체제 서비스를 호출하거나 인터럽트가 운영체제의 한 경로의 수행을 촉발시킬(trigger) 때 모드는 커널 모드로 설정된다.
대표적인 예로 인텔 ITanium 처리기의 경우 4레벨 모드로 나뉘어 2비트의 cpl(current privilege level)필드를 포함하는 처리기 상태 레지스터(psr, processor status register)를 가진다. 0(최상위)~3(최하위)까지의 레벨이 있다.
인터럽트가 발생하면 처리기는 cpl 필드 포함 psr에 있는 비트 대부분을 리셋하여 cpl을 레벨0으로 설정한다. 인터럽트 핸들링 마지막 명령어는 irt(interrupt return)인데, 처리기를 인터럽트된 프로그램의 psr로 복구시켜 프로그램의 권한 레벨이 복원되는 방식이다.
응용이 미리 정의된 영역에 시스템 호출 식별자와 시스템 호출 인자들을 위치시키고, 다음으로 사용자 레벨의 수행을 인터럽트하여 커널로 제어를 넘겨주는 특별한 명령를 수행함으로써 시스템 호출을 수행한다.
실제로 프로세스를 생성하는데 필요한 단계들은 아래와 같다.
프로세스 교환의 경우 수행 중인 프로세스가 어느 시점에 인터럽트되면, 운영체제는 다른 프로세스를 수행 상태로 바꾸고 그 프로세스에게 제어를 넘긴다. 여기서 설계 시 고려해야 할 점은
운영체제가 현재 수행 중인 프로세스로부터 제어를 넘겨받을 때마다 프로세스 교환이 발생한다. 이러한 사건들은 아래 표와 같다.
기법 | 원인 | 사용 |
---|---|---|
인터럽트 | 현재 명령어 수행의 외부 | 비동기적인 외부 사건에 반응 |
트랩 | 현재 명령어 수행과 관련 | 오류나 예외 상황 처리 |
수퍼바이저 호출 | 명시적 요청 | 운영체제 기능에 대한 호출 |
트랩이 발생하면 관련 오류 또는 예외 조건이 치명적인지 아닌지에 따라서 처리 여부가 나뉘어진다.
운영체제 코드에 속한 어떤 루틴으로 제어를 넘기게 되며, 이 시스템 호출로 인해 해당 사용자 프로세스는 블록 상태로 전이
인터럽트 단계에서 처리기는 인터럽트 시그널 존재여부를 가지고 인터럽트가 발생되었는지 검사한다.
대기하고 있는 인터럽트가 없다면 처리기는 반입 단계를 계속 수행하여 해당 프로그램의 다음 명령어를 가져온다. 대기하고 있는 인터럽트가 있는 경우 처리기는
이 과정에서 인터럽트된 프로세스 문맥은 인터럽트된 프로그램의 프로세스 제어 블록에 저장된다. 처리기 상태 정보, 프로그램 차운터와 처리기의 다른 레지스터들의 내용, 스택 정보 등이 저장된다.
이렇게 계속 반입 단계를 계속 수행하여 인터럽트를 처리하는 인터럽트 핸들러 프로그램은 인터럽트가 존재하는지를 나타내는 플래그나 지시자(indicator)를 초기화시킨다.
이후 인터럽트 핸들러가 오류 조건을 검사하고 오류가 발생되었다면 입출력 동작을 요구한 프로세스에게 시그널을 보내거나, 클럭 인터럽트의 경우는 제어를 스케줄러에 넘겨주게 된다.
그렇다고 인터럽트 발생이 항상 프로세스 교환이 필요한 것은 아니다. 인터럽트 핸들러가 수행된 후 현재 수행중인 프로세스의 처리기 상태 정보를 저장한 후 인터럽트 되었던 프로그램으로 제어가 다시 넘어왔을 때 현재 수행 중인 프로세스의 정보를 복구하여 재개될 가능성도 있다. 주로 이러한 저장과 복구 기능은 하드웨어적으로 이루어진다.
모드 전환은 현재 수행 상태에 있는 프로세스의 상태를 바꾸지 않고 수행될 수 있다는 점에서 프로세스 교환과는 다른 개념이다.
모드 전환 과정에서 문맥을 저장하거나 나중에 복구할 때 생기는 오버헤드는 거의 없지만 현재 수행상태인 프로세스가 다른 상태(준비 상태 or 블록 상태 등)로 전이되면, 운영체제의 환경은 크게 변경된다.
완전한 프로세스의 교환 순서는 아래와 같다.
이러한 프로세스의 상태 전이를 거치므로 프로세스 교환은 모드 전환에 비해 상당히 많은 작업을 요구한다.