Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create Context_Switching_리오.md #6

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions 운영체제/Context_Switching_리오.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
## 컨텍스트 스위칭이 필요한 이유

### 개념 설명

---

#### 컨텍스트 스위칭
컨텍스트 스위칭은 여러 프로세스를 처리해야 하는 상황에서 현재 진행중인 Task의 상태를 PCB에 저장하고, 다음에 진행할 Task의 상태 값을 읽어서 레지스터에 적재하는 과정을 의미합니다.

CPU Cycle의 속도는 I/O 작업에 비해 굉장히 빠릅니다.
I/O 작업이 실행되고 blocking 된다면, CPU는 아무 일을 하지 않은 상태로 오랜 기간동안 쉬고 있게 됩니다.
이 때, 컨텍스트 스위칭을 통해 다른 프로세스나 쓰레드의 작업으로 전환을 한다면 CPU의 사용률을 높일 수 있습니다.

컨텍스트 스위칭을 진행하는 동안은 다른 작업을 할 수 없게 되지만, 이 시간보다 I/O 작업이 통상적으로 더 오래 걸리기 때문에 컨텍스트 스위칭을 하는 것이 효율적입니다.

#### 컨텍스트 스위칭의 과정
1. CPU가 다른 프로세스로 전환하면 시스템은 프로세스의 상태를 PCB에 저장합니다.
2. 대기열에서 다음 프로세스를 선택하고, 해당 프로세스의 PCB를 복원합니다.
3. PCB의 프로그램 카운터(레지스터)가 로드되어 이전까지 작업한 곳의 지점으로 돌아가 선택한 프로세스의 작업을 이어서 합니다.



## 꼬리 질문

---

### PCB가 무엇인가요?
### 답변
PCB는 Process Control Block, 즉 프로세스 제어 블록이며 프로세스를 관리하기 위한 정보를 포함하는 OS 커널의 자료 구조입니다.
OS는 프로세스의 생성과 동시에 고유한 PCB를 생성합니다.
PCB는 프로세스의 중요한 정보를 포함하기 때문에, 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 위치합니다.
프로세스는 수행할 차례가 되면 CPU를 할당받아 작업을 처리합니다.
작업을 처리하던 도중 프로세스의 시간이 모두 경과되거나 인터럽트가 발생하는 등의 프로세스 전환이 발생하면, 진행하던 작업을 저장하고 CPU를 반환합니다.
이 때, 수행하던 프로세스 관련 데이터들을 PCB에 저장합니다. 그리고 다시 프로세스의 수행 차례가 와서 CPU를 할당받게 되면, PCB에 저장되어 있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행합니다.
이렇게 사용하던 프로세스의 데이터를 PCB에 저장하고 실행할 프로세스의 데이터를 PCB에서 불러오는 과정을 Context Switching이라고 합니다.

PCB에 저장되는 정보<br>
프로세스 식별자(Process ID, PID)<br>
프로세스 상태<br>
프로그램 카운터 - 프로세스가 다음에 실행할 명령어의 주소<br>
CPU 레지스터 <- 더 찾아보기<br>
CPU 스케줄링 정보 - 프로세스의 우선순위, 스케쥴 큐에 대한 포인터 등<br>
메모리 관리 정보 - 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보 포함
입출력 상태 정보 - 프로세스에 할당된 입출력 장치들과 열린 파일 목록
어카운팅 정보 - 사용된 CPU 시간, 시간제한, 계정번호 등

<br>

### Blocking/Non-Blocking과 동기/비동기가 무엇인가요?
### 답변
Blocking은, A함수가 B함수를 호출할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것을 의미합니다. 즉, B 함수가 종료될 때까지 A 함수는 다른 일을 수행할 수 없습니다.

Non-Blocking은, A함수가 B함수를 호출할 때, B함수가 A 함수에게 곧바로 제어권을 돌려주게 됩니다. A 함수는 곧바로 제어권을 가지고 있으므로 다른 일을 수행할 수 있습니다.

동기는 요청과 그 결과가 동시에 일어난다는 약속입니다. 요청을 하면, 시간이 얼마가 걸리던지 요청한 자리에서 결과가 주어져야 합니다. 설계가 매우 간단하고 직관적이지만, 결과가 주어질 때까지 아무것도 못하고 대기해야 합니다.
즉, A함수가 B함수를 호출할 때, B함수의 결과를 A가 처리하는 것입니다.

비동기는 반대로 요청과 결과가 동시에 일어나지 않을 것이라는 약속입니다. 동기보다 복잡한 방식이지만, 그 시간동안 다른 작업이 가능하므로 자원을 효율적으로 사용할 수 있다는 장점이 있습니다.

따라서 Blocking != Sync, Non-blocking != Async 입니다.

동기/비동기 = 호출당한 함수의 종료를 누가 처리하느냐

blocking/non-blocking = 제어권이 누구에게 돌아가느냐

## 참고 자료 및 레퍼런스
https://hoons-dev.tistory.com/95