********************************
##이 글은 제가 공부하고 있는 책을 요약해놓은 것이므로 본문 내용만 봐선 이해가 어려울 수 있습니다.
목차
1. 프로그램 구조
2. 컴퓨터 시스템의 작동 개요
3. 프로그램의 실행
4. 사용자 프로그램이 사용하는 함수
5. 인터럽트
6. 시스템 콜
7. 프로세스의 두가지 실행 상태
********************************
1. 프로그램 구조
프로그램이 CPU에서 명령을 수행하려면 해당 명령을 담은 프로그램의 주소영역이 메모리에 올라가 있어야 함. 프로그램 주소영역은 코드, 데이터, 스택으로 구분됨.
데이터 영역 - 전역 변수 등 프로그램이 사용하는 데이터 저장
스택 영역 - 함수 수행을 마치고 복귀할 주소 및 데이터를 임시저장. 메인함수가 다른 함수를 호출하면 CPU가 메인함수의 코드를 수행하다가 다른 함수 위치로 점프해 함수를 호출. 그 함수 수행을 완료하고 스택에 저장되어있던 지점으로 돌아옴.
인터럽트의 동작 원리도 함수 호출과 비슷. 프로그램 내에서 발생되는 함수호출에 필요한 복귀 주소는 각 프로그램의 주소 공간 스택영역에 보관. 반면 인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 프로세스 제어블록(PCB)에 저장.
2. 컴퓨터 시스템의 작동 개요
CPU는 매 시점 메모리의 특정 주소에 존재하는 명령을 하나씩 읽어와 그대로 실행할 뿐이다. 이때 CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터를 프로그램 카운터(Program Counter)라고 함. CPU는 매 프로그램 카운터가 가리키는 메모리 위치의 명령을 처리.
3. 프로그램의 실행
프로그램이 실행되고 있다의 의미 - 1. 디스크에 존재하던 실행파일이 메모리에 적재된다는 의미 2. 프로그램이 CPU를 할당받고 명령을 수행
프로세스의 주소 공간은 코드, 데이터, 스택 등으로 구성된다. 각각의 프로그램마다 이러한 주소 공간을 별도로 가지며, 프로그램마다 독자적으로 존재하는 이와 같은 주소 공간을 가상메모리(virtual memory) 또는 논리적메모리라고 부름.
운영체제 역시 하나의 프로그램으로 코드, 데이터, 스택의 구성을 가짐.
커널의 코드- CPU, 메모리 등의 자원을 관리하기 위한 부분과 사용자에게 편리한 인터페이스를 제공하는 부분으로 이루어짐. 이밖에 시스템 콜 및 인터럽트를 처리하기 위한 부분을 포함.
커널의 데이터 - 각종 자원을 관리하기 위한 자료구조 저장. 현재 수행중인 프로그램을 프로세스라고 하는데, 데이터 영역 내에 각 프로세스의 상태, CPU 사용정보, 메모리 사용정보 등을 유지하기 위한 자료구조인 PCB를 두고 있다.
커널의 스택 - 함수호출 복귀 주소를 저장. 커널의 스택은 사용자프로그램의 스택과 달리 현재 수행중인 프로세스마다 별도의 스택을 두어 관리. 프로세스가 함수 호출할 때 자기 주소영역 내부에 정의된 함수를 호출하면 자신의 스택에 복귀 주소를 저장하지만, 프로세스가 특권명령을 수행하려고 커널에 정의된 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출하는 경우 그 복귀주소는 커널 내의 주소가 되어 사용자 프로그램의 스택과는 별도의 저장공간이 필요하게 되기 때문.
유의할 점은 프로그램 내 함수호출 시 해당 프로그램 스택에 복귀주소를 저장하지만, 시스템콜이나 인터럽트로 인해 CPU의 수행자체가 운영체제로 바뀌는 순간 복귀 정보를 스택이 아닌 PCB에 저장.
4. 사용자 프로그램이 사용하는 함수
사용자 정의함수 - 직접 작성한 함수
라이브러리 함수 - 이미 누군가 작성해놓은 함수
위의 두 함수는 프로그램이 실행될때 해당 프로세스의 주소 공간에 포함, 또한 함수호출 시에도 자신의 주소 공간의 스택을 사용.
커널함수 - 운영체제 커널의 코드에 정의된 함수. 커널함수에는 시스템 콜 함수, 인터럽트 처리 함수가 있음. 커널함수는 운영체제 커널의 주소 공간에 코드가 정의됨. 시스템 콜 함수로는 read()함수와 write()함수가 정의.
일반함수는 사용자 프로그램 내에 존재하는 코드를 실행하는 것이고 시스템 콜은 운영체제에 CPU를 넘겨서 실행하는 것.
5. 인터럽트
CPU는 매번 프로그램 카운터가 가리키고 있는 지점을 하나씩 수행하다가, 다음 명령을 수행하기 직전마다 인터럽트 라인이 세팅되었는지 체크하여 인터럽트가 발생했으면 CPU는 현재 프로세스를 멈추고 운영체제의 인터럽트 루틴으로 이동하여 인터럽트 처리를 수행. 인터럽트 처리 중 또 다른 인터럽트가 발생하는 것이 원칙적으론 허용하지 않는다. 하지만 예외가 있다. 더 높은 우선순위의 인터럽트 발생시 현재 처리중인 인터럽트 수행 지점을 저장하고 새 인터럽트를 처리.
6. 시스템 콜
모든 프로그램은 자기 자신의 독자적인 주소 공간을 갖고 있음. 시스템 콜은 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것. 방법은 프로그램 자신이 인터럽트 라인에 인터럽트를 직접 세팅하는 명령을 통해 이루어짐. 이는 프로그램이 스스로 인터럽트 라인을 세팅한다는 점만 다를 뿐 일반적인 인터럽트의 발생과 동일한 방법이다. (참고 : 일반적인 인터럽트는 프로그램이 아닌 하드웨어/소프트웨어 장치가 라인을 세팅함)
<사용 예시: 디스크의 파일 입출력이 이루어지는 과정>
사용자프로그램이 CPU에서 명령 수행 중 디스크 파일을 읽어와야할 경우 시스템 콜로 커널의 함수를 호출- 입출력함수 호출이 자신의 주소 공간에서 이루어질 수 없기 때문에 사용자프로그램은 CPU제어권을 운영체제에 이양함(인터럽트 라인을 세팅하는 명령을 통해)- 인터럽트 라인이 세팅되면 CPU는 다음 명령 수행전 인터럽트 발생을 점검하고 이 과정에서 인터럽트를 인지하여 현재 수행 프로그램을 잠시 멈춘 후 CPU의 제어권을 운영체제로 이양시킴- 운영체제는 인터럽트 라인을 통해 인터럽트를 인지하여 해당 서비스 루틴으로 이동해 입출력 작업을 수행-이과정에서 CPU는 디스크 컨트롤러에게 파일을 읽어오라는 명령을 하게 됨.
프로그램이 CPU를 할당받고 명령수행을 하다가 중간에 CPU를 빼앗기는 경우는 두가지 : 타이머에 의한 인터럽트발생, 시스템콜
7. 프로세스의 두가지 실행 상태
프로세스 A가 CPU에서 실행되고 있다- 1. 자신의 주소 공간에 정의된 코드 실행 2. 커널의 시스템 콜 함수를 실행
전자는 사용자모드에서의 실행상태라 하고 후자를 커널모드에서의 실행상태라 함.
이때 주의할 점은 비록 시스템 콜을 통해 실행되는 것이 프로세스 A의 코드가 아닌 커널의 코드지만, 이를 커널이 실행 상태에 있다고 하지 않고 프로세스 A가 실행상태에 있다고 한다는 것. 이유는 시스템 콜의 역할은 대행이기 때문. 정확히는 프로세스 A가 커널모드에서 실행중이라고 이야기한다.
정리하자면 프로그램이 시작되어 종료될 동안 다양한 함수호출을 하는데, 사용자모드와 커널모드의 실행 상태로 구분 지을 수 있음.
댓글