본문 바로가기
CS/OS

[OS] 04. 프로그램의 구조와 실행

by 원만사 2021. 12. 20.
반응형

1. 프로그램의 구조와 인터럽트

 프로그램이 CPU에서 명령을 수행하려면 해당 명령을 담은 프로그램의 주소 영역이 메모리에 올라가 있어야 한다. 프로그램의 주소 영역은 크게 코드(code), 데이터(data), 스택(stack)영역으로 구분된다.

  • 코드 : 프로그램 함수들의 코드가 기계어 명령 형태로 변환되어 저장되는 부분
  • 데이터 : 전역 변수등 프로그램이 사용하는 데이터는 저장하는 부분
  • 스택 : 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 부분

 인터럽트의 동작 원리는 함수의 호출과 비슷하다. A 프로그램이 CPU를 할당받아 명령을 수행중일 때 인터럽트가 발생할 경우 A는 현재 수행 중인 명령의 위치를 저장해놓는다. 그 후 인터럽트 처리루틴으로 넘어가 인터럽트를 처리 하고 다시 돌아와 A의 이전 작업 지점부터 수행을 이어간다. 

  • 인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 PCB(프로세스 제어 블록)에 저장됨
  • 인터럽트가 발생하면 PCB에 해당 프로그램의 수행 위치를 저장한다.
  • 인터럽트 처리 후 PCB에 저장된 주소를 복원시켜 원래 하던 일을 재개한다.

 

2. 컴퓨터 시스템의 작동 개요

 CPU는 매 시점 메모리의 특정 주소에 존재하는 명령을 하나씩 읽어와 그대로 실행한다. 이때 CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터를 프로그램 카운터(Program Counter: PC)라고 한다. 즉, CPU는 매번 PC가 가리키는 메모리 위치의 명령을 처리한다.

 

 컴퓨터 시스템은 여러 장치로 이루어져 있다. 하드웨어에는 CPU와 메모리가 있고, 이 밖에 각 입출력 장치와 이들 장치를 전담하는 입출력 컨트롤러와 로컬버퍼가 존재한다.

 메모리에는 사용자 프로그램들과 운영체제가 같이 올라가 수행된다. CPU는 PC가 가리키는 메모리 위치의 프로그램을 수행한다. CPU가 운영체제의 코드를 수행중이라면 커널모드(kernel mode)에서 수행 중이라고 하며 사용자 프로그램이 존재하는 메모리 위치를 수행중이라면 사용자모드(user mode)에서 CPU가 수행되고 있다고 한다.

컴퓨터 시스템의 하드웨어 구조 및 프로그램이 메모리에 적재되는 모습

 

 CPU가 수행하는 명령에는 일반명령특권명령이 있다. CPU내에는 모드비트가 있어 두 명령의 실행가능성을 체크한다.

  • 일반명령 : 모든 프로그램이 수행할 수 있는 명령 (ex. 메모리에서 자료를 읽고 결과를 쓰는 등의 명령들)
  • 특권명령 : 보안이 필요한 명령으로 각종 장치에 접근하는 명령. 항상 운영체제만이 수행할 수 있다.

 특권명령 수행이 필요할 경우 운영체제에게 특권명령의 대행을 요청한다. 이를 시스템 콜(system call)이라고 한다. 사용자 프로그램이 시스템 콜을 하게 되면 운영체제는 사용자 프로그램의 코드가 아닌 커널 영역에 정의된 시스템 콜 처리 코드를 수행하게 된다. 그 후 작업이 완려되면 CPU에 인터럽트를 발생시켜 작업이 완료되었음을 알린다. 

 

 인터럽트 발생을 위해 주변장치는 인터럽트 라인(interrupt line)을 세팅하고, CPU는 매번 명령을 수행한 직후 인터럽트 라인을 체크해 서비스 요청이 들어왔는지 확인한다. 인터럽트의 종류는 다양하기 때문에 발생 원인마다 라인을 다르게 해서 구분한다. 인터럽트가 발생하면 CPU는 해당 인터럽트를 처리하기 위한 루틴으로 넘어가서 커널 내의 인터럽트 처리 코드를 수행한다.

 

3. 프로그램의 실행

 프로그램이 실행되고 있다는 것은 다음과 같은 의미를 가진다.

  1. 디스크에 존재하던 실행파일이 메모리에 적재된다
  2. 프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태이다

 실행파일이 메모리에 적재될 때, 당장 수행에 필요한 부분은 메모리에 올라가고 나머지는 디스크의 스왑 영역에 내려가 있는 것이 일반적이다. 이는 적은 메모리 공간을 좀 더 효율적으로 사용하기 위한 방법이다. 

실행파일이 실행되어 물리적 메모리에 적재되는 모습

 프로세스의 주소 공간은 코드(code), 데이터(data), 스택(stack)등으로 구성된다. 각각의 프로그램마다 이러한 주소 공간을 별도로 가지며 이는 가상메모리(virtual memory) 또는 논리적 메모리(logical memory)라고 부른다. 

주소 변환에 의해 프로세스의 논리적 주소 공간이 물리적 메모리에 적재되는 모습

 

 운영체제의 커널 역시 코드, 데이터, 스택의 주소 공간을 갖고 있다. 운영체제의 기능은 아랫단의 하드웨어 자원을 효율적으로 관리하는 것과 윗단의 응용프로그램 및 사용자에게 편리한 서비스를 제공하는 것이다. 이를 위해 커널의 코드CPU, 메모리 등의 자원을 관리하기 위한 부분과 사용자에게 편리한 인터페이스를 제공하기 위한 부분이 주를 이루고 있다. 이 외에도 시스템 콜 및 인터럽트를 처리하기 위한 부분을 포함한다.

 

 커널의 이터 영역에는 각종 자원을 관리하기 위한 자료구조가 저장된다. 현재 수행 중인 프로그램을 프로세스(process)라고 부르는데, 커널의 데이터 영역 내에는 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조인 PCB를 두고 있다. 또한 CPU나 메모리와 같은 하드웨어 자원을 관리하기 위한 자료구조도 존재한다.

 

 커널의 스택 영역은 함수 호출시의 복귀 주소를 저장하기 위한 용도로 사용된다. 하지만 여기에는 일반 사용자 프로그램의 스택과 달리 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리한다. 이유는 다음과 같다.

  • 프로세스가 특권명령을 수행하려고 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출하는 경우 그 복귀 주소는 커널 내의 주소가 된다. 이럴 경우 사용자 프로그램의 스택과는 별도의 저장공간이 필요하게 된다.
  • 커널은 모든 사용자 프로그램이 시스템 콜을 통해서 접근할 수 있다. 일관성 유지를 위해 각 프로세스마다 커널 내에 별도의 스택을 두게 된다.

 즉, 프로그램이 자기 자신의 코드 내에서 함수호출 및 복귀 주소를 유지하기 위해서는 자기 주소 공간 내의 스택을 사용하고, 시스템 콜이나 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수호출이 발생할 경우 커널 스택을 사용하게 되는 것이다.

운영체제의 주소 공간 구조

 

4. 사용자 프로그램이 사용하는 함수

 프로그램이 사용하는 함수는 크게 사용자 정의 함수와 라이브러리 함수, 커널 함수의 세 가지로 구분된다. 

 

사용자 정의 함수와 라이브러리 함수

  • 사용자 정의 함수: 프로그래머 본인이 직접 작성한 함수
  • 라이브러리 함수: 이미 누군가 작성해 놓은 함수를 호출만 하여 사용하는 함수

 두 함수 모두 해당 프로그램의 코드 영역에 기계어 명령 형태로 존재한다. 그렇기 때문에 두 함수는 해당 프로세스의 주소 공간에 포함되며, 함수 호출 시에도 자신의 주소 공간에 있는 스택을 사용하게 된다.

 

커널 함수

 커널 함수는 운영체제 커널의 코드에 정의된 함수를 뜻한다. 종류는 다음과 같다.

  • 시스템 콜 함수: 사용자 프로그램이 운영체제의 서비스를 요청하기 위해 호출하는 함수
  • 인터럽트 처리 함수: 각종 하드웨어 및 소프트웨어가 CPU의 서비스를 요청하기 위해 발생시키는 함수

 위와 같은 함수들은 운영체제 커널의 주소 공간에 코드가 정의된다. 일반적인 함수 호출은 사용자 프로그램 내에 존재하는 코드를 실행하는 것이고 커널 함수는 운영체제라는 별개의 프로그램에 CPU를 넘겨서 실행하는 것이다. 

 시스템 콜은 인터럽트와 같이 CPU의 인터럽트 라인을 세팅하는 방법을 사용한다.

 

 

5. 인터럽트

 CPU는 매번 PC가 가리키고 있는 지점의 명령을 하나씩 수행하고 나서, 다음 명령을 수행하기 직전에 인터럽트 라인이 세팅되었는지 체크한다. 인터럽트가 발생했으면 CPU는 현재 수행하던 프로세스를 멈추고 운영체제의 인터럽트 처리루틴으로 이동해서 인터럽트 처리를 수행한다. 처리가 완료되면 인터럽트 발생 직전의 프로세스에게 CPU의 제어권이 다시 넘어간다.

하드웨어가 CPU에게 인터럽트를 전달하는 방법

 일반적으로 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것은 허용되지 않는다. 이유는 데이터의 일관성이 유지되지 않는 문제가 발생할 수 있기 때문이다. 하지만 현재 인터럽트보다 더 시급하거나 CPU를 당장 사용해야 하는 일이 발생할 수도 있다.

 만약 현재 인터럽트보다 더 우선순위가 높은 인터럽트가 발생하면 현재 처리 중이던 인터럽트 코드의 수행 지점을 저장하고 우선순위가 높은 인터럽트를 처리하게 된다. 인터럽트 처리가 끝나면 저장된 주소로 복귀해 이전에 수행하던 인터럽트 처리 코드를 마저 수행하게 된다.

 

6. 시스템 콜

 시스템 콜은 자신의 프로그램이 아닌, 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것이다. 프로그램은 자신이 인터럽트 라인에 인터럽트를 세팅하는 명령을 통해 커널 함수를 호출한다.

사용자 프로그램이 시스템 콜을 하는 방법

 디스크의 파일 입출력이 이루어지는 과정을 통해 시스템 콜의 예를 살펴보자.

  1. 사용자 프로그램이 디스크의 파일을 읽어오기 위해 시스템 콜로 커널 함수를 호출한다.
  2. 사용자 프로그램은 CPU의 제어권을 운영체제에 이양한다(인터럽트 라인 세팅 명령을 통해)
  3. CPU는 현재 명령의 수행을 마친 후 인터럽트가 발생했는지 점검하는데, 이 때 인터럽트가 발생한 것을 확인하고 현재 수행 중인 프로그램을 잠시 멈춘 후 CPU의 제어권을 운영체제에 넘긴다.
  4. 운영체제는 설정된 인터럽트 라인에 의해 이번에 발생한 인터럽트가 입출력을 요청하는 인터럽트임을 인지하게 된다.
  5. 해당 서비스루틴으로 이동해 입출력 작업을 수행한다. CPU는 디스크 컨트롤러에게 파일을 읽어오라는 명령을 한다.
  6. 운영체제는 CPU의 제어권을 다른 프로세스에게 이양한다.
  7. 입출력 작업이 완료되면 디스크 컨트롤러가 CPU에게 인터럽트를 발생시켜 입출력 작업이 완료되었음을 알린다. CPU는 사용자 프로세스의 수행을 잠시 멈추고 인터럽트 처리루틴으로 제어권이 넘어간다.
  8. 디스크로부터 로컬버퍼로 읽어온 내용을 컴퓨터 내의 메모리로 복사한 후 디스크 입출력을 요청했던 프로세스에게 다시 CPU를 획득할 수 있는 권한을 준다.
  9. 해당 프로세스는 CPU를 기다리는 큐에 삽입되고 CPU의 제어권은 다시 인터럽트를 당한 프로세스로 남어가 하던 작업을 계속 수행한다.

 프로그램이 CPU를 할당받고 명령을 수행하다가 중간에 CPU를 빼앗기는 경우는 크게 두 가지가 있다.

  • 타이머에 의해 인터럽트가 발생하는 경우
  • 입출력 요청을 위해 시스템 콜을 하는 경우

 

7. 프로세스의 두 가지 실행 상태

 프로세스는 자신의 주소 공간에 있는 코드뿐만 아니라 시스템 콜 등을 통해 커널의 주소 공간에 있는 코드도 실행한다. 자신의 주소 공간에 있는 코들르 실행하는 상태를 사용자모드에서의 실행 상태(user mode running)라 하고, 커널의 시스템 콜 함수를 실행하는 것을 커널모드에서의 실행 상태(kernel mode running)라고 한다. 

 시스템 콜로 인해 CPU의 제어권이 운영체제 있다고 하더라도 해당 프로세스가 실행 상태에 있다고 한다. 이는 프로세스가 해야 할 일을 운영체제가 대행하는 것이기 때문에 여전히 프로세스가 실행 상태에 있다고 간주된다. 다만 프로세스가 자신의 코드를 실행하는 것과 구분 지어, 이러한 사태를 '프로세스가 커널 모드에서 실행중'이라고 이야기한다.

사용자모드와 커널모드를 통해 프로그램이 수행되는 과정

 

 

 프로그램이 시작되어 종료될 때까지 다양한 함수를 호출하는 것을 사용자모드와 커널모드의 실행 상태로 구분 지을 수 있다. 프로그램의 실행이 끝날 때에는 커널 모드로 진입해 프로그램을 종료한다. 

 

 

Reference

 

운영체제와 정보기술의 원리 - 교보문고

이 책은 총 10장으로 구성되어 있다.1장 ‘컴퓨터 및 정보기술의 역사’에서는 운영체제를 설명하기에 앞서 정보기술의 원리와 철학에 대해 정의하고, 컴퓨터와 정보기술 분야의 역사를 간략히

www.kyobobook.co.kr

 

반응형

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

[OS] 스핀락, 뮤텍스, 세마포어  (0) 2021.12.22
[OS] 공유 자원 접근 문제  (0) 2021.12.22
[OS] 05. 프로세스 관리  (0) 2021.12.21
[OS] 03. 컴퓨터 시스템의 동작 원리  (0) 2021.12.14
[OS] 02. 운영체제 개요  (0) 2021.12.13

댓글