본문 바로가기

운영체제

4:프로그램의 구조와 실행

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

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

3.프로그램의 실행

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

5.인터럽트

6.시스템 콜

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


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

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

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

-데이터 영역:전역 변수(global variable)등 프로그램이 사용하는 데이터를 저장하는 부분

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

 

*인터럽트의 동작 원리

A라는 프로그램이 CPU를 할당받고 명령을 수행하고 있는데 인터럽트가 발생하면 A는 현재 수행중인 명령의 위치를 저장해놓는다. 그 후 운영체제 내부 코드인 인터럽트 처리루틴으로 넘어가서 인터럽트 처리를 하고 다시 돌아와 A의 이전 작업 지점부터 수행을 이어간다.인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 프로세스 제어블록에 저장된다.(일반적으로 프로그램 내에서 발생되는 함수 호출에 필요한 복귀 주소는 각 프로그램의 주소 공간 중 스택영역에 보관) 프로세스 제어블록에는 인터럽트가 발생한 시점에서 그 프로그램의 어느 부분까지 수행했는지를 저장하며, 인터럽트 처리 후 프로세스 제어블록에 저장된 주소를 복원시켜 원래 수행하던 일을 재개하게 된다.

 

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

CPU는 매 시점 메모리의 특정 주소에 존재하는 명령을 하나씩 읽어와 그대로 실행한다.

이때 CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터를 프로그램 카운터(Program Counter:PC)라고 부른다. 즉 CPU는 매번 프로그램 카운터가 가리키는 메모리의 위치 명령을 처리하게 된다.

컴퓨터 시스템을 구성하는 하드웨어로는 먼저 CPU와 메모리가 있고, 각 입출력 장치와 이들 장치를 전담하는 작은 CPU(입출력 컨트롤러)와 메모리(로컬 버퍼)가 있다. 

 

*커널모드:프로그램 카운터가 메모리 주소 중 운영체제가 존재하는 부분을 가리키고 있다면, 현재 운영체제의 코드를 수행중. 이를 CPU가 커널모드에서 수행중이라고 함

 

*사용자 모드: 프로그램 카운터가 사용자 프로그램이 존재하는 메모리 위치를 가리키고 있다면 그 메모리 위치에 올라가 있는 사용자 프로그램이 수행중

 

*일반명령:메모리에서 자료를 읽어와 CPU에서 계산하고 결과를 메모리에 쓰는 일련의 명령. 이러한 일반 명령은 모든 프로그램이 수행할 수 있는 명령임.

 

*특권명령:보안이 필요한 명령. 입출력 장치, 타이머 등 각종 장치에 접근하는 명령임. 컴퓨터 시스템에서는 이러한 특권명령을 항상 운영체제만이 수행할 수 있도록 제한하고 있음.컴퓨터시스템은 이 두 명령의 실행가능성 (일반명령/특권명령) 체크 위해 CPU내에 모드비트(mode bit)를 둔다.

 

*시스템콜(system call): 사용자 프로그램은 스스로 특권명령을 수행 못하므로 운영체제에게 특권명령의 대행을 요청함.이같은 서비스 요청을 시스템콜이라고 함.ex)사용자 프로그램이 실행되다보면 디스크의 파일에 접근 or 수행 결과 화면에 출력 등 일반명령 외에 특권명령 필요한 경우 있음

 

3.프로그램의 실행

'프로그램이 실행(program execution)되고 있다': 컴퓨터 시스템 차원에서 볼 때 2가지 중요한 의미 가짐

(1)디스크에 존재하던 실행파일이 메모리에 적재된다는 의미

(2)프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태라는 의미

 

 

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

프로그램이 사용하는 함수

(1)사용자 정의 함수:프로그래머 본인이 직접 작성한 함수

(2)라이브러리 함수:본인이 작성하지는 않았지만 이미 누군가 작성해놓은 함수를 호출만 하여 사용하는 경우

(1)과 (2)모두 그 프로그램의 코드 영역에 기계어 명령 형태로 존재한다. 따라서 이 두 함수는 프로그램이 실행될 때에 해당 프로세스의 주소 공간에 포함되며, 또한 함수호출시에도 자신의 주소 공간에 있는 스택을 사용하게 된다.

(3)커널 함수:운영체제의 커널의 코드에 정의된 함수. 1.콜함수: 사용자 프로그램이 운영체제의 서비스를 요청하기 위해 호출하는 함수  2.인터럽트 처리 함수: 각종 하드웨어 및 소프트웨어가 CPU의 서비스를 요청하기 위해 발생시키는 함수.

이같은 커널 함수는 운영체제의 커널의 주소공간에 코드가 정의됨(사용자 프로그램의 주소공간에 코드 존재하는 것 아님) 즉 운영체제 내에 있는 함수를 사용자 프로그램이 호출해서 사용하는 것임.

 

5.인터럽트

원칙적으로는 인터럽트 처리 중에 또다른 인터럽트가 발생하는 것을 허용하지 않는다.(데이터의 일관성이 유지되지 않는 문제가 발생할 수 있기 때문)

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

 

6.시스템 콜

시스템콜은 함수호출이긴 하지만 자신의 주소공간을 거스르는 영역에 존재하는 함수를 호출하는 것을 말한다. 즉 자신의 프로그램이 아닌, 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것이다.

일반 함수호출과는 달리 프로그램이 스스로 인터럽트 라인을 세팅하는 명령을 통해 이루어진다.

 

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

(1) 타이머에 의해 인터럽트가 발생하는 경우

(2)입출력 요청을 위해 시스템콜을 하는 경우

 

 

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

*사용자모드에서의 실행상태(user mode running):

ex)프로세스A가 CPU에서 실행되고 있다고 하면 자신의 주소 공간에 정의된 코드를 실행하는 것

 

*커널모드에서의 실행상태(kernel mode running):

ex)프로세스A가 CPU에서 실행되고 있다고 하면 커널의 시스템콜 함수를 실행하는 것