강의 링크 : http://www.kocw.net/home/cview.do?mty=p&kemId=1046323
프로세스란 CPU 에서 실행 중인 프로그램을 의미한다.
프로세스는 다른 프로세스 , CPU와 독립적인 주소 공간 (가상 메모리)
를 가진다.
CPU 는 프로그램 카운터가 가리키고 있는 메모리 위치에서 명령어를 가져와 실행하고 각종 데이터들을 레지스터에 저장한다.
(프로그램 카운터가 가리키고 있는 메모리 위치에는 프로세스의 코드가 존재한다.)
이 때 프로그램 카운터가 어디를 가리키고 있는지 등을 알기 위해선 프로세스의 문맥이 중요한 역할을 한다.
코드의 어느 부분을 가리키고 있는가
현재 어느 내용을 어디까지 쌓고 있는가 (stack)
변수들의 값은 무엇이고 레지스터에 담긴 값은 무엇인가
해당 내용들을 모두 프로세스의 문맥이라고 한다.
프로세스의 문맥은 3가지로 표현 할 수 있다.
레지스터
: CPU 내부에 있는 소규모의 고속 메모리로 다음과 같은 정보를 담고 있다.
program counter
)다음에 실행할 명령어의 주소를 가리키는 레지스터이다.
CPU 는 프로그램 카운터가 가리키는 주소에 있는 명령어를 시행한다.
가리키고 있는 주소는 현재 실행중인 프로세스의
code
메모리이다.
instruction register
)현재 실행중인 명령어가 저장되는 레지스터이다.
프로그램 카운터에서 읽어온 명령어가 이 레지스터에 저장되고 CPU 는 이 명령어를 해석하고 실행한다.
Data Register
)임시적으로 저장할 데이터가 담기는 레지스터이다.
연산 중간 결과나 계산된 값 등이 여기에 저장된다.
CPU 의 데이터 레지스터와 프로세스 가상 메모리의 데이터 영역의 차이
프로세스 가상 메모리의 데이터 영역에는 코드에 존재하는 전역 변수와 정적 변수들이 초기화 된 채로 저장되어 있다.
CPU 데이터 레지스터는 프로세스 가상 메모리의 코드 영역을 실행하며 계산된 연산값이나 결과값들이 저장되어 있다. 따라서 데이터 레지스터에는 주로 CPU 가 직접 조작하거나 계산한 데이터가 일시적으로 저장된다.예시를 통해 이해해보기
어떤 프로세스에서 A = 1 + 2 + 3 코드를 실행하였다고 해보자
그럼 1 + 2 연산의 중간 결과 값이데이터 레지스터에 저장된다.
데이터 레지스터
에 저장된 3을 가져와3 + 3
의 결과값인 6이데이터 레지스터에 저장된다.
데이터 레지스터
에 저장된 결과값6
이A
에 저장되며,A
는프로세스 가상 메모리 내 데이터
영역에 저장된다.
데이터 레지스터
에 저장되어있는 중간 결과값들은 사라짐
Adress Register
)주소 값을 저장하는 레지스터로 메모리의 특정 위치를 가리키는데 사용된다.
주소 레지스터에 대한 자세한 설명
주소 레지스터는 메모리의 특정 위치를 가리키는데 사용된다. 다음과 같은 목적으로 사용된다
1. 메모리 주소 지정
주소 레지스터에 저장된 값은 CPU 가 접근하려는 메모리의 위치를 나타낸다. 연산이 수행 될 때 CPU 는 주소 레지스터의 값에 따라 메모리의 특정 위치에 접근한다.
2. 프로그램 카우터 갱신
일부 아키텍쳐에서는 프로그램 카운터 값이 주소 레지스터에 저장 될 수 있다. 프로그램 카운터는 다음에 실행할 명령어의 주소를 가리키는 역할을 한다.
3. 점프 및 분기 명령어 처리
주소 레지스터는 조건부 또는 무조건적인 점프와 분기 명령어에서 사용된다.
이동하고자 하는 코드 영역의 주소가 저장되어 있다.
주소 레지스터와 가상 메모리의 스택의 차이
주소 레지스터
CPU의 주소 레지스터는 프로그램 카운터가 가리키고 있는 주소를 저장한다.
가상 메모리의 스택
프로세스 가상 메모리 스택에는 함수 호출 및 반환과 관련된 정보를 관리 하는데 사용된다.
프로세스의 코드 실행에 따라 쌓이는 다양한 함수들이 스택 상태로 저장되고, 완료되면 반환된다.
Status Register
)CPU의 현재 상태와 특정 조건을 나타내는 레지스터이다.
예를 들어 조건 코드 , 오버플로우 플래그 등이 여기에 저장된다.
프로세스의 코드 영역은 실행 중인 프로그램의 명령어들이 저장된 곳이다.
프로그램의 기계어 명렁어들이 메모리에 위치하며 CPU 가 이 영역에서 명령어를 가져와 실행한다
CPU 의 프로그램 카운터가 코드를 가리키면 해당 코드를 실행한다.
데이터 영역에는 초기화된 전역 변수, 정적 변수, 프로그램의 시작 시에 초기화 되는 데이터들이 저장되며 코드가 진행되며 변수의 값들이 변경 되기도 한다.
함수 호출과 관련된 정보를 저장하는데 사용된다. 함수가 호출 될 때 로컬 변수, 복귀 주소, 매개 변수등이 스택에 저장되며 함수가 종료되면 스택 프레임이 제거된다. 스택은 후임 선출 구조를 가지며 스택 포인터가 현재 스택의 상단을 가리킨다.
프로세스의 문맥을 알기 위해선 현재 CPU 가 이 프로세스를 어떻게 실행하고 있느냐를 알기 위한 하드웨어 문맥
과 프로세스의 값들과 코드가 담긴 소프트웨어 문맥
도 알아야 하지만
내 운영체제가 이 프로세스를 어떻게 평가하고 있느냐도 알아야 한다.
프로세스는 time intrupt , system call
등으로 인해서 프로세스가 실행 도중 커널에게 CPU 가 넘어 가기도 하고 돌아오기도 하기 때문이다.
PCB 는 프로세스에 대한 중요한 정보를 저장하는 자료구조이다.
각 프로세스마다 하나의 PCB 가 할당되며 이는 프로세스의 상태, 레지스터 값, 프로세스 식별자, 우선순위, 스케줄링 정보, 메모리 관리 등을 포함한다.
PCB는 프로세스가 일시 중단 되거나 중단된 후에도 상태를 저장하고 다시 실행 될 때 그 상태를 복원하는데 사용된다.
PCB 의 역할을 정확히 알기 위해선 디스패치와 문맥 교환에 대해서 이해를 먼저 해야 한다.
문맥 교환 (
Context swich
)
- 현재 CPU가 실행중인 프로세스에서 다른 프로세스를 실행하게 될 때 (시스템콜이나 타임 인터럽트 등 다양한 이유로 인해) 현재 프로세스의 상태를
PCB
에 저장한다.\- 이후 다른 프로세스가 진행중이던 상태를 해당 프로세스의
PCB
에서 가져와 다른 프로세스를 진행한다.- 이전에 실행했던 프로세스가 다시 실행 될 차례가 되면 이전에 저장한
PCB
에 있는 내용을 가져와 해당 프로세스를 다시 실행한다.
'시스템콜이나 인터럽트' 로 인해서 CPU 가 운영체제에게 넘어간 것은 프로세스가 커널 모드에서 실행중이라고 한다. 첫 번째 예시를 보면 프로세스 A 는 유저 모드에서 커널 모드에서 실행하다 다시 유저모드로 변경된 것이기 때문에 문맥교환이 아니다.
두 번째 예시는 프로세스가 변경되었기 때문에 문맥 교환이 일어난 것이다. 두 번재 예시는 부담이 큰 이유는 캐쉬메모리등을 모두 지워버려야 하기 때문에 부담이 크다.
디스패치 (
Dispatch
)프로세스가 실행 대기 상태에서 실행 상태로 변경될 때 , PCB 에 저장된 정보를 활용하여 해당 프로세스의 상태를 복원한다.
그러니 PCB 는 CPU 가 한 프로세스만을 사용하는 것이 아닌, 여러 프로세스를 time-sharing 형태로 이용하게 용이하게 만드는 핵심적인 자료구조이다. 프로세스가 CPU 를 할당 받을 때는 PCB 에서 프로세스의 상태, 레지스터 값, 가상 메모리 정보등을 받아 빠르게 실행하고 CPU 를 반환 할 때는 현재까지 진행되었던 프로세스의 상태, 레지스터 값, 가상 메모리 정보들을 PCB에 저장한다.
커널 스택은 각 프로세스 마다 운영체제 커널에서 사용하는 스택으로, 커널 모드에서 수행되는 필요한 데이터를 저장하는데 사용된다.
커널 모드 : CPU 를 운영체제가 가지고 있는 상태
커널 모두에서의 스택
임시 데이터 저장
콘텍스트 스위치에서의 역할
커널 호출 시 사용
프로세스는 상태가 변경되며 수행된다.
Ready
는 CPU가 주어지면 당장 instruction 을 시행 할 수 있는 상태이며 Bloked
상태는 CPU 가 주어져도 instruction
을 수행 할 수 없는 상태를 의미한다.
Suspended
는 외부적인 이유나 중기 스케줄러에 의해 프로세스가 메모리에서 통째로 swap
된 상태를 의미한다.
프로세스가 실행되기 위해 생성되고, 준비된 상태에서 작동이 된다.
작동되며 time sharing 으로 인해 ready <-> running 상태를 반복하거나
I/O event 등으로 인해 Bloked 되었다가 ready -> running 을 가거나 그런다.
프로세스별로 어떻게 실행할지를 결정하는 것을 스케줄러라고 한다.
장기 스케줄러 or job scheduler
는 프로세스에 메모리를 주는 스케줄러이다. 프로세스가 실행 되었을 때 어떤 프로세스를 레디 큐에 보낼지를 결정한다.
멀티 프로그래밍을 제어 한다는 것은 메모리에 몇 개의 프로그램이 올라가있는지를 제어한다는 뜻이다.
시분할 시스템에서는 보통 장기 스케줄러가 없다. 무조건 레디큐로 들어가긴 한다.
CPU 스케줄러
는 단기 스케줄러 (short term scheduler)
라고 불리기도 한다.
다음 어떤 프로세스를 running 시킬지를 결정한다.
중기 스케줄러 or Swapper
는 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아낸다.
메모리에 불필요한 프로세스가 많이 올라가있으면 성능이 저하되니까 !
시분할 시스템에서는 중기 스케줄러를 이용하여 degree of multiprogramming
을 제어한다.
==> 중기 스케줄러
에 의해 메모리에서 디스크로 쫒겨난 프로세스의 상태는 suspended
이다.