프로그램 구조와 실행

불불이·2021년 2월 14일
1
post-thumbnail

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

기본적인 컴퓨터 동작

  • 함수를 호출하고 호출한 함수의 실행이 끝나면 원래 호출했던 함수의 위치에 돌아간다.

  • CPU가 명령을 수행하려면 주소에 올라가 있어야 한다.

    주소영역은 코드, 데이터, 스택 영역으로 구분된다.

코드영역

작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령형태로 변환되어 저장되는 부분

데이터 영역

전역 변수등 프로그램이 사용하는 데이터를 저장하는 부분

스택 영역

함수가 호출될 때 호출된 함수의 수행을 마치고 복귀를 할 주소 및 데이터를 임시로 저장하는 데에 사용 되는 공간

함수 호출

  1. 프로그램은 제일 처음 메인함수에서 실행을 시작해 메인 함수가 다른 함수를 호출함
  2. CPU가 메인 함수의 코드를 수행하다가 다른 함수의 코드로 수행 위치를 이동하게 된다.
  3. 돌아와야 할 지점을 스택 영역에 저장한 후
  4. 프로그램은 새로운 함수 위치로 점프해 그 함수를 실행하고 함수 수행이 완료된 후에는 원래 호출 했던 함수 위치로 돌아오게 된다.

인터럽트의 동작 원리도 비슷하다.

일반적으로 프로그램 내에서 발생되는 함수호출에 필요한 복귀 주소는 각 프로그램의 주소 공간 중 스택 영역에 보관한다.


컴퓨터 시스템의 동작 개요

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

프로그램 카운터(PC)

CPU가 수행해야 할 메모리 주소를 담고있는 레지스터

즉, CPU는 매번 프로그램 카운터가 가리키는 메모리 위치의 명령을 처리하게 된다.

컴퓨터의 동작이 CPU에 의해서만 이루어지는 것이 아니다. ex 입출력

  1. 메모리에는 사용자 프로그램들과 운영체제가 같이 올라가 수행된다.
  2. CPU는 프로그램 카운터가 가리키는 메모리의 위치의 프로그램을 수행한다.
  • 프로그램 카운터가 메모리 주소 중 운영체제가 존재하는 부분을 가리키고 있다면 현재 운영체제의 코드를 수행중이며 이 경우를 ⇒ 커널모드
  • 반대의 경우 사용자모드라 한다.

프로그램의 실행

'프로그램이 실행되고 있다'는 것은 컴퓨터 시스템 차원에서 볼 때 크게 두 가지 중요한 의미를 가진다.

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

일단 우리가 알고있는 작동은 CPU는 디스크에 존재하는 실행파일이 메모리에 올라가면 프로그램은 CPU를 할당받고 명령을 수행한다. 하지만 여러 프로그램이 짧은 시간 단위로 CPU를 나눠 쓰고, 이들 프로그램이 메모리에 동시에 적재되어 있을 수 있으므로 여러 프로그램이 동시에 실행된다는 말을 보편적으로 사용하는 것이다.

실행파일이 메모리에 적재될 때

실행파일 전체가 메모리에 한꺼번에 올라가기 보다는 일부분만 메모리에 올라가고 나머지는 디스크의 특정 영역에 내려가는 것.

프로세스의 주소 공간은 앞에 나온 대로 코드, 데이터, 스택 등으로 구성된다. 각각의 프로그램마다 이러한 주소 공간을 별도로 가지며, 프로그램마다 독자적으로 가지며 이와 같은 주소 공간을 우리는 가상메모리(Virtual Memory) 또는 논리적 메모리(Logical Memory)라고 한다.

가상메모리, 논리적메모리

프로그램마다 독자적으로 가지고 있는 주소 공간.

운영체제또한 하나의 프로그램이기 때문에 운영체제 커널 역시 코드, 데이터, 스택의 주소 공간 구성을 가지고 있다. 즉 운영체제 또한 가상의 메모리가 존재한다.

운영체제의 역할

  • 아랫단의 하드웨어들을 효율적으로 관리하는 것
  • 윗단의 프로그램과 사용자에게 편리한 서비스를 제공하는 것

커널 - 코드

  1. CPU, 메모리 등의 자원을 관리하기 위한 부분과 사용자에게 편리한 인터페이스를 제공
  2. 시스템 콜 및 인터럽트를 처리

커널 - 데이터

  1. 각종 자원을 관리하기 위한 자료구조 저장
  2. CPU나 메모리와 같은 하드웨어 자원 뿐만 아니라 현재 수행중인 프로그램을 관리하기 위한 자료구조
  3. 각 프로세스의 상태, CPU 사용 정보 ,메모리 사용정보 등을 유지하기 위한 자료구조인 PCB를 두고 있다.

커널 - 스택

  1. 일반 프로그램의 스택 영역과 마찬가지로 함수호출시의 복귀 주소를 저장하기 위한 용도로 사용.
  2. 차이점: 현재 수행중인 프로세스마다 스별도의 스택을 두어 관리

별도의 저장공간이 필요한 이유

  1. 프로세스가 함수를 호출할 때 자기 주소 영역 내부에 정의된 함수를 호출하면 자신의 스택에 복귀 주소를 저장하지만, 프로세스가 특권명령을 수행하려고 커널에 정의된 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출하는 경우 그 복귀 주소는 커널 내부의 주소가 되어 사용자 프로그램의 스택과는 별도의 저장공간이 필요.
  2. 커널은 일종의 공유 코드로서 모든 사용자 프로그램이 시스템 콜을 통해 커널의 함수를 접근할 수 있으므로, 일관성을 유지하기 위해 각 프로세스마다 커널 내에 별도의 스택을 두게 되는 것이다.

자기 주소 공간 내의 스택을 사용하는 경우

  • 자기 자신의 코드 내에서 함수호출 및 복귀주소를 유지

커널 스택을 사용하는 경우

  • 시스템 콜이나 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수 호출이 발생할 경우

유의할 점

  • 시스템 콜이나 인터럽트 발생으로 CPU의 수행 주체가 운영체제로 바뀌는 순간에는 직전에 수행되던 프로그램의 복귀 정보를 스택이 아닌 PCB에 저장한다.
  • 위의 커널 스택을 사용하는 경우와 명확히 다르다 이미 인터럽트가 발생한 후 또 한번 운영체제의 코드가 실행될 때는 커널스택을 사용.
  • 인터럽트 발생 → PCB 저장 → 커널 스택

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

  1. 사용자 정의함수
  2. 라이브러리 함수
  3. 커널함수
  • 사용자 정의함수와 라이브러리 함수는 프로그램 내의 코드 영역에 기계어 명령 형태로 존재.

커널함수

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

인터럽트

앞부분에서시스템 동작 원리와 인터럽트의 개념을 살펴보았다.

CPU는 매번 프로그램 카운터가 가리키는 곳에 있는 명령을 수행하는 일밖에 하지 않는다.

그럼 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 경우는 어떻게 될까?

원칙적으로는 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용하지 않는다.

  • 데이터의 일관성이 유지되지 않아서

만약 그보다 더 시급하거나 CPU를 당장 사용해야 하는 일이 발생하게 된다면

  • 중요도에 따라 현재 처리중이던 인터럽트를 중단, 저장하고 우선순위가 높은 인터럽트를 처리한다.

시스템 콜

자신의 프로그램이 아닌, 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것

  • 인터럽트의 발생과 동일한 방법

프로그램이 CPU에서 명령을 수행하던 중 디스크의 파일을 읽어와야 할 경우

  1. 시스템 콜로 커널의 함수를 호출하게 된다. (특권명령)
  2. CPU의 제어권을 운영체제에게 이양한다. (인터럽트 라인 셋팅)
  3. 서비스 루틴으로 이동
  4. 현재 진행중이던 작업을 PCB에 저장한다.
  5. CPU는 디스크 컨트롤러에게 파일을 읽어오라는 명령 (로컬버퍼)
  6. CPU의 제어권을 다른 프로세스에게 이양
  7. 기존 작업을 완료하면 CPU에게 인터럽트를 발생
  8. CPU는 다른 프로세스의 수행을 잠시 멈추고 (CPU를 기다리는 큐에 삽입) 인터럽트 처리 루틴으로 그 제어권이 넘어간다.
  9. 로컬버퍼로 읽어온 내용을 메모리로 복사

중간에 CPU를 빼앗기는 경우

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

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

  1. 프로세스 자신의 주소공간에 있는 코드 실행중인 상태
  2. 커널에 있는 코드를 실행중인 상태

예를 들어 프로세스 A가 CPU에 의해 실행되고 있다고 하면,

  • 자신의 주소 공간에 정의된 코드를 실행도 하고
  • 커널의 시스템 콜 함수를 실행할 때도 있다.

비록 시스템 콜을 통해 실행되는 것이 프로세스 A의 코드가 아닌 운영체제의 커널의 코드이지만, 시스템 콜이 수행되는 동안 커널이 실행상태에 있다고 하지 않고 프로세스 A가 실행 상태에 있다고 말한다.


profile
https://nibble2.tistory.com/ 둘 중에 어떤 플랫폼을 써야할지 아직도 고민중인 사람

0개의 댓글