본문 바로가기

CS/운영체제

[ 운영체제 ] 프로세스의 개념, 인터럽트

반응형

프로세스는 간단하게 '실행 중인 프로그램'으로 정의할 수 있다. '실행중'이라는 것은 해당 프로그램이 메모리 위에 있다는 것을 뜻한다. 프로그램은 컴퓨터 상에 설치된 'exe' 파일이라고 생각하자. exe파일은 실행파일이라고 하는데 이는 단순히 코드일 뿐이다. exe파일을 클릭하면 필요한 메모리 공간을 할당받는데, 이를 프로세스라고 한다. 하나의 프로그램이 여러개 실행되면 프로세스 또한 여러개가 되는 것이다. 그림으로 나타내면 아래와 같다.

OS가 프로세스에게 할당하는 메모리는 구역마다 이름이 정해져 있다. 각 구역의 이름은 Text, Data, Stack, Heap이고, 저장되는 데이터 종류는 아래와 같다.

- Text : 프로그램의 code 저장
- Data : 전역 변수 저장
- Stack : 함수와 관련된 데이터, return 주소, 로컬 변수 저장, 정적 할당 데이터
- Heap : 런타임 중에 동적으로 할당된 데이터

 

이렇게 생겼다

왼쪽이 메인 메모리고 각 프로세스마다 오른쪽의 형태로 메모리가 할당되는 것으로 이해하면 된다. 그런데 메인 메모리에서 Kernel은 무엇일까? Kernel(커널로 부르겠다)은 OS가 할당받은 메모리로 생각하면 된다. OS도 소프트웨어기 때문에 메모리 위에 올라가 있다. 그런데 운영체제는 용량이 크기 때문에 모든 내용이 메모리에 올라가지 않고, 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용한다. 이때 메모리에 상주하는 운영체제의 부분을 커널이라고 한다.

 

각각의 프로세스는 운영체제에 의해 제어된다. 그런데 아까 커널이 OS가 할당받은 메모리라고 했다. 따라서 아래와 같은 결론에 도달할 수 있다.

커널에서 프로세스를 관리한다!!

커널 안에는 무수히 많은 요소들이 있지만, 그 중에 프로세스를 관리하기 위한 하나의 별도의 정보 집합을 PCB라고 한다.  PCB 안에는 프로세스의 상태, PID, 프로세스 메모리 주소, PC(program counter) 등과 같은 정보가 저장되어 있다. PCB의 풀네임은 Process Control Block로 말 그대로 프로세스를 관리하는 녀석이다. 메모리의 구조를 조금만 더 자세히 보면 아래와 같다. 

 

 

그런데 문제가 하나 있다. CPU는 한 가지 일만 처리할 수 있다. 커널과 프로세스 작업을 동시에 처리할 수 없다는 얘기다. 프로세스 작업을 하다가 시간이 오래 걸리는 입출력 연산을 할 일이 생기면 CPU가 끝날때까지 기다려야 하는 불상사가 발생하게 된다. 이는 매우 비효율적이다. 운영체제의 핵심은 '자원을 어떻게 효율적으로 관리할 것인가'인데 이는 운영체제의 목적에 맞지 않는다.

방법은 생각보다 간단하다. 시간이 오래 걸리는 입출력 연산을 진행하는 동안 CPU가 다른 작업을 수행할 수 있도록 하면 된다. 입출력 연산이 끝나면 CPU에게 작업이 완료됐음을 알리고, 기존에 진행하던 작업을 계속 처리하면 된다. 이렇게 입출력 작업이 완료됐음을 CPU에게 알려주는 것을 '인터럽트'라고 한다. 인터럽트에는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.

하드웨어 인터럽트

하드웨어로 인해 발생하는 인터럽트를 말한다. 마우스 동작, 키보드, 이더넷 패킷, 드라이버, 이어폰, 마이크 등등

소프트웨어 인터럽트

소프트웨어로 인해 발생하는 인터럽트를 말한다. 시스템 콜과 예외상황(0으로 나눔)이 해당된다.

인터럽트 과정

process A 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받았다고 가정해보자.

- process A는 system call을 통해 인터럽트를 발생시킨다

- CPU는 현재 진행 중인 기계어 코드를 완료한다

- 현재까지 수행중이던 상태를 process의 PCB(Process Control Block)에 저장한다. (수행 중이던 메모리 주소, 레지스터 값, 하드웨어 상태 등...)

- PC(Program Counter)에 다음에 실행할 명령의 주소를 저장한다

- 인터럽트 벡터를 읽고 ISR(Interrupt Service Routine) 주소값을 얻어 ISR로 점프하여 루틴을 실행한다

- 해당 코드를 실행한다

- 해당 일을 다 처리하면, 대피시킨 레지스터를 복원한다

- ISR의 끝에 IRET 명령어에 의해 인터럽트가 해제된다

- IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행 위치로 복원한다

반응형