프로세스와 스레드 둘을 비교하기 앞서 둘에 대한 간단한 정리를 해보려한다.
프로세스
프로세스는 메모리에 올라가 컴퓨터에서 실행되고 있는 프로그램을 의미하며,
CPU 스케줄링의 대상이 되는 작업(=Task) 이라는 용어와 같은 의미로 쓰인다.
프로세스의 작업을 완료하기 위해서는 다음과 같은 자원(resource)이 필요하다.
- 메모리
- CPU
- 파일
- 입출력 장치
*참고
프로세스의 구조는 메모리 구조를 참고하면 된다.
프로세스의 상태
생성 상태(create)
프로세스가 생성된 상태를 의미하며 fork() 또는 exec() 함수를 통해 생성한다.
이때 PCB가 할당된다.
운영체제에서 프로세스 생성 후 메모리 공간이 여유로운지 확인하고, 공간이 충분하면 프로세스 주소 공간을 할당한 후 프로세스를 준비 상태로 바꿔준다.
메모리 공간이 충분하지 않은 경우 보류 준비 상태로 바꾼다.
준비 상태(ready)
메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기
다중 프로그래밍(여러 프로세스가 메모리에 적재)에서는 여러 준비상태의 프로세스를 위해 큐, 리스트가 사용된다.
운영체제가 준비 상태의 여러 프로세스 중 CPU에 할당되는 순서를 정하는 것을 CPU 스케줄링이라고 한다.
실행 상태(running)
준비 상태 프로세스가 CPU 할당 받으면, 실행 상태로 바뀌게 되고, CPU에서 해당 프로세스를 실행한다.
실행 상태의 프로세스는 CPU 스케줄링 정책에 의해 CPU를 뺏길 수 도 있는데 이때 뺏긴 프로세스는 준비 상태로 바뀌게 된다.
실행 상태인 프로세스가 입출력이 필요해 시스템 콜(System Call)을 하게 되면 입출력이 종료될 때 까지 대기 상태로 바뀌게 된다.
대기 상태
실행 상태에 있는 프로세스에서 입출력을 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 반납하고 요청한 일이 완료될 때까지 대기 상태가 된다.
요청한 일이 완료되면 대기 상태의 프로세스는 다시 준비 상태로 들어간다.
종료 상태(terminated)
메모리와 CPU 소유권을 모두 놓고 가는 상태이다.
자연스럽게 종료되는 경우도 있지만 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료로 종료되는 것도 있다.
보류 상태
프로세스가 메모리 공간을 빼앗기고 보조기억장치로 나가는 경우를 말한다.
나가는 경우를 Swapped Out이라고 하고, 나중에 다시 메모리로 들어오면 Swapped In이라고 한다. 그래서 이를 스와핑이라고 한다.
보류 준비 상태
생성된 프로세스가 바로 메모리를 받지 못하거나, 준비 또는 실행 상태의 프로세스가 메모리를 잃게 될 때의 상태이다.
보류 대기 상태
대기 상태에서 메모리 공간을 잃은 상태이다.
PCB(프로세스 제어 블록)
운영체제에서 프로세스의 상태 정보를 저장하는 구조체이다.
프로세스가 생성되면 운영체제는 해당 PCB를 생성하는데 메인 메모리에 저장되다가 프로세스가 완료되면 PCB도 함께 제거된다.
프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리된다.
PCB의 구조
- 프로세스 ID (Process Id)
- 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
- 프로세스 스케줄링 상태(Process state)
- ‘준비’, ‘일시중단’ 등 프로세스가 CPU에 대한 쇼유권을 얻은 이후의 상태
- 프로세스 권한
- 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
- 프로세스 우선순위(Process Priority)
- 프로세스의 실행 순서를 결정하는 우선순위
- 프로그램 카운터(Program Counter)
- 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
- CPU 레지스터(Cpu Register)
- 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
- CPU 스케줄링 정보(Scheduling info)
- CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
- 계정 정보(Accounting Info)
- 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- I/O 상태 정보
- 프로세스에 할당된 I/O 디바이스 목록
Program Counter와 Stack Pointer
PCB 중에서도 Program Counter와 Stack Pointer는 프로세스를 처리하기 위한 2가지 레지스터인데, 프로세스의 실행 및 메모리 관리와 관련된 역할을 한다.
PC(Program Counter)
- 실행 할 명령어의 주소를 가리키는 레지스터이다.
- 코드는 한 줄 씩 내려가면서 실행되는데, 한 줄을 처리 후 다음 실행할 코드가 어딘지 알려줘야 그 다음 코드도 실행이 된다.
- 그렇기 때문에 코드를 순차적으로 실행하면서 PC값을 증가시켜 다음에 실행할 명령어를 가리킨다.
- PC의 경우 프로세스가 중단되거나 인터럽트가 발생했을 때 현재 실행 중이던 명령어의 주소를 저장하고, 다시 프로세스가 실행되었을 때 주소를 찾아 재실행 시킬 수 있도록 한다.
SP(Stack Pointer)
- 현재 실행 중인 프로세스의 스택의 최상단을 가리키는 레지스터이다.
- 가장 최근에 호출한 함수 순서대로 스택에 쌓이게 되며, 이렇게 쌓아나갈 경우 가장 최근에 호출된 함수의 위치를 알고 있으면, 어디까지 함수가 호출되어 있는지 알 수가 있다.
- 함수 호출 시에는 SP가 감소하여 새로운 스택 프레임을 생성하고, 함수가 반환되면 SP가 증가하여 이전 스택 프레임으로 되돌아 간다.
컨텍스트 스위칭(Context Switching)
OS의 커널에 의해 CPU에 실행할 프로세스를 교체하는 기술이다.
한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생한다.
컴퓨터에 많은 프로세스가 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문임.
컨텍스트 스위칭 과정
컨텍스트 스위칭이 발생하면서 현재 실행중이였던 프로세스의 PC, SP 정보들을 현재 PCB에 저장을 한다.
그 뒤 스위칭이 발생하면서 바뀔 PCB를 로드하고 인터럽트 처리를 진행한 후에
처리를 진행한 PCB에 다시 정보들을 저장하고
전에 실행하던 PCB를 다시 불러온다.
컨텍스트 스위칭 단점
1. 위에 그림에서 보듯이 유휴시간(idle)이 지속적으로 발생한다. 이때 CPU는 작업을 하지 못하게 된다...
2. 캐시 오염이 발생한다.
컨텍스트 스위칭 발생시, 이미 캐시에 저장해놓은 데이터나 값을 사용하지 못하게 된다. (예전 프로세스에서 저장해놓은 데이터이니까?)
'Basic > 운영체제' 카테고리의 다른 글
[OS] 멀티 쓰레드와 동기화 (0) | 2024.06.19 |
---|---|
[OS] 쓰레드 (0) | 2024.06.13 |
[OS] 메모리 구조 (0) | 2024.06.10 |
[OS] 커널(Kernel)이란? (1) | 2024.05.27 |
[OS] 운영체제 개요 (0) | 2024.01.10 |