말감로그

프로세스와 스레드/세마포어와 뮤텍스/CPU 스케줄링 알고리즘/경쟁조건(Race condition)/데드락/문맥교환 본문

이론/운영체제

프로세스와 스레드/세마포어와 뮤텍스/CPU 스케줄링 알고리즘/경쟁조건(Race condition)/데드락/문맥교환

habbn 2024. 3. 5. 01:27
728x90

프로세스와 스레드

프로세스

  • 프로세스는 실행 중인 프로그램을 나타낸다. 프로세스는 운영체제로부터 시스템 자원(메모리, 파일 ,CPU 시간 등)을 할당받아 실행한다.
  • 프로세스는 각각 독립적인 주소 공간 가지며, 다른 프로세스와 격리되어 있다. 이는 프로세스 간에 데이터 공유가 불가능하다.
  • 각 프로세스는 최소한 하나의 스레드를 가지고 있다. 

스레드

  • 스레드는 프로세스 내에서 실행되는 가장 작은 실행 단위이다.
  • 스레드는 프로세스의 주소 공간을 공유하며, 여러 스레드가 동일한 자원에 동시에 접근할 수 있다.
  • 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.

프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다.

 

프로세스는 실행 중인 프로그램을 나타내며, 스레드는 프로세스 내에서 실행되는 실행 단위이다.

프로세스는 독립적인 주소 공간을 가지고 있지만, 스레드는 프로세스의 자원을 공유한다.

 

세마포어와 뮤텍스

 

임계구역(Critical Section)

여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 블록

즉, 여러 프로세스가 동일 자원을 동시에 참조하여 값(공유하는 변수명, 파일 등)이 오염될 위험 가능성이 있는 영역

 

임계구역 문제를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다. 대표적으로 뮤텍스와 세마포어가 있다.

 

뮤텍스

  • 동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용하는 방법이다.
  • 뮤텍스는 상호 배제를 구현하는 데 사용된다.
  • 잠금(lock) 연산은 뮤텍스를 소유하는 스레드가 없는 경우 뮤텍스를 획득하고, 이미 다른 스레드가 뮤텍스를 소유하고 있는 경우 호출한 스레드는 블록된다.
  • 해제(unlock) 연산은 뮤텍스를 해제하고 다른 스레드가 뮤텍스를 획득할 수 있도록 한다.

 

세마포어

  • 멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법이다.
  • 세마포어는 정수 변수로, 일반적으로 0 이상의 값을 가진다.
  • 세마포어는 두 가지 주요한 연산을 지원한다.
  • P(Produce) 연산은 세마포어 값을 감소시키고, 세마포어 값이 음수가 되면 호출한 스레드는 블록된다. 이는 리소스가 사용 중일 때 대기하는 것을 의미한다.
  • V(Consume) 연산은 세마포어 값을 증가시키고, 세마포어 값이 양수가 되면 대기 중인 스레드 중 하나를 깨운다.

 

뮤텍스와 세마포어의 차이점

 

1. 동기화 대상의 갯수

  • 뮤텍스는 동기화 대상이 1개 일 때 사용
  • 세마포어는 동기화 대상이 1개 이상일 때 사용

 

2. 뮤텍스 자원 소유 가능 + 책임을 가지는 반면, 세마포어는 자원 소유 불가

  • 뮤텍스는 상태가 0, 1 뿐이므로 Lock을 가질 수 있다

 

3. 뮤텍스는 소유하고 있는 스레드만이 이 뮤텍스를 해제할 수 있다.

  • 반면, 세마포어는 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있다.

 

CPU 스케줄링 알고리즘

CPU 스케줄링은 언제 어떤 프로세스에 CPU를 할당할지 결정하는 작업을 한다.

 

비선점형 방식(non-preemptive)

프로세스가 스스로 CPU 소유권을 포기하는 방식. 즉, 어떤 프로세스가 CPU를 점유하고 있다면 이를 뺏을 수 없는 방식으로 강제로 프로세스를 중지하지 않는다.

 

1. FCFS(First Come First Served)

  • 가장 먼저 온 것을 가장 먼저 처리한다.
  • 길게 수행되는 프로세스 때문에 준비 큐에서 오래 기다리는 현상, 호위효과(convoy effect) 발생하는 단점이 있다.

 

2. SJF(Shortest Job First)

  • 실행시간이 가장 짧은 프로세스를 가장 먼저 실행한다.
  • 긴 시간을 가진 프로세스가 우선순위에 계속 밀려 실행되지 않고 무기한으로 대기하게 되는 현상, 기아(starvation)이 발생한다.

 

3. 비선점 Priority(우선순위)

  • 각각의 프로세스에 우선순위가 있는 알고리즘으로 우선순위가 높은 순 먼저 실행된다.
  • 오래된 작업일수록 우선순위를 높이는 노화(aging) 방법을 통해 단점을 보완한다.

 

선점형 방식(preemptive)

지금 사용하고 있는 프로세스를 알고리즘에 의해 중단시키고 강제로 다른 프로세스에 CPU 소유권을 할당하는 방식이다.

잦은 컨텍스트 스위칭으로 인해 오버헤드가 커질 수 있다.

 

1. 라운드로빈(Round Robin)

  • 각각의 프로세스에 동일한 할당 시간을 부여해서 해당 시간 동안만 CPU를 이용하게 된다.
  • 할당 시간 내에 처리를 완료하지 못하면 강제 중단 후 다음 작업으로 넘어간다.

 

2. SRTF(Shortest Remaing Time First)

  • 실행되고 있는 프로세스는 중단없이 끝까지 실행되는 비선점형 SJF와 다르게, 중간에 더 짧은 작업의 프로세스가 들어오면 현재 실행되는 프로세스를 중단하고 해당 프로세스를 실행한다.

 

3. 다단계 큐(Multilevel Queue)

  • 우선순위에 따른 준비 큐가 여러 개의 큐들로 나뉘고 각각의 큐마다 각자의 스케줄링 알고리즘을 적용한 것이다.
  • 큐 간의 프로세스 이동이 안되므로 스케줄링 부담이 적지만 유연성이 떨어진다는 특징이 있다.

 

4. MLFQ(Multilevel - Feedback Queue)

  • 특정 그룹의 Queue에 들어간 프로세스가 다른 Queue로 이동하거나 변경이 불가능한 MLQ 기법을, 서로 다른 Queue로도 이동할 수 있도록 개선한 기법이다.
  • 다양한 우선순위를 가진 여러 개의 큐를 사용하여 프로세스를 관리하는 기법이다.

 

4BSD, nice

4BSD 스케줄러는 프로세스의 nice 값(우선순위를 결정하는 값)과 최근 CPU 사용량을 고려하여 프로세스의 우선순위를 동적을 조정한다.

 

 

경쟁 조건(Race condition)

  • 경쟁 조건은 멀티 스레드 또는 병렬 프로그램에서 발생할 수 있는 동기화 문제이다.
  • 두 개 이상의 스레드가 공유된 자원에 동시에 접근하고 변경할 때 발생할 수 있다. 경쟁 조건은 프로그램의 실행 결과가 스레드 실행 순서에 따라 달라질 수 있다는 것을 의미한다.

 

경쟁 조건이 발생하는 예시

1. 공유된 자원의 동시 접근

두 개 이상의 스레드가 동시에 공유된 변수, 자료 구조 또는 파일 등에 접근하고 수정할 때, 예상하지 못한 결과가 발생할 수 있다.

 

2. 동기화 없는 임계구역 접근

여러 스레드가 동시에 임계 구역에 접근하고 수정할 때, 데이터의 무결성이 보장되지 않고, 일관성이 깨질 수 있다.

 

3. 스케줄링의 예측 불가능성

스레드의 실행 순서가 예측하기 어려운 경우, 경쟁 조건이 발생할 가능성이 높아진다.

 

데드락(DeadLock , 교착상태)

두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태이다.

무한히 다음 자원을 기다리게 되는 상태.

ex ) 외나무 다리의 양 끝에서 서로가 비켜주기를 기다리고만 있는 것과 같다.

 

데드락이 발생하는 경우

현재 서로 원하는 자원이 상대방에 할당되어 있어서 두 프로세스가 무한정 wait 상태에 빠질 때

 

데드락 발생 조건

(4가지 모두 성립해야 데드락 발생, 하나라도 성립하지 않으면 데드락 문제 해결 가능)

 

1. 상호 배제(Mutual exclusion)

자원은 한 번에 한 프로세스만 사용할 수 있다.

 

2. 점유 대기(Hold and Wait)

최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 한다.

 

3. 비선점(No preemption)

다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없다.

 

4. 순환 대기(Circular wait)

프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 한다.

 

데드락 처리

교착 상태를 예방 & 회피

1. 예방

교착 상태 발생 조건 중 하나를 제거하면서 해결한다.(자원 낭비 엄청 심함)

2. 회피

은행원 알고리즘, 자원 할당 그래프 알고리즘

 

교착 상태를 탐지 & 회복

1. 탐지

자원 할당 그래프를 통해 교착 상태를 탐지한다.

2. 회복

교착 상태 일으킨 프로세스를 종료하거나, 할당된 자원을 해제시켜 회복시킨다.

 

컨텍스트 스위칭(문맥 교환)

  • 컨텍스트 스위칭은 CPU에 실행할 프로세스를 교체하는 기술이다.
  • 현재 프로세스의 PC와 SP 등 정보를 저장하는 아주 작은 공간을 PCB라고 하는데, PCB에는 Process ID(PID), 레지스터(PC,SP 등)을 포함해 프로세스가 실행 중인 상태 정보를 저장한다.
  • 현재 실행 중인 프로세스 정보를 PCB에 업데이트 후 메인 메모리에 저장한다.
  • 다음 실행 할 프로세스 정보를 메인 메모리에서 가져와 CPU 레지스터에 넣고 실행한다.
728x90