프로그램의 구조와 실행
by Frinee이 글은 반효경 저 - "운영체제와 정보기술의 원리"를 공부하고 정리하여 작성하였습니다.
1. 프로그램의 구조와 인터럽트
- 프로그램이 CPU에서 명령을 수행하기 위해선 해당 명령을 담은 프로그램의 주소 영역이 메모리에 올라가 있어야 함.
- 프로그램의 주소 영역은 코드(code), 데이터(data), 스택(stack) 영역으로 구분됨.
- 코드 영역: 사용자가 작성한 프로그램 함수의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 부분
- 데이터 영역: 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분
- 스택 영역: 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 부분
ex) X 함수를 수행하는 중에 Y 함수를 호출
더보기
- X 함수에서 Y 함수를 호출한 지점을 스택에 저장
- Y 함수가 수행된 후 스택에 저장된 주소 위치(복귀주소)로 돌아와 코드를 계속 수행
- 인터럽트 동작 원리도 함수의 호출과 비슷함
- 인터럽트 시에는 CPU를 빼앗긴 위치는 운영체제가 관리하는 PCB에 저장함.
2. 컴퓨터 시스템의 작동 개요
- CPU는 계산 능력은 빠르지만 어떠한 작업을 수행하는지에 대한 결정은 하진 못한다.
- CPU는 매 시점 메모리의 특정 주소에 존재하는 명령을 실행하고 이때 메모리 주소를 담고 있는 레지스터를 프로그램 카운터(Program Counter)라 부름.
- 컴퓨터 시스템 구성 하드웨어
- 메모리에는 사용자 프로그램들과 운영체제가 같이 올라가 수행
- CPU는 프로그램 카운터가 가르키는 메모리 위치의 프로그램 수행
- 운영체제 부분을 가리키는 경우, 커널모드에서 수행 중
- 사용자 프로그램 위치를 가리키는 경우, 사용자모드에서 수행 중
- CPU가 수행 중인 명령
- 일반명령
- 메모리에서 자료를 읽어와 CPU 에서 계산하고 결과를 메모리에 쓰는 일련의 명령
- 모든 프로그램이 수행할 수 있는 명령
- 특권명령
- 보안이 필요한 명령으로 입출력 장치, 타이머 등 각종 장치에 접근하는 명령
- 항상 운영체제만이 수행할 수 있도록 제한
- 일반명령
- 사용자 프로그램이 실행할 수 없는 특권명령을 필요로 하여 운영체제에게 대행을 요청하는 것을 시스템 콜(System call)이라 한다.
- 시스템 콜을 하게 되면 운영체제는 커널 영역에 정의된 시스템 콜 처리 코드를 수행함.
ex) 디스크 파일 접근
더보기
- CPU가 디스크 컨트롤러에게 데이터를 읽어오라는 명령을 내림
- 디스크 컨트롤러는 데이터를 읽고 저장한 후 인터럽트를 발생
- CPU는 인터럽트를 인지하고 인터럽트 처리루틴을 수행
- CPU는 주변장치의 상태를 지속적으로 파악할 수 없기 때문에 주변장치가 인터럽트를 사용해 CPU에게 서비스를 요청함
- 인터럽트를 발생시키기 위해 주변장치는 인터럽트 라인을 세팅하고 CPU는 명령 수행한 직후 인터럽트 라인을 체크하여 확인
3. 프로그램의 실행
- 프로그램 실행의 의미
- 디스크에 존재하던 실행파일이 메모리에 적재됨
- 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태
- 실행파일은 일부분만 메모리에 올라가고 나머지는 디스크 특정 영역으로 내려가 있다.
- 프로그램의 주소 공간 중 CPU 수행에 필요한 부분만 메모리에 올리고 다른 부분은 스왑 영역에 내려놓는 방식으로 운영
- 각각 프로그램마다 프로세스의 주소 공간을 별도로 갖고 이 공간을 가상메모리 혹은 논리적 메모리라 부름
3.1. 운영체제에서의 프로세스
- 커널의 코드 영역
- CPU, 메모리 등의 자원을 관리하기 위한 부분
- 사용자에게 편리한 인터페이스를 제공하기 위한 부분
- 시스템 콜 및 인터럽트를 처리하기 위한 부분
- 커널의 데이터 영역
- 각종 자원을 관리하기 위한 자료구조가 저장됨
- CPU나 메모리를 위한 자료구조 뿐만 아니라 현재 수행 중인 프로그램을 관리하기 위한 자료구조도 저장됨
- 현재 수행 중인 프로그램을 프로세스라 부르며, 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조인 PCB를 두고 있음
- 시스템 내의 모든 자원을 관리하기 위한 자료구조를 유지하고 있음
- 커널의 스택 영역
- 함수 호출 시의 복귀 주소를 저장하기 위한 용도
- 일반 사용자 프로그램과 달리 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리
- 특권명령 수행 시 저장하는 복귀주소가 커널 내 주소이기 때문에 별도의 저장공간이 필요하기 때문
- 커널은 일종의 공유 코드기 때문에 일관성 유지를 위해 별도의 스택을 둠
3.2. 정리
- 프로그램이 자기 자신의 코드 내에서 함수호출 및 복귀주소를 유지하기 위해 자기 주소 공간 내의 스택을 사용
- 시스템 콜이나 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수가 발생한 경우, 커널 스택을 사용
- CPU 수행 주체가 운영체제로 바뀔 땐, 프로그램 복귀 정보를 PCB에 저장
4. 사용자 프로그램이 사용하는 함수
- 사용자 정의함수
- 프로그래머 본인이 직접 작성한 함수
- 프로그램의 코드 영역에 기계어 명령 형태로 존재
- 라이브러리 함수
- 이미 누군가 작성해 놓은 함수를 호출하여 사용하는 함수 ex) sin(), printf()
- 프로그램의 코드 영역에 기계어 명령 형태로 존재
- 커널함수
- 운영체제 커널의 코드에 정의된 함수
- 시스템 콜 함수 ex) read(), write()
- 인터럽트 처리 함수
- 운영체제 커널의 주소 공간에 코드가 정의
5. 인터럽트
- CPU는 매번 프로그램 카운터가 가리키고 있는 지점의 명령을 수행
- 다음 명령 수행 직전에 인터럽트 라인이 세팅되었는지 확인
- 인터럽트가 발생한 경우 CPU는 현재 수행하던 프로세스를 멈추고 운영체제의 인터럽트 처리루틴으로 이동하여 인터럽트 처리 수행
- 만약 인터럽트 처리 중 인터럽트가 다시 발생한다면?
더보기
- 원칙적으로 데이터의 일관성 유지를 위해 허용하지 않음
- 하지만 더 우선순위가 높거나 CPU를 당장 사용해야 하는 일이 발생할 경우, 예외를 둔다.
6. 시스템 콜
- 자신의 주소 공간을 거스르는 영역에 존재하는 함수를 호출하는 것을 말함. (해줘)
- 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것
- 주소 공간 자체가 이동하기 때문에 일반 함수호출과는 다른 방법을 사용
6.1. (예시) 사용자 프로그램이 CPU에서 명령을 수행하던 중 디스크 파일을 읽어야 할 때
- 사용자 프로그램이 시스템 콜로 커널의 함수를 호출
- 인터럽트 라인을 세팅하는 명령
- CPU는 인터럽트가 발생했는지 점검
- 인터럽트가 발생한 것을 인지하고 프로그램을 멈춘 후 CPU의 제어권을 운영체제에게 넘김
- 설정된 인터럽트 라인에 의해 입출력을 요청하는 인터럽트임을 알고 서비스루틴으로 이동해 입출력 작업 수행
- 디스크를 읽어오는 작업은 많은 시간이 소요되기 때문에 운영체제는 입출력을 요청한 후 CPU의 제어권을 다른 프로세스로 이양함.
- 입출력 과정이 완료되면 디스크 컨트롤러가 CPU에게 인터럽트를 발생시켜 완료를 알림
- CPU는 사용자 프로세스 수행을 멈추고 인터럽트 처리루틴으로 그 제어권이 넘어감
- 이때의 인터럽트는 하드웨어 인터럽트에 해당
- 로컬버퍼로 읽어온 내용을 컴퓨터 내 메모리로 복사한 후 디스크 입출력을 요청했던 프로세스에게 다시 CPU 권한을 주는 것
- 해당 프로세스는 CPU를 기다리는 큐에 삽입되고 CPU는 다시 인터럽트를 당한 프로세스로 넘어가하던 작업을 계속 진행
정리
- 프로그램이 CPU를 할당받고 명령을 수행하다가 중간에 CPU를 뺏기는 경우
- 타이머에 의해 인터럽트 발생: CPU 할당시간 만료 시 발생
- 입출력 요청을 위해 시스템 콜 발생
- 입출력 작업이 시간이 오래 걸리기 때문에 입출력 작업이 완료되기까지 CPU를 다른 프로세스에 이양함.
- 입출력 프로세스는 입출력 요청이 완료되어 인터럽트를 발생시킨 이후 CPU를 얻을 자격을 갖춤
7. 프로세스의 두 가지 실행 상태
- 사용자모드에서의 실행 상태: 자신의 주소 공간에 정의된 코드를 실행하는 것
- 커널모드에서의 실행 상태: 커널의 시스템 콜 함수를 실행하는 것
프로세스의 코드가 시스템 콜이 수행되는 동안 커널이 실행 상태에 있다고 하지 않고
“프로세스가 실행 상태에 있다”라고 말한다.
커널 입장에서는 프로세스가 해야 할 일을 대행하는 것뿐이기 때문에 프로세스가 실행된다고 간주함.
자료
- 운영체제와 정보기술의 원리 (반효경 저, 2020.5)
'[컴퓨터 과학자 스터디] > 운영체제' 카테고리의 다른 글
CPU 스케줄링 (0) | 2024.10.27 |
---|---|
프로세스 관리 (0) | 2024.10.22 |
컴퓨터 시스템의 동작 원리 (0) | 2024.10.15 |
운영체제 개요 (1) | 2024.10.11 |
컴퓨터 및 정보기술의 역사 (1) | 2024.10.11 |
블로그의 정보
프리니의 코드저장소
Frinee