레지스터란 컴퓨터의 중앙 처리 장치(CPU) 내부에 있는 매우 빠른 메모리 장치이다. 연산과 프로그램의 실행을 효율적으로 수행하기 위해 사용되며, 이를 위해 컴퓨터 메모리와 상호 작용하는 여러 가지 레지스터가 있다.
사실, 레지스터의 핵심 목적은 데이터를 빠르게 CPU로 가져오는 것이다. 레지스터는 작고, 빠르기에 CPU가 연산을 수행하는 데 필요한 중요한 정보(명령어, 데이터, 주소 등)를 임시 저장하는데에 사용된다.
PCB에는 각각의 프로세스의 Process Metadata가 담기는데, 이 Metadata는 다음과 같다.
한 프로세스에는 한 PCB만 생성된다. 따라서 PCB는 프로세스가 새로 생성될 때마다 하나씩 늘어나게 되는데, 이때 PCB들을 관리하는 자료구조는 Linked List이다! PCB List Head에 PCB들이 생성될때마다 하나씩 이어붙여준다. 주소값으로 연결되는 형태이기 때문에 새로운 PCB가 들어오거나, 기존의 프로세스가 종료되어 PCB가 사라질때 뛰어난 효율을 보이게 된다. (Linked List의 삽입 삭제 용이성때문!!) 이처럼 수행중인 프로세스를 변경할 때 CPU의 레지스터 정보가 변경되는 것을 Context Switching 이라고 한다.
CPU가 현재 실행하고 있는 Task(Process, Thread)의 상태를 저장하고, 다음 진행할 Task 상태 및 진행할 Register 값들에 대한 정보를 읽어 새로운 Task의 Context 정보로 교체하는 과정이다. 원래 실행중이던 프로세스의 상태는 PCB에 보관하고 새로 들어오는 프로세스는 PCB 정보를 바탕으로 레지스터에 값을 적재한다.
보통 인터럽트의 발생한 상황, 현재 프로세스의 선점 허용 기간을 모두 소모한 상황, 입출력을 위해 대기하는 상황에서 Context Switching이 발생한다.
즉, 프로세스의 상태가 변경될 때 사용된다!!
-> 따라서 잦은 Context Switching은 성능 저하를 가져옴
프로세스의 시간 할당량이 적어지면 문맥 교환 수, 인터럽트 횟수, 오버헤드가 증가하지만 여러 개의 프로세스가 동시에 수행되는 느낌을 갖는다.
반대로 프로세스의 시간 할당량이 커지면 문맥 교환 수, 인터럽트 횟수, 오버헤드가 감소하지만 여러 개의 프로세스가 동시에 수행되는 느낌을 갖지 못한다.
프로세스를 수행하다가 I/O event가 발생하여 BLOCK 상태로 전환시켰을 때, CPU가 그냥 놀게 놔두는 것보다 다른 프로세스를 수행시키는 것이 효율적이므로, CPU에 계속 프로세스를 수행시키도록 하기 위해서 다른 프로세스를 실행시키고 Context Switching을 할 때 Overhead가 발생한다.
CPU가 놀지 않도록 만들면서, 사용자에게 빠르게 일처리를 제공해 주기 위한 것!
https://velog.io/@nnnyeong/OS-Context-Switching-PCB-Process-Control-Block
https://junsangkwon.tistory.com/45
https://taeyoungcoding.tistory.com/348
https://yoongrammer.tistory.com/52
https://velog.io/@haero_kim/PCB-%EC%99%80-Context-Switching-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
https://thebook.io/080367/0021/
https://m.blog.naver.com/adamdoha/222019884898
https://jerryjerryjerry.tistory.com/181