택시짱의 개발 노트

4장. 프로그램의 구조와 실행 본문

카테고리 없음

4장. 프로그램의 구조와 실행

택시짱 2021. 2. 28. 23:31

www.yes24.com/Product/Goods/90124877

운영체제와 정보기술의 원리

컴퓨터 운영체제와 정보기술의 기본 원리 및 핵심 철학을 설명한 컴퓨터 입문서온라인 공개강좌 KOCW에서 꾸준히 호평 받아온 이화여대 반효경 교수의 컴퓨터 입문서이다. 이제는 시대의 흐름에

www.yes24.com

반효경 교수님이 출판하신 운영체제와 정보기술의 원리를 참고하여 작성하였습니다.

 

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

우리가 사용하는 컴퓨터 프로그램은 어떠한 프로그래밍 언어로 작성되었든 그 내부 구조는 함수들로 구성된다. 하나의 함수가 수행되는 중에 다른 함수를 호출하고, 호출된 함수의 수행이 끝나면 다시 원래 호출했던 함수의 위치로 돌아가 프로그램을 계속 실행하게 된다.

 

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

 

코드 영역은 우리가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령(machine instruction) 형태롤 변환되어 저장되는 부분이다.

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

스택 영역은 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 부분이다.

 

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

 


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

CPU를 흔히 컴퓨터의 두뇌라고 부르지만 CPU는 인간이 뇌처럼 스스로 생각하고 판단하는 능력을 갖추고 있지는 못한다.

CPU는 매 시점 메모리의 특정 주소에 존재하는 명력을 하나씩 읽어와 그대로 실행을 해야 되는데 이 메모리 주소를 알려주는 레지스터를 프로그램 카운터(program counter : pc)라고 부른다.

 

메모리에는 사용자 프로그램과 운영체제가 같이 올라가 수행되는고 이때  CPU는 프로그램 카운터(pc)가 가리키는 메모리 위치의 프로그램을 수행하게 된다. 예를들어 pc가 메모리 주소중 운영체제가 존재하는 부분을 가리키고 있다면 운영체제의 코드를 수행 중이며 CPU가 커널 모드(kernel mode)에서 수행중이라고 할수 있고, 사용자 프로그램이 존재하는 부분을 가리키고 있다면 사용자 모드(user mode)에서 CPU가 수행되고 있다고 할수 있다.

 

CPU가 수행하는 명령에는 일반명령과 특권명령이 있다.

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

특권 명령은 보안이 필요한 명령으로 입출력 장치, 타이머등 각종 장치에 접근하는 명령이다. 특권 명령은 항상 운영체제만이 수행할 수 있도록 제한하고 있다.

또한 두 명령이 어떤 명령인지 체크하기 위해서 CPU 내에 모드비트(mode bit)를 둔다.

 

사용자 프로그램이 실행되다 보면 일반명령외 입출력과 같은 특권명령의 수행이 필요한 경우가 생기는데 운영체제에 특권명령을 요청 하는것을 시스템 콜(system call)이라 한다.

 


3. 프로그램의 실행

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

첫 번째는 디스크에 존재하던 실행파일이 메모리에 적재된다는 의미

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

 

매 시점 CPU에서 명령을 수행하는 프로그램은 기껏해야 하나뿐이다. 하지만 여러 프로그램이 짧은 시간 단위로 CPU를 나누어 쓰고, 이들 프로그램이 메모리에 동시에 적재되어 있을 수 있으므로 여러 프로그램이 동시에 실행된다는 말을 보편적으로 한다.

 

실행 파일이 메모리에 적재될 때, 실행 파일 전체가 메모리에 한꺼번에 적재 되는것이 아니라 당장 필요한 부분만 메모리에 올라가고 나머지는 보조메모리의 스왑영역에 내려가 있게된다.

 


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

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

 

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

 

커널함수는 운영체제 커널의 코드에 정의된 함수를 뜻한다. 커널 함수는 사용자 프로그램의 주소 공간에 그 코드가 존재하는 것이 아니라 운영체제 커널의 주소 공간에 코드가 정의된다.

 

그래서 사용자 프로그램이 운영체제 내에 있는 함수를 호출하여 사용하는 것이다.

 


5. 인터럽트

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

 


6. 시스템 콜

모든 프로그램은 자기 자신의 독자적인 주소 공간을 가지고 있으며, 프로그램이 함수호출을 하는 경우 자신의 주소 공간 내에서 호출이 이루어지게된다. 그러나 시스템 콜은 비록 함수호출이기는 하지만 자신의 주소 공간을 거스르는 영역에 존재하는 함수 즉 자신의 프로그램안에 있는 함수가 아닌 운영체제 안에 있는 함수를 호출하는 것을 말한다.

 

시스템 콜은 주소 공간 자체가 다른 곳으로 이동해야 하므로 일반 함수호출과는 다른 방법을 사용한다.

 

대부분의 운영체제는 입출력을 요청한 다음 CPU의 제어권을 다른 프로세스에게 넘겨준다. 다른 프로세스가 CPU에서 명령을 수행하던 중 입출력 작업이 완료되면 디스크 컨트롤러가 CPU에게 인터럽트를 발생시켜 요청된 입출력 작업이 완료되었음을 알리게 된다. 그러면 CPU는 사용자 프로세스의 수행을 잠시 멈추고 인터럽트 처리루틴으로 그 제어권이 넘어간다. 이때 발생한 인터럽트는 하드웨어 인터럽트에 해당되며, 그 처리 내용은 디스크로부터 로컬버퍼로 읽어온 내용을 컴퓨터 내의 메모리로 복사한 후 디스크 입출력을 요청했던 프로세스에게 다시 CPU를 획들할 수 있는 권한을 주는 것이다. 그러면 해당 프로세스는 CPU를 기다리는 큐(queue)에 삽입되고 CPU의 제어권은 다시 인터럽트를 당한 프로세스로 넘어가 하던 작업을 계속 수행하게 된다.

 


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

프로그램이 시작되어 종료될 때까지 다양한 함수호출을 하며 실행되는데, 이를 사용자모드와 커널모드의 실행 상태로 구분지을 수 있다. 프로그램이 사용자 정의함수나 라이브러리 함수를 호출할 때에는 모두의 변경 없이 사용자모드에서의 실행을 지속하게 되고, 시스템 콜을 하는 경우에는 커널모드로 진입해 커널의 주소 공간에 정의된 함수를 실행하게 된다. 시스템 콜의 실행이 끝나면 다시 사용자모드로 복귀해서 시스템 콜 이후의 명령들을 계속 실행한다. 프로그램의 실행이 끝날 때에는 커널모드로 진입해 프로그램을 종료한다.

반응형
Comments