프로그램의 구조와 실행 - 1

초보개발·2022년 2월 6일
0

OS

목록 보기
18/38

프로그램 구조와 인터럽트

프로그램을 실행할때 하나의 함수가 수행되는 중에 다른 함수를 호출하고 호출된 함수의 수행이 완료되면 다시 원래 호출되었던 함수의 위치로 돌아가 프로그램을 계속해서 수행한다. 그리고 프로그램이 CPU에서 명령을 수행하려면 해당 명령을 담은 프로그램의 주소 영역이 메모리에 적재되어 있어야 한다.
프로그램의 주소 영역은 code, data, stack으로 구분된다.

  • code: 함수들의 코드가 CPU에서 수행할 수 있도록 기계어 명령으로 번역되어 저장되는 부분
  • data: 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분
  • stack: 함수가 호출될 때 호출된 하뭇의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는데 사용되는 부분

함수 a가 수행 중에 b라는 함수를 호출할 경우

  • 프로그램은 a함수에서 b함수를 호출한 지점을 스택에 저장해두고 b함수가 수행된 후 스택에 저장된 주소 위치(복귀 주소)로 돌아와서 코드를 계속 수행하게 된다. 함수가 호출되면 다음에 실행할 명령의 메모리 위치가 바뀌게 되는 셈이다. CPU가 순차적으로 명령을 수행하다가 호출된 함수의 위치로 점프해서 새로운 위치의 명령을 수행하기 때문이다.

인터럽트의 동작 방식도 함수의 호출과 비슷하다.

  • 프로그램 a가 CPU 할당받고 명령 수행중에 인터럽트가 발생하면 a는 현재 수행 중인 명령의 위치를 따로 저장해 놓는다. 운영체제 내부 코드인 인터럽트 처리루틴에서 인터럽트를 처리하고 다시 원래 위치로 돌아와 프로그램 a의 이전 작업 지점부터 수행을 계속 이어나가게 된다.

일반적으로 프로그램 내에서 발생되는 함수 호출에 대한 복귀 주소는 각 프로그램의 주소 공간 중 스택 영역에 보관한다. 인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 PCB에 저장된다.

컴퓨터 시스템의 작동 개요

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

  • 이때 CPU는 PC가 가리키는 메모리 주소 중 운영체제가 존재하는 부분을 가리키고 있다면 현재 운영체제의 코드를 수행중이라는 뜻이고 CPU가 커널 모드에서 수행중이라고 말한다.
  • PC가 사용자 프로그램이 존재하는 메모리 위치를 가리키고 있다면 그 메모리 위치에 올라가 있는 사용자 프로그램이 수행중이고 유저 모드로 CPU가 수행되고 있다는 뜻이다.

CPU가 수행하는 명령: 일반명령, 특권명령
모드 비트로 두 명령의 실행가능성을 항상 확인함

  • 일반명령: 메모리에서 자료를 읽어와 CPU에서 연산을 처리하고 결과를 메모리에 쓰는 명령들, 모든 프로그램들이 수행할 수 있는 명령
  • 특권명령: 보안이 필요한 명령, 입출력 장치, 타이머 등 각종 장치에 접근하는 명령, 운영체제만 수행 가능하도록 제한을 둠

만약 프로그램이 특권명령의 수행이 필요할 경우, 운영체제에게 특권명령 대행을 요청하게 되는데 이것을 시스템콜이라고 한다. 시스템콜을 하게 되면 운영체제는 프로그램의 코드가 아닌 커널 영역에 정의된 시스템 콜 코드를 수행하게 된다.
CPU는 PC가 가리키는 곳의 명령만 수행하기 때문에 주변장치의 상태를 지속적으로 파악할 수 없다. 따라서 주변장치는 인터럽트를 사용하여 CPU가 필요할 때마다 요청을 보낸다. 인터럽트를 발생시키기 위해서 주변장치는 인터럽트 라인을 세팅하고 CPU는 매번 명령을 수행한 직후 인터럽트 라인을 체크해 요청이 들어왔는지 확인하게 된다. 인터럽트가 발생하면 CPU는 해당 인터럽트를 처리하기 위한 루틴으로 넘어가 커널 내의 인터럽트 처리 코드를 수행한다.

프로그램의 실행

프로그램이 실행 중이다 : Process

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

메모리 공간을 효율적으로 사용하기 위해 실행파일의 모든 부분이 메모리에 적재되지 않고 일부분만 메모리에 올라가고 나머지는 디스크의 특정 영역에 내려가 있는 것이 일반적이다. 즉, 프로그램의 주소 공간 중 CPU 수행에 당장 필요한 부분은 메모리에 적재, 아닌 부분은 디스크의 스왑 영역에 내려놓는 방식으로 운영된다.
각각의 프로그램들은 프로세스 주소 공간을 별도로 갖고 있으며 프로그램마다 독자적으로 존재하는 이와 같은 주소 공간을 가상메모리 또는 논리적 메모리라고 부른다. (실제 물리적 메모리 주소와 독립적으로 각 프로그램마다 독립적인 주소 공간을 가지므로 지칭하는 용어임)
운영체제의 커널도 코드, 데이터, 스택 등의 주소 공간 구성을 갖고 있다.

  • 데이터 영역: 각종 자원을 관리하기 위한 자료구조 저장
    • PCB(프로세스 상태, CPU 사용 정보, 메모리 사용정보를 유지)
  • 스택 영역: 함수 호출시의 복귀 주소 저장
    • 일반 프로그램과는 달리 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리: 프로세스가 특권명령을 수행하려고 커널에 정의된 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출할 때의 복귀 주소는 커널 내의 주소가 되어 사용자 프로그램의 스택과 다른 별도의 저장공간이 필요하기 때문이다. 그리고 커널도 공유되는 코드이므로 모든 프로그램들이 접근할 수 있게 된다. 따라서 일관성 유지를 위해 각 프로세스마다 커널 내에 독립적인 스택을 갖게 되는 것이다.

프로그램이 자신의 코드 내에서 함수 호출 및 복귀 주소를 유지하기 위해서는 주소 공간 내의 스택을 사용하되, 시스템 콜이나 인터럽트로 인해 커널의 코드가 실행중에 함수 호출이 발생했을 때에는 커널 스택을 사용한다.
프로그램 내의 함수 호출시 해당 프로그램의 스택에 복귀 주소를 저장하지만 시스템 콜이나 인터럽트 발생으로 CPU 수행 주체가 운영체제로 바뀌는 순간에는 직전에 수행되던 프로그램의 복귀 정보를 스택이 아닌 PCB에 저장한다는 점을 주의해야 한다.
커널의 코드가 수행되는 도중에 이루어지는 함수 호출은 커널 스택에 저장한다.

0개의 댓글