Context
- CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들
- Context는 프로세스의 PCB(Process Control Block)에 저장되고, Context Switching 시에 PCB의 정보를 읽어서 CPU가 전에 프로세서가 하던 일을 이어서 수행이 가능하다.
프로그래밍에서 컨텍스트(Context)는 실행되는 프로그램의 상황이나 정보를 나타냅니다. 예를 들어, 함수가 호출될 때 해당 함수가 실행되기 위해 필요한 정보들을 저장하는 공간이 컨텍스트입니다.
함수 호출 시에는 보통 호출하는 함수와 호출된 함수 사이에 스택(Stack)이 사용됩니다. 호출하는 함수의 상태 정보를 스택에 저장하고, 호출된 함수의 상태 정보를 스택에서 불러와 실행합니다. 이때, 상태 정보에는 호출된 함수가 실행되기 위해 필요한 변수, 레지스터 값, 반환 주소 등이 포함됩니다. 이러한 상태 정보를 모두 모아서 컨텍스트(Context)라고 부르며, 실행 흐름을 저장하고 복구하는 데 사용됩니다.
컨텍스트는 함수 호출 이외에도 다양한 프로그래밍 상황에서 사용됩니다. 예를 들어, 멀티스레드 환경에서는 스레드마다 각자의 컨텍스트가 존재하며, 스레드 간 전환이 필요할 때마다 컨텍스트를 저장하고 복구합니다. 또한, 인터럽트 처리, 예외 처리, 시스템 콜 등에서도 컨텍스트가 사용됩니다.
PCB(Process Controll Block)
- 프로세스와 관련된 정보를 저장하는 자료구조
- 해당 프로세스를 식별하기 위해 꼭 필요한 정보를 저장하고, 프로세스가 생성되면 메모리에 해당 PCB가 만들어지고 종료 시 삭제된다.
- PCB의 저장 정보
- 프로세스 번호(PID): 특정 프로세스를 식별하기 위해 부여하는 고유 번호
- 프로그램 카운터 / 레지스터 값: 프로세스는 이전 작업을 이어가기 위해 레지스터의 중간값을 복원한다. 따라서 카운터(다음 실행할 명령어의 주소)와 레지스터 값을 저장한다.
- 프로세스 상태: 생성, 준비, 수행, 대기 ,중지
- CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을 지에 대한 정보
- 메모리 관련 정보 / 열린 파일 목록..
Context Switching
- 현재 진행하는 Task(Process, Thread)의 상태를 저장하고, 다음 진행할 Task의 상태값을 읽어 실행하는 과정
- CPU Scheduling을 통해서 하나의 CPU를 여러 작업들이 공유할 수 있게 CPU 시간을 나누어 작업을 수행을 할 때, 프로세서가 지금까지 실행되는 프로세스(A)를 중지하고 다른 프로세스(B)의 PCB 정보를 바탕으로 프로세스(B)를 실행하는 것이 Process Context Switching이다.
- 동일한 프로세스 내에서 하나의 스레드(a)를 중지하고 다른 스레드(b)의 TCB 정보를 바탕으로 스레드(b)를 실행하는 것이 Thread Context Switching이다. 참고로 Context Switching의 최소 단위는 TCB라 볼 수 있다.
- Context Switching 시에는 해당 스레드만을 위한 스택 영역이 생성되고(스레드마다 스택을 독립적으로 할당), 나머지 영역 code/data/heap은 부모 프로세스 영역에서 공유한다.
- Context Switching에 소요되는 시간을 줄이려면 저장하고 복원되는 Context 정보를 줄여야 한다.
- 스레드는 공유 영역에 많기 때문에 Context Switching이 빠른 반면에, 프로세스는 공유 데이터가 없으므로 새로 캐시 정보를 쌓아야 해서 비교적 부담이 있다.
왜 필요할까?
- 컴퓨터가 매번 하나의 task만 처리할 수 있다면 해당 task가 끝날 때까지 다음 task는 기다릴 수 밖에 없고, 반응 속도가 매우 느리고 사용하기 불편하다.
- 그러므로 빠른 속도로 task를 바꿔가며 실행하는 multitasking기법을 통해 문제를 해결할 수 있다.
- CPU가 task를 바꿔가며 실행하기 위해 Context Switching이 사용된다.
Context Switching은 다음과 같은 상황에서 일어난다.
- I/O interrupt
- CPU 사용시간 만료
- 자식 프로세스 fork
- 인터럽트 처리를 기다릴 때
컨텍스트 스위칭(Context Switching)은 운영체제에서 실행 중인 프로세스나 스레드가 다른 프로세스나 스레드로 교체되는 과정을 말합니다. 이때, 교체되는 과정에서 현재 실행 중인 프로세스나 스레드의 상태 정보를 저장하고, 교체되는 다음 프로세스나 스레드의 상태 정보를 불러와 실행하는 작업을 수행합니다.
컨텍스트 스위칭은 다음과 같은 상황에서 발생할 수 있습니다.
1. 인터럽트(Interrupt)
하드웨어 인터럽트나 소프트웨어 인터럽트가 발생한 경우, 운영체제는 현재 실행 중인 프로세스나 스레드를 일시 중지하고, 인터럽트 처리를 위한 다른 프로세스나 스레드를 실행합니다.
2. 시스템 콜(System Call)
시스템 콜을 호출한 프로세스나 스레드가 I/O 작업 등을 처리하는 동안, 운영체제는 해당 작업이 완료될 때까지 다른 프로세스나 스레드를 실행합니다.
3. 멀티태스킹(Multitasking)
멀티태스킹을 지원하는 운영체제에서는 여러 개의 프로세스나 스레드를 동시에 실행하며, 이때 각 프로세스나 스레드를 일정 시간 간격으로 번갈아가며 실행합니다.
컨텍스트 스위칭은 시스템의 성능을 저하시키는 원인 중 하나이기도 합니다. 따라서, 컨텍스트 스위칭을 최소화하고, 효율적으로 수행하기 위한 다양한 기술과 알고리즘이 개발되고 있습니다.
CPU 스케줄링
- CPU 이용률을 극대화하기 위해서는 멀티 프로그래밍이 필요한데, 만약 CPU 코어가 하나라면 한 번에 하나의 프로세스만 실행이 가능할 것이다. 이때 필요한 것이 CPU 스케줄링이다.
- CPU 스케줄링은 언제, 어떤 프로세스에 CPU를 할당할 지 결정하는 작업이다.
- CPU 스케줄링 대상 프로세스는 Ready Queue에 있는 프로세스들로, 스케줄링 정책에 따라 Queue 정렬 후 앞에 있는 프로세스부터 CPU를 할당해준다.
- CPU 스케줄러는 메모리에 있는 프로세스들 중 어떤 프로세스를 실행할 지 선택하고, CPU를 할당하는 역할을 한다.
CPU 스케줄링(CPU Scheduling)은 운영체제가 여러 개의 프로세스를 실행하는 상황에서 CPU 자원을 효율적으로 할당하기 위해 사용하는 방법입니다. CPU 스케줄링은 다음과 같은 이유로 필요합니다.
1. 여러 개의 프로세스가 동시에 실행될 때, CPU가 어느 프로세스에게 할당될지 결정되어야 합니다.
2. CPU를 효율적으로 활용하여 응답시간을 최소화하고, 처리량을 최대화해야 합니다.
3. CPU 스케줄링은 프로세스간 공평한 자원 분배를 보장하여, 시스템 전체의 성능을 향상시킵니다.
CPU 스케줄링 방법에는 다양한 알고리즘이 있습니다. 대표적인 CPU 스케줄링 알고리즘으로는 다음과 같은 것들이 있습니다.
1. FCFS(First-Come, First-Served) 스케줄링: 먼저 도착한 프로세스부터 순서대로 CPU를 할당합니다.
2. SJF(Shortest Job First) 스케줄링: 실행 시간이 가장 짧은 프로세스부터 CPU를 할당합니다.
3. Priority 스케줄링: 우선순위가 높은 프로세스부터 CPU를 할당합니다.
4. Round Robin 스케줄링: 각 프로세스는 일정 시간(Time Quantum) 동안 CPU를 할당받고, 시간이 만료되면 다음 프로세스로 CPU를 전환합니다.
5. MLQ(Multi-Level Queue) 스케줄링: 여러 개의 큐를 이용하여 우선순위에 따라 프로세스를 분류하고, 각 큐에서 다른 스케줄링 알고리즘을 적용합니다.
각각의 CPU 스케줄링 알고리즘은 장단점이 있으며, 적절한 알고리즘을 선택하여 CPU 자원을 효율적으로 사용하는 것이 중요합니다.
Deadlock (교착 상태)
- 둘 이상의 프로세스(스레드)가 가지고 있는 자원을 서로 점유하고 대기하면서 무한 대기에 빠져 다음 처리를 하지 못하는 상태
- Deadlock의 발생 조건 → 보통 다음 4가지 조건이 동시에 성립할 때 발생
- 상호 배제(Mutual Exclusion): 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구함.
- 점유와 대기(Hold and Wait): 프로세스가 자원을 갖고 있는 상태에서 다른 자원을 요구하며, 자원이 사용 가능할 때까지 기다림.
- 비선점(Non-preemption): 다른 프로세스가 사용 중인 자원을 강제로 뺏을 수 없음. (비선점: 빼앗기 불가)
- 순환 대기(Circular Wait): 서로 다른 프로세스가 점유한 자원을 요구하며, 순환 형태로 대기하는 상황을 의미함.
- Deadlock이 발생하면 프로세스들이 멈춰지고 시스템 자원이 더 이상 활용되지 않으므로 시스템 전체의 성능이 저하되므로 운영체제는 Deadlock이 발생하지 않도록 미리 예방해야 한다.
- Deadlock 예방 방법
- 상호 배제: 여러 프로세스가 공유 자원을 사용함.
- 점유와 대기: 프로세스 실행 전 모든 자원을 할당함.
- 비선점: 선점
- 순환 대기: 고유 번호를 부여하여 순서대로 자원을 요구함.
- 자원 할당 순서 변경
'CS > 스터디' 카테고리의 다른 글
[10주차] DFS&BFS, Greedy 알고리즘, 최소 신장 트리 (0) | 2023.03.27 |
---|---|
[6주차] HTTP와 HTTPS, URI, URL, URN, 포트와 소켓 (0) | 2023.02.27 |
[5주차] TCP/IP(흐름제어, 혼잡제어, 3way handshake, 4way handshake) , TCP vs UDP (0) | 2023.02.24 |
[4주차] OSI 7계층, 서브넷 마스크, DNS (0) | 2023.02.17 |
[1주차] 프로세스와 스레드, 페이징과 세그멘테이션 (0) | 2023.01.20 |