티스토리 뷰

가상화 기법을 구현하기 위해서는 몇가지 문제를 해결해야 한다.

1.성능 저하

2.제어 문제

 

제한적 직접 실행

직접 실행이라는 아이디어는 말 그대로 CPU에서 직접 실행하는 것이다. 프로그램을 프로세서에 올리고 데이터와 변수,코드를 가져와 메모리에 저장하고 시작점으로 분기해 코드를 실행한다.

 

직접 실행 프로토콜

 

프로세스 목록의 항목을 생성

프로그램 메모리 할당

메모리에 프로그램 탑재

argc/argv를 위한 스택 셋업

레지스터 내용 삭제

call main() 실행

 

하지만 직접 실행의 문제점은 운영체제가 원하지 않는 일은 하지 않는다는 보장이 없다. 두번 째는 프로세스 실행 시, 시분할(프로세스 간 전환)을 어떻게 구현 할까 이다.

 

직접 연산을 CPU에서 직접 실행하기 때문에 빠르다는 장점이 있지만, 디스크 입출력,메모리에 대한 추가할당 등 다른 연산이 필요하다면 어떻게 해야할까? 프로세스에서 디스크에 접근해야 하는 파일 시스템에 대해 생각해보자.

모든 프로세스가 디스크에 접근하면 보안에 문제가 있으니 사용자 모드, 커널 모드가 생겼다. 사용자 모드에서 디스크에 접근 요청이 들어오면 예외를 발생시켜 해당 프로세스를 제거한다.

커널 모드에서는 디스크에 접근 요청을 허용한다. 

 

하지만 사용자 모드에서 디스크에 접근을 허용해야 하는 특권 명령어를 사용하면?

이럴 땐 시스템 콜을 사용한다. 시스템 콜을 실행하기 위해 프로그램은 trap이라는 명령어를 실행해야 한다. 이 명령어는 커널 안으로 분기하는 동시에 특권 수준을 커널 모드로 상향 시켜 프로세스가 모든 명령어를 처리할 수 있다. 완료 되면 운영체제는 return-from-trap 명령어를 호출한다.  이 명령어는 다시 사용자 모드로 되 돌려준다. 

운영체제가 return-from-trap 명령어 실행 시 사용자 프로세스로 제대로 리턴하기 위해서 호출한 프로세스의 필요한 레지스터들을 저장해야 한다.

 

trap이 운영체제 코드의 어디를 실행할지 어떻게 알까? 호출한 프로세서는 분기할 주소를 명시할 수 없다. 주소를 명시한다는 것은 커널 내부의 원하는 지점을 접근할 수 있다는 것이기 때문에 위험하다. 커널이 임의의 코드를 실행하기 위해서는 접근 권한 검사가 끝난 후에 분기해야 한다. 

커널은 부팅 시에 트랩 테이블을 만들고 이를 이용하여(?) 시스템을 통제한다. 컴퓨터가 부트될 때는 커널 모드에서 동작하기 때문에 하드웨어를 원하는대로 통제할 수 있다. 하드웨어에게 예외사건이 일어났을 때 운영체제가 어디로 분기할 지 알려준다. 이 역할을 트랩 핸들러가 한다. 하드웨어는 이 정보로 해당 위치를 기억하고 있다.

트랩 테이블,트랩 핸들러를 바탕으로 trap명령어는 운영체제 내에서 어디로 분기할 지 알 수 있다.

 

 

직접 실행의 과정을 정리해 보면 아래와 같다.

 

1.운영체제에서 트랩 테이블을 초기화 한다.

2.CPU(하드웨어)는 나중을 위해 테이블의 주소를 기억한다.

3.사용자 프로세스를 처리하기 위해 return-from-trap을 이용해

  3-1.프로세스 목록에 항목 추가

  3-2.프로그램 메모리 할당

  3-3.프로그램을 메모리에 탑재

  3-4.argv를 스택에 저장

  3-5.레지스터와 pc를 스택에 저장

위 작업을 실행한다.

4.return-from-trap에 의해 사용자 모드로 이동,main문으로 분기.

5.main 실행, 시스템 콜 호출, trap 실행

6.운영체제는 시스템 콜을 처리하고,다시 return-from-trap 명령어를 사용해 사용자 모드로 돌아간다.

7.프로세스는 리턴, exit() 시스템을 호출해 다시 trap하고 종료

 

프로세스 간 전환

 

한 프로세스가 CPU를 사용하고 있을 때 운영체제에서는 프로세스를 실행중이지 않다. 이게 무슨 의미인지 모르겠다.

하지만 프로세스가 점령중인 CPU를 다른 프로세스로 교체하기 위해서는 운영체제가 CPU에서 동작 중인 프로세스를 멈추고

다른 프로세스로 바꿔야 한다는 점을 알 수 있다.

CPU를 어떻게 다시 획득할 수 있는가? 운영체제는 어떻게 CPU를 다시 획득해 프로세스를 전환할 수 있을까?

 

시스템 콜 기다리기

협조 방식으로 알려진 방법은 과거의 몇몇 시스템에서 채택되었던 방식이다. 너무 오랫동안 CPU를 차지할 것 같은 프로세스는 운영체제가 다른 작업을 실행할 결정을 할 수 있도록 주기적으로 CPU를 포기할 것이라고 가정한다.

 

프로세스는 어떤 방식으로 CPU 소유권을 포기할까?

대부분의 프로세스는 파일 열기,읽기, 메세지 송신, 새 프로세스 생성 같은 시스템 콜을 호출하여 CPU의 제어권을 운영체제에게 넘겨준다.

이런 유형의 운영체제는 yield 시스템 콜을 제공하는데, 이 시스템 콜은 운영체제에게 제어를 넘겨 운영체제가 다른 프로세스를 실행할 수 있게 한다.

응용 프로그램이 0으로 나누는 연산을 하거나 접근할 수 없는 메모리에 접근하려 하면 운영체제로의 트랩이 발생해 운영체제는 CPU를 획득한다. 그리고 프로세스는 종료된다.

결국 불법적인 연산이 일어나길 기다려서 제어권을 획득하는 방식이다.

 

운영체제가 전권을 행사

프로세스가 시스템 콜을 호출하길 거부하거나 실수로 호출하지 않아 운영체제에게 제어를 넘기지 않을 경우 하드웨어의 도움없이 운영체제는 아무것도 할 수 없다. 이 문제를 해결하는 방법은 타이머 인터럽트이다.

타이머 장치는 수 밀리 초마다 인터럽트를 발생시키도록 프로그램 되어있다. 인터럽트가 발생하면 현재 수행 중인 프로세스는 중단되고 운영체제의 인터럽트 핸들러가 실행된다. 이 시점에서 운영체제는 CPU 제어권을 얻게 된다.

 

운영체제는 하드웨어에게 타이머 인터럽트가 발생했을 때 실행해야 할 코드를 알려주어야 한다. 부팅 시 운영체제가 이런 준비를 한다.

하드웨어는 인터럽트 발생 시 실행 중이던 프로그램의 상태를 저장하여 나중에 return-from-trap 명령어가 프로그램을 다시 시작할 수 있도록 해야한다. 레지스터들과 변수들이 스택에 저장되고, return-from-trap 명령어로 복원된다.

 

문맥의 저장과 복원

운영체제가 CPU 제어권을 획득한 후 프로세스를 계속할건지, 바꿀건지 결정해야 한다. 이 결정은 스케줄러에 의해 결정된다.

스케줄러에 의해 전환이 결정되면 운영체제는 문맥 교환이라고 알려진 코드를 실행한다.

문맥 교환의 개념

운영체제가 해야하는 작업은 현재 실행 중인 프로세스의 레지스터 값을 커널 스택 같은 곳에 저장하고 곧 실행될 프로세스의 커널 스택으로부터 레지스터 값을 복원하는 일이다. 이렇게 함으로써 return-from-trap 명령어가 마지막으로 실행될 때 다른 프로세스로 리턴하여 전에 끝난 곳부터 다시 할 수 있게 한다.

 

문맥 교환의 과정을 정리해 보자.

 

1.운영체제는 트랩 테이블 초기화

2.하드웨어가 시스템 콜 핸들러,타이머 핸들러의 주소를 기억한다.

3.운영체제가 인터럽트 타이머를 시작한다.

4.하드웨어에서 타이머를 시작한 후, 시간이 되면 CPU를 인터럽트 한다.

5.하드웨어가 CPU에서 실행중이던 프로세스 A의 레지스터 정보를 커널 스택에 저장, 커널 모드로 이동하고 trap을 실행한다.

6.운영체제가 trap을 처리하고 문맥 교환을 위한 switch()함수 호출해 A의 레지스터 정보를 A의 구조체에 저장, B의 레지스터 정보를 커널 스택에 복원한다. 스택 포인터를 B의 커널 스택을 사용하도록 바꾼다. return-from-trap을 수행해 B 프로세스 실행.

 

이 과정에서 2번의 레지스터 저장/복원이 일어난다. 

1.타이머 인터럽트가 발생했을 때

이 경우 실행 중인 프로세스의 레지스터 정보가 하드웨어에 의해 암묵적으로 저장되고 저장 장소로 해당 프로세스의 커널 스택이 이용된다.

 

2.프로세스 실행이 A->B 전환 될 때

 

병행성의 걱정

시스템 콜을 처리하는 도중 타이머 인터럽트가 발생하면 어떡하지?

인터럽트를 처리하는 도중 또 인터럽트가 발생하면 어떡하지?

이 문제를 처리하기 위해 운영체제는 인터럽트를 처리하는 동안 인터럽트를 작동하지 않도록 한다.

또 내부적으로 동시 접근을 방지하기 위해 기법을 개발했다. 이 기법으로 커널 안에서 동시에 다수의 활동이 진행될 수 있게 허용한다.

 

숙제

gettimeofday()함수 더 공부하기

'컴퓨터 공학 > 운영체제' 카테고리의 다른 글

[운영체제]멀티 레벨 피드백 큐  (0) 2021.02.06
[운영체제]스케줄링  (0) 2021.02.05
[운영체제]프로세스 API  (0) 2021.02.02
[운영체제]가상화  (0) 2021.01.31
[운영체제]운영체제 개요, 영속성  (0) 2021.01.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함