해당 포스팅은
https://www.youtube.com/playlist?list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN
의 강의를 보고 작성되었습니다! :)
OS는 많은 일들을 한다.
우리에게 보여지는 UI,
HW쪽의 리소스 관리(CPU, 메모리 등),
SW쪽의 리소스 관리(파일, 어플리케이션 등),
시스템 보호 등등...
여기서, 쉽게 말해 프로그램이 실행되는 상태인
프로세스에 대해 설명하려고 한다.
프로세스의 정의는 쉽게 말해 실행중인 프로그램이다.
프로세스는,
프로그램이 실행되어 메모리를 할당받으면 프로세스가 되고,
프로세스는 시스템 성능 향상을 위해 OS의 커널에 의해 관리된다.
OS가 프로세스 관리에 필요한 정보를 저장하는 것이다.
프로세스가 생성될 때 생성된다.
위 사진과 같이 PCB는 메모리상에 저장되고, 커널이 관리한다.
PCB에 있는 프로세스 관리에 필요한 정보는 다음과 같다.
PCB는 OS의 커널이 관리하므로, PCB정보는 OS별로 다르다!
현재 프로세스의 상태를 나타낸다.
아래의 그림과 같다.
그림에 대해 설명하자면,
create
-> (ready
or suspended ready
)ready
, 할당되지 않았다면 suspended ready
상태가 된다.ready
-> running
running
, 할당되지 않았다면 ready
상태가 된다.running
-> terminated
asleep
-> suspended blocked
여기까지의 설명에 대해 표로 정리하면 아래와 같다.
예상치 못하게 외부에서 발생한 이벤트이다.
프로세스 도중의 방해를 나타낸다.
쉽게말해, Interrupt. 방해하는것이다.
보통 공부중에, 친구가 방해하면 어떻게 행동하는지 생각해보자.
친구가 왜 방해했는지를 보고,
지금 하고있던 공부를 포기하고 같이 놀아주거나(해결),
무시하고(계속 진행) 공부를 계속할 수 있다.
인터럽트도 마찬가지이다.
프로세스 진행중 인터럽트 발생 (친구가 방해함)
프로세스 중단 (하던 일을 멈춤)
인터럽트 처리 과정 (아래 세 줄)
인터럽트 장소, 원인 파악 (왜 방해했는지 보고)
인터럽트 서비스 여부 결정 (해결하거나 계속 진행하거나)
인터럽트 서비스 루틴 호출 (해결하기로 생각하고 해당 친구와 놀아주기)
의 순서대로 인터럽트를 처리한다.
아래의 사진과 같다.
Context는 프로세스와 관련된 정보들의 집합이다.
Switching은 교체한다는 의미이다.
그럼, 프로세스와 관련된 정보들을 교체한다는 의미가 된다.
뭘 어디에서 어떻게 교체한다는 소리인지에 대해서는 아래에 서술하겠다.
CPU의 레지스터에는, 현재 CPU가 담당하는 프로세스에 관한 정보들이 있다.
CPU가 담당하는 프로세스가 다른 프로세스로 바뀌게 된다면,
프로세스에 관한 정보들 또한 바뀌어야 한다.
이게 바로 Context swiching 이다.
현재 그만 둘 CPU에 진행중인 프로세스의
레지스터에 있는 정보들을 다시 메모리로 옮기는
Context saving,
앞으로 실행할, 현재는 메모리상에 있는 프로세스의 정보들을
메모리에서 레지스터로 올리는
Context restoring.
위의 두가지를 합치면,
Context switching이 된다.
당연히 CPU가 담당하고 있는 프로세스를 교체하며 정보를 옮기는 작업인
Context switching에 소요되는 비용이 있으므로,
해당 비용을 줄이는 것이 중요하다.
그러면 어떻게 줄일 수 있을까?
바로 스레드 를 이용하는 것이다.