[PintOS] Project 1 키워드 정리 (Race Condition, Context Switching, PCB, Process State)

2024. 5. 10. 01:14크래프톤 정글 5기/공부

Race Condition

 

Definition :

- 두 개 이상의 프로세스가 공통 자원을 동시에 읽거나 쓰는 동작을 할 때, 
	공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 
	같지 않고 달라지는 상황
	
Case :

- 여러 프로세스가 공유 데이터 또는 리소스에 접근하고 시스템이 해당 리소스에 대한 접근을 
	적절하게 제어하거나 동기화하지 않을 때 발생

	=> 데이터 손상, 충돌 또는 시스템의 의도하지 않은 동작 발생 가능
	
Reason :

- 공유 자원에 대한 동시 접근
	
	여러 쓰레드 또는 프로세스가 적절한 동기화 없이 공유 리소스에 접근
	
- 비원자적 작업
	
	여러 단계로 구성되고 단계 사이에서 중단될 수 있는 작업은 비원자적
	여러 쓰레드가 공유 리소스에서 비원자적 작업을 수행하는 경우 Race condition 발생 가능
	
	* 비원자적 : 연산 도중에 다른 프로세스나 쓰레드가 끼어들 수 있을 때
	
- 동기화 메커니즘의 부재

	공유 자원에 대한 접근을 적절히 통제하는 동기화 메커니즘이 없을 때 발생

Result :

- 데이터 손상
	
	데이터 상태가 일관되지 않거나 잘못될 수 있다
	
- 예측 불가능한 동작

	시스템 동작을 예측하거나 재현하기 어려울 수 있다
	
- 보안 취약성

	공격자가 무단 접근 또는 권한을 얻기 위해 악용할 수 있다
	
Solution :

- Semaphore, Mutex 와 같은 동기화 기술을 사용하여, 한 번에 하나의 프로세스만 공유 리소스에
	접근할 수 있도록 하거나 특정 실행 순서를 적용하여 문제 방지 (상호 배제)
	
	=> Race Condition 방지, 병렬 시스템의 올바른 기능 보장 가능

	1. Mutex :
		 공유 리소스에 대한 접근을 동기화하는 데 사용
		 공유 리소스에 접근한 프로세스 혹은 쓰레드가 있다면, 해당 자원에 대한 접근 통제
	
	2. Semaphore :
		 공유 리소스에 대한 접근을 동기화하는 데 사용
		 
		 Counting Semaphore : 제한된 수의 프로세스나 쓰레드가 자원에 동시 접근할 수 있게 통제
		 Binary Semaphore : Mutex와 유사
		 		 
	3. 원자적 작업 :
		 중요 작업이 원자적(중단 or 인터럽트 불가능한 상태)이라면 문제 방지에 도움이 됨
		 
	4. 불변 데이터 사용 :
		 한 번 생성되면 변경될 수 없는 데이터 형식을 사용하여, 문제 발생의 가능성 줄일 수 있음

 


Context Switching

 

Definition :

- CPU가 한 프로세스 또는 쓰레드의 실행을 중단하고 다른 프로세스 또는 쓰레드로 전환하는 과정

- 이 과정에서 현재 실행 중인 프로세스 또는 쓰레드의 상태를 저장하고, 새로운 프로세스 또는 
	쓰레드의 상태를 복원

Case :

- 멀티태스킹 운영 체제에서, 여러 프로세스 또는 쓰레드를 동시에 실행할 때 발생

- 인터럽트 처리, 입출력 작업 완료, 시간 분할 방식의 스케쥴링 등으로 인해 발생

Reason :

- 프로세스 이용률 향상
	
	CPU는 대기 시간 없이 다른 프로세스 또는 쓰레드를 실행할 수 있음
	
- 응답성 향상

	우선순위가 높은 프로세스 또는 쓰레드에게 CPU 할당 -> 시스템 응답성 높일 수 있음
	
- 자원 공유

	여러 프로세스 또는 쓰레드가 동일한 자원을 공유할 수 있게 함
	
Result :

** 오버헤드 :
	 특정 기능을 수행하는 데 추가적으로 드는 간접적인 시간, 메모리 등 자원

- 오버헤드 발생

	현재 상태를 저장하고 새로운 상태를 복원하는 데 시간과 자원이 소모됨
	
- 캐시 미스 증가

	캐시 미스가 증가하여 성능이 저하될 수 있음
	
- 잦은 전환으로 인한 성능 저하

	오버헤드를 증가시키면, 전체 시스템 성능 저하 발생 가능
	
Solution :

- 스케쥴링 알고리즘 최적화

	불필요한 문맥전환을 피하는 적절한 스케쥴링 알고리즘의 사용
	
- 동시에 실행되는 프로세스 또는 쓰레드의 수를 적절히 조절

- 경량 쓰레드 사용

	User-level thread 사용 -> Kernel-level Context Switching 피할 수 있음
	
- 자원 경합 최소화

	공유 자원에 대한 경합을 최소화하면 불필요한 문맥전환 피할 수 있음
	
** Context Switching을 통해 동시에 프로세스 또는 쓰레드가 작업을 하는게 아님
	 빠른 속도로 CPU가 전환을 해가면서, 동시에 처리하는 것 처럼 보이는 것

 


PCB (Process Control Block)

 

https://www.geeksforgeeks.org/process-table-and-process-control-block-pcb/

 

** PCB(Process Control Block)

Process Metadata : 각 프로세스 별 특징을 갖고 있는 정보

- Process 고유 ID (PID)
- Process 상태
	생성, 준비, 실행, 대기, 완료 상태가 있다
- Process 우선순위
- Program Counter (PC)
	프로세스가 다음에 실행한 명령어의 주소
- CPU 레지스터 값
	프로세스가 실행되는 동안 CPU 레지스터에 저장된 값
- 메모리 관리 정보 
	프로세스가 사용하는 메모리 영역의 정보
	프로세스의 코드, 데이터, 힙, 스택 영역의 시작 주소와 크기 등
- 열린 파일 목록
	프로세스가 사용 중인 파일들의 정보 저장
	파일 디스크립터, 파일 포인터 등
- 프로세스 우선순위
- 프로세스 소유자 및 권한
	프로세스 실행 사용자의 정보 + 프로세스의 권한 정보
- 입출력 상태 정보
  프로세스가 수행 중인 입출력 작업의 상태 정보
  입출력 요청 + 완료 여부 등
- 계정 정보
	프로세스의 자원 사용량, CPU 사용 시간 등
** Why we need PCB ?

- Context Switching을 하게 된다면, 기존에 실행 중이던 프로세스의 정보를 저장해야 함
	만약 기존 실행 프로세스의 정보를 잃게 된다면, 다시 기존 프로세스로 전환될 때 이어서 실행 X
    

* Process & PCB

- 프로그램 실행 -> PCB 할당 -> 프로세스 생성 -> PCB 업데이트
- PCB는 Linked list 형태
- 새로운 PCB 생성 -> Linked list에 이어붙임
- 프로세스가 종료되면 PCB도 종료

* PCB 저장 위치

1. 커널 주소 공간
	 OS의 커널은 시스템 메모리 일부를 사용 -> 커널 주소 공간
	 사용자 프로세스는 직접 커널 주소 공간에 접근 X -> 시스템 콜 호출해야 함
	 
2. PCB 저장 위치
	 PCB는 커널 주소 공간 내에 존재하는 특별한 메모리 영역에 저장
	 프로세스가 생성되면, 해당 프로세스의 PCB가 할당되어 저장

3. PCB 접근 및 관리
	 커널에 의해 관리되며, 사용자 프로세스는 직접 PCB에 접근 X
	 OS는 시스템 콜을 통해 PCB 활용
	 
4. PCB 보호
	 PCB는 OS의 중요한 자료구조 -> 무결성과 보안이 굉장히 중요
* Procedure of Context Switching + Change of PCB state

1. 프로세스 A 실행 중
2. 프로세스 B에서 인터럽트 발생 (또는 프로세스 A의 할당 시간 종료)
3. A의 현재 실행 정보(PC, 레지스터 값 등)를 A의 PCB에 저장
4. A를 대기 상태(또는 준비 상태)로 전환 [Context Switching]
5. 스케줄러가 실행할 프로세스 B를 선택
6. B의 PCB 정보를 기반으로 B의 실행 정보(PC, 레지스터 값 등)를 복원하여 실행
7. B 동작 완료 (또는 인터럽트 발생이나 할당 시간 종료)
8. B의 현재 실행 정보를 B의 PCB에 저장
9. B를 대기 상태(또는 준비 상태)로 전환 [Context Switching]
10. 스케줄러가 실행할 프로세스 A를 선택 (또는 우선순위나 준비 큐에 따라 다른 프로세스 선택 가능)
11. A의 PCB 정보를 기반으로 A의 실행 정보를 복원하여 실행

 


* 프로세스의 5가지 상태

1. 생성 상태

	 프로세스가 막 생성된 상태
	 운영 체제가 PCB를 할당하고 프로세스에 필요한 자원을 준비
	 아직 메모리에 로드되거나 실행 준비가 완료되지 않은 상태

2. 준비 상태

	 프로세스가 실행될 준비가 된 상태
	 필요한 자원과 메모리가 할당되었고, CPU 할당받을 수 있는 상태
	 
3. 실행 상태

	 프로세스가 CPU를 할당받아 실제로 실행되고 있는 상태
	 프로세스의 명령어들이 CPU에 의해 실행
	 한 번에 하나의 프로세스만 실행 상태에 있을 수 있다 (Context Switching의 이유)

4. 대기 상태

	 프로세스가 특정 이벤트나 자원을 기다리는 상태
	 입출력 작업, 동기화를 위한 신호 등을 기다리는 동안의 프로세스 상태
	 대기 상태에서는 CPU 할당 X, 이벤트가 발생하거나 자원이 사용 가능할 때까지 대기
	 
5. 종료 상태

	 프로세스가 실행을 완료하고 종료된 상태
	 프로세스가 정상적으로 종료되거나 오류로 인해 강제 종료된 경우
	 프로세스가 종료되면 할당받았던 자원들이 해제되고 PCB가 제거

6. 보류 상태 (일시 중단 상태)

	 프로세스가 메모리에서 디스크로 스왑 아웃 된 상태
	 메모리 부족 시 프로세스를 일시적으로 디스크에 저장, 필요할 때 다시 메모리로 스왑 인
* 프로세스가 실행 상태에서 중단될 때, 준비 상태 or 대기 상태 ?

1. 준비 상태로 전환되는 경우 
	
	 할당된 시간이 종료된 경우
	 우선순위가 더 높은 프로세스가 실행 가능해진 경우

-> 준비 상태의 프로세스는 CPU를 할당받을 준비가 되어 있으며, 스케줄러에 의해 선택되면 실행 상태로 전환

2. 대기 상태로 전환되는 경우

	 입출력 작업을 요청하고 그 완료를 기다리는 경우
	 특정 이벤트나 신호를 기다리는 경우
	 다른 프로세스나 자원과의 동기화를 위해 대기하는 경우

-> 대기 상태의 프로세스는 특정 조건이 충족되면 (I/O 완료, 신호 수신 등) 준비 상태로 전환