CS/OS

제한적 직접 실행이란?

2zreal 2025. 1. 9. 00:06

프로그램을 CPU에서 직접 실행시키면 성능은 빨라진다. 하지만 여러 가지 문제가 발생할 수 있다.

예를 들어 CPU에서 직접 실행시키는 프로그램이 무한루프에 빠지게 된다면?? 권한 없이 하드웨어나 시스템 파일에 접근한다면??

 

프로세스가 디스크에 I/O요구, 메모리 추가 할당 요구를 직접 수행하면 문제가 발생할 수 있다.

 

User mode

-사용자가 접근 가능한 제한된 기능만 수행 가능(파일 읽기, 쓰기)

 

Kernel Mod

-운영체제가 CPU 제어권을 가지는 특권모드

-모든 동작을 할 수 있다.

 

기본적으로 CPU는 User Program을 실행한다. 이때 CPU는 User Mode에서 동작한다.

User Mode에서 System Call(open(), read())을 하게 되면 CPU의 제어권이 운영체제로 넘어간다.

 

이외에 제어권이 넘어가는 상황: 인터럽트(키보드 입력, 네트워크 패킷 수신), Trap, 프로세스 종료

 

운영체제는 이처럼 필요할 때만 CPU의 제어권을 가져오고(Kernel Mode) 그 외에는 사용자 프로그램을 실행한다(User Mode).

 

Trap은 예외나 System Call으로 발생한다.(Interrupt는 키보드, 네트워크, 타이머 등으로 발생함)

Trap이 발생하면 User Mode에서 Kernel Mode로 전환된다.

운영체제가 Trap을 처리한 후 다시 User Mode로 전환된다.

 

정리: 사용자 프로그램이 직접 디스크, 네트워크 등 하드웨어 장치에 접근하는 것은 금지됨. System Call(read, write)을 사용해야 함.(CPU는 User Mode와 Kernel Mode로 나뉘어있음.)

 

모드 전환 과정

1. 사용자 레지스터 정보를 커널 Stack에 저장

2. User Mode->kernel Mode

3. Kernel 코드를 실행

4. 커널 Stack에 저장했던 레지스터 정보 복원

5. Kernel Mode->User Mode

6. 사용자 프로세스 실행

 

 

Trap 발생 후 CPU는 Trap table을 참조하여 Sytsem Call Handler로 이동함.

read를 호출하면 CPU는 read에 해당하는 System Call Handler로 제어권을 넘김.

 

 프로세스의 영역은 User Space와 Kernel Space로 나뉜다.(CPU는 User Mode와 Kernel Mode로 나뉨.)

User Space는 사용자 애플리케이션 코드가 실행되는 공간이고

Kernel Space은 운영체제가 사용하는 공간이다.

 

User Mode->kernel Mode로 바뀌면서 프로세스는 Kerenl Space를 사용하게 되고

kernel Mode->User Mode로 바뀌면서 프로세스는 User Space를 사용하게 된다.

 

CPU의 User Mode는 손님 모드 Kernel Mode는 관리자 모드

프로세스의 User Space는 손님 공간 Kernel Space는 관리자 공간이라고 생각하면 이해하기 편하다.

 

프로세스가 다시 제어권을 획득하는 방식으로는 협조 방식과 비협조 방식이 있다.

협조 방식은 프로세스가 System Call을 호출하거나 Trap이 발생하면 OS한테 제어권이 넘어가는 방식이고

비협조 방식은 Timer Interrupt를 사용해 주기적으로 OS한테 제어권이 넘어가는 방식이다.

협조 방식은 프로세스가 무한 루프에 빠지거나 제어권을 넘기지 않으면 OS는 제어권을 얻지 못한다.

비협조 방식은 주기적으로 타이머를 이용해 Interrupt를 발생시켜 OS가 제어권을 얻을 수 있다.

요즘 사용하는 대부분은 OS는 비협조 방식을 사용한다고한다.

 

Timer interrupt가 발생하면 스케줄러를 호출해서 다음에 실행할 프로세스를 결정한다.

 

Context Switch

다음에 실행할 프로세스가 결정되면 중단된 프로세스의 상태를 PCB에 저장한 후 새 프로세스의 Context를 복원하여 실행한다.

PC:현재 실행 중인 명령어의 위치

범용 레지스터 :프로세스의 연산에 필요한 데이터

커널 스택 포인터: 커널 모드에서 프로세스가 사용하는 스택의 위치(커널 스택에 유저 스택 포인터가 저장된다.)

유저 스택 포인터는 항상 메모리 공간에 그대로 유지되기 때문에 저장할 필요가 없다.

 

 

인터럽트나 트랩 처리 중 다른 인터럽트가 발생문제 해결방법

1.인터럽트 금지

-인터럽트 중에 다른 인터럽트를 금지하고 일이 끝나면 밀린 일을 처리한다.

 

2.Lock

-공유 데이터 접근을 막기위해 Lock을 사용

 

'CS > OS' 카테고리의 다른 글

Multi-Level Feedback Queue란?  (0) 2025.01.10
Scheduling이란?  (0) 2025.01.09
Process API란?  (0) 2025.01.08
프로세스란?  (1) 2025.01.07
운영체제란?  (0) 2025.01.07