-
운영체제(OS) - 3. 프로그램 구조와 실행Computer Basis/OS 2020. 9. 26. 20:14
1. 프로그램 구조
프로그램이 CPU에서 명령을 수행하려면, 명령을 담은 프로그램의 주소영역이 메모리에 올라가 있어야 한다.
프로그램의 주소영역은 코드(code), 데이터(data), 스택(stack) 영역으로 구분된다
함수호출에 의한 복귀 주소는 각 프로그램의 주소공간 중 스택영역에 보관
인터럽트에 의한 복귀 주소는 프로세스 제어블록(PCB)에 저장
프로그램의 주소영역 # 코드(Code)영역
그림에 text라고 표시된 영역
프로그램 함수들의 코드가 기계어로 변환되어 저장되는 부분
컴파일 타임에 확정되는 영역
Read-Only 로 지정되어, 변경할 수 없다.
# 데이터(Data)영역
전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장됨
초기화 된 데이터들이 저장되는 영역
# BSS(Block Stated Symbol)영역
초기화 되지않은 데이터들이 저장되는 영역
# 스택(Stack)영역
후위선출(Last-In, First-Out) 방식으로 작동하는 영역
함수 호출시, 호출된 함수의 매개변수, 지역변수, 리턴값, 수행수 복귀할 주소 및 데이터를 임시로 저장하는데 사용되는 공간
함수 실행시 후위선출 방식으로 스택영역이 차차 차오르면서 나중엔 결국 비게된다.
컴파일 타임에 크기가 확정되기 때문에, 스택영역을 초과하는 함수(무분별한 재귀함수)를 호출시 Stack Overflow 오류를 발생시킨다.
명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정 한다.
# 힙(Heap) 영역 (동적메모리)
런타임에 결정되는 영역
동적인 데이터를 사용할때 사용하게되는 메모리영역 (C언어의 malloc 류, C+의 new() )
메모리 주소 값에 의해서만 참조되고 사용되는 영역
2. 컴퓨터 시스템 작동개요
CPU는 매 시점 메모리의 특정 주소에 존재하는 명령을 하나씩 읽어와 그대로 실행함
CPU는 PC가 가리키는 메모리 위치의 명령을 처리하게 됨
CPU는 매번 명령을 수행한 직후 인터럽트 라인 세팅유무를 체크
(즉, CPU는 PC가 가리키는 메모리의 명령을 한줄씩 처리하며 인터럽트를 지속적으로 확인한다)
# 프로그램 카운터(PC: Program Counter)
CPU가 수행해야 할 메모리주소를 담고 있는 레지스터
조건문, 반복문, 함수호출 등에 의한 주소이동이 없을 경우
PC는 항상 바로 다음 명령을 가리케 되어 코드의 순차적으로 수행시킨다
3. 프로그램의 실행
# 프로그램 실행(Program Execution)
디스크에 존재하던 실행파일이 메모리에 적재
프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태
실행파일의 일부분은 메모리에, 나머지는 디스크의 스왑영역에 적재
(프로그램의 주소공간은 항상 메모리에 적재되는것인가?)
현재 수행 중인 프로그램을 프로세스(process)라고 부름
# 운영체제 입장
커널도 또한 프로그램주소공간(코드, 데이터, 스택영역)을 가지고 있음
커널의 Data영역에는 각 프로세스의 상태, CPU 사용정보, 메모리 사용정보등을 유지하는 자료구조인 PCB(process control block)이 있음
커널의 Stack영역은 일반프로그램의 스택과 달리 현재 수행중인 프로세스마다 별도의 스택을 두어 관리
커널 내에서 이루어지는 함수호출은 직전에 CPU를 가지고 있던 프로세스의 커널스택을 사용
PCB에 직전에 수행되던 프로그램의 복귀정보가 저장됨 (커널의 스택영역이 아님, 커널의 데이터 영역)
(요점) 각 프로세스마다 PCB(data영역)와 Stack 영역이 존재
# 각 프로세스마다의 스택이 없고, 각 프로세스마다의 PCB가 없을 경우 발생할 수 있는 사태
더보기# 예시 (이 예시는 검증된 예시가 아닙니다... 제 뇌피셜이며, 더욱 공부해서 확실한 예시를 추후에 업데이트 하겠습니다)
1. 프로그램 A의 주소 - 커널 내 복귀주소 - 커널의 func1() [위 가정에서의 커널스택]
2. func1()의 종료 -> 커널 내 복귀주소로 회귀 -> 커널 내 복귀주소가 작업을 끝났음을 CPU에게 보고 -> 사용자모드 전환
3. 우선순위가 높은 프로그램이 CPU 제어권 획득 -> 프로그램 A가 다시 제어권을 얻어도 코드 진행주소가 없으니 문제, B가 제어권을 얻으면 A주소 위에 스택이 쌓이는 문제
4. 그렇다고 커널의 함수(fun1()) 을 하드웨어 인터럽트냐, 시스템콜이냐 에 따라 두가지 버전으로 만들어 시스템콜일시 스택의 밑단 주소로 이동으로 만들기엔 효용성 문제...
# 사용자 프로세스의 두 가지 실행 상태에 대한 정의
커널모드에서 실행되더라도 커널이 실행상태에 있다고 말하지 않고, 프로세스가 커널모드에서 실행중이라고 한다.
즉, 커널모드에서 실행되더라도 프로세스가 실행중이라고 이야기한다.
1. 사용자모드에서의 실행상태(user mode running)
사용자정의 함수 또는 라이브러리 함수 호출시
CPU는 사용자모드에서 수행중
2. 커널모드에서의 실행상태(kernal mode running)
시스템 콜 호출 시
CPU는 커널모드에서 수행중
원칙적으로 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용치 않는다. (데이터무결성을 위해)
하지만, 중요도가 더높은 인터럽트가 발생될 시 우선적으로 처리할 수 있게 세팅한다.
728x90'Computer Basis > OS' 카테고리의 다른 글
운영체제(OS) - 5. CPU 스케줄링 (0) 2020.10.06 운영체제(OS) - 4. 프로세스 관리 (0) 2020.10.06 운영체제(OS) - 2. 컴퓨터 시스템 동작원리 (0) 2020.09.24 운영체제(OS) - 1. 운영체제 자원관리 개요(CPU & 메모리 관리) (0) 2020.09.23 운영체제(OS) 기본지식 - 2. MS Windows & Unix 개요 및 비교 (0) 2020.09.22