1. 프로세스 컨텍스트
프로세스가 실행되는 데 필요한 컴퓨터 내의 정보 및 구성 요소 자원 집합. 유저 컨텍스트와 시스템 컨텍스트로 세분화된다.
- 유저 컨텍스트 프로그램 작성자(사람)에 의해 결정되는 컨텍스트
- 프로그램을 구성하는 코드, 데이터, User Stack의 집합을 지칭한다.
- 시스템 컨텍스트 운영체제에 의해 결정되는 컨텍스트
- 커널 코드 내의 함수 호출을 위한 커널 스택 (Kernel Stack)
- 프로세스 관련 정보를 저장하는 자료구조인 PCB로 구성되어 있다.
- fork() (하위 프로세스를 생성하는 System Call)을 통해 생성된 하위 프로세스의 식별 ID를 Pid에 할당한다. 이에 유효한 값이 할당된 경우 Delay를 주어 Pid의 스케쥴링 (CPU 할당)을 기다린다.
- 하위 프로세스는 부모 프로세스의 PCB 값을 그대로 할당받는다. 그러나 Folk()를 실행하지 않기 때문에 자식 프로세스 입장에서는 Pid에 0을 할당하여 전역 변수 값을 조정할 수 있게 되는 것이다.
- 최종 출력에서 부모 프로세스는 기존 변수 값 6과 88을, 자식 프로세스는 7과 89를 반환하게 된다.
- 위와 같은 과정으로 생성된 Header, Code, Data, Bss, Stack으로 구성된 바이너리 형식의 실행 파일 a.out을 가상 주소 공간 (Virtual Address Space)에 저장한다. 번지별로 나누어 자리 잡게 되는데, 이 주소 정보 또한 PCB에 저장된다.
- 가상 주소 공간은 32비트로 4G의 용량을 갖는다. 0 ~ 3G 번지는 유저에 의해 생성된 코드의 컨텍스트가, 3G ~ 4G 번지에는 시스템 프로세스인 커널이 위치한다. 앞서 사용한 Folk() 등의 시스템콜 함수가 이 커널에 저장되어 호출 및 사용된다.
- 기본적으로 가상 주소공간은 보조기억장치에 존재하며, 이 상태를 new 상태라고 한다. new 상태에서 프로세스가 메인 메모리를 할당받으면 복사되어 메인 메모리 상에서 프로그램이 실행되게 된다.
2. 스택
함수 호출 및 실행 과정에서 필요한 정보를 저장하는 임시 주소 공간
유저 스택 (User Stack)
- 유저 컨텍스트
- 함수 호출 당시 CPU 내의 레지스터 값을 저장하는 데 이용
- 함수 처리를 완료하고 되돌아 와 연이어 코드를 처리할 수 있게끔 하기 위해 존재
- 다중 함수에서 함수가 실행될 때마다 User Stack Layer가 쌓이게 되는데, 상위 함수가 자신을 호출한 상태에서의 CPU 레지스터 값을 스택에 저장한다. (용이한 복귀를 위해) 그 밖에도 변경되거나 추가되는 변수 정보를 저장한다.
커널 스택 (Kernel Stack)
- 시스템 컨텍스트
- 커널 내부의 운영체제 개발자가 구현해 놓은 함수들을 호출할 때의 인지 정보를 저장하는 공간
- 인자, 전역변수, 레지스터 값 등을 저장.
- 저장하는 함수의 종류만 다를 뿐, 돌아가는 원리와 구조는 유저 스택과 동일하다.
3. 프로세스 제어
프로세스 모드
- 각 프로세스의 가상 주소 공간에는 메인 메모리의 커널 정보가 맵핑되어 들어가 있다. (정확히는 주소 연결)
- 프로그래밍한 코드를 실행하는 User Mode와 다른 프로세스 실행을 위해 커널 내부로 이동하는 System Mode가 번갈아 실행된다. 이와 같이 프로세스 모드가 변경되는 것을 Mode Change라 한다. 일반 사용자 자격과 시스템 관리자 자격을 번갈아 할당받는 것이다.
프로세스 생성 절차
- 프로세스에 대한 정보를 갖고 있는 PCB 데이터 구조 생성
- 하위 프로세스에 프로세스 식별자 (PID) 할당 - 상위 프로세스 레지스터의 대부분을 물려받음
- 운영체제가 모든 프로세스를 관리할 수 있게 신규 PCB를 기존 PCB와 연동 (+형제 관계를 갖는 PCB)
- 하위 프로세스의 유저 컨텍스트 생성 - 메모리 내의 Code 정보는 공유하며, Data와 Stack은 복사하여 가져와 별도의 영역을 생성한다.
- 하위 프로세스 PCB를 Ready State (Run_Queue)에 할당 - 타 프로세스와 Linked List 연결
- 하위 프로세스 PID 값을 상위 프로세스에 리턴. 위의 User Part Context 에서도 언급한 바 있음.
- Copy on Write (COW) 4번 절차와 같이 상위 프로세스의 Data와 Stack을 가져와 별도의 영역으로 생성하는데, 효율적인 용량 관리를 위하여 기존에는 상위 프로세스의 Data/Stack을 가리키다 변경이 일어나는 경우 Copy를 해준다는 개념이다.
4. 프로세스 스위치
Context Change라고도 하며, 프로그램 자체를 다른 프로그램으로 바꾸는 작업. 즉 프로세스 간의 변동이 발생하는 것. User Mode와 System Mode를 오가는 Mode Change와 혼동에 유의할 것. Mode Change는 한 프로세스 내에서 사용자의 자격이 바뀌는 방식으로 이루어진다.
프로세스 스위치가 발생하는 경우
- 프로세스가 처리 완료된 경우
- 시스템콜에 의해 Block 상태로 이동한 경우. 다음 입력이 있기까지는 더 이상 CPU를 갖고 있을 이유가 없기 때문에.
- Time Slice가 만료되었을 때 : CPU를 사용할 수 있게 할당된 시간을 전부 사용한 경우
- I/O Interrupt가 발생한 경우 : 더 우선순위가 높은 프로세스가 대기상태에서 깨어나 밀리게 되었을 때
프로세스 스위치 절차
- 프로그램 카운터 및 레지스터 값을 저장하는 Context Save
- PCB 상태값 갱신
- 중단된 PCB를 적절한 Que(Ready Que / Event Que)로 이동
- 실행할 다음 프로세스를 선정 (By Process Scheduling)
- 선정된 프로세스의 PCB 갱신
- 메모리 데이터 구조 갱신과 Context Restore