SW마에스트로 13기/CS스터디

프로세스와 쓰레드

SK_MOUSE 2022. 9. 27. 12:08
반응형

질문목록

1. Process 와 Thread의 차이가 무엇인가요?

- Process : 운영체제로부터 자원을 할당받는 작업의 단위

- Thread : Process가 할당받은 자원을 이용하는 실행의 단위

 

2. Multi-Process < Multi-Thread 사용하는 이유

운영체제는 시스템은 자원을 효율적으로 관리하기 위해서 스레드를 사용한다.

- Multi-Process 대신 Multi-Thread로 실행할 경우, Process 생성시 할당하는 시스템콜이 줄어들어 자원 효율적으로 관리할 수 있습니다.

- 통신 비용 : Process간 > Thread간 →  작업들 간의 통신 부담이 적은 Mutl-Thread로 사용한다.

- Thread 간 자원 공유는 전역변수 이용 → 동기화 문제 신경써야함.

 

3. Thread-Safe란?

- 정의 : 어떤 함수/변수/객체가 여러 Thread로부터 동시에 접근이 이루어져도 프로그램 실행에 문제가 없는 것.

- 하나의 함수가 한 Thread로부터 호출되어 실행 중일 때, 다른 Thread가 그 함수를 호출하여 동시에 실행하더라도 각 Thread에서의 함수 수행 결과가 올바르게 반환되는 것.

 

- Thread-safe를 지키기 위한 방법

1. Re-entrancy
어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.

2. Thread-local storage
공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.
이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.

3. Mutual exclusion
Thread에 lock이나 semaphore를 걸어서 공유자원에는 하나의 thread만 접근 가능하게 한다.

4. Atomic operations
데이터 변경시 atomic하게 데이터에 접근하도록 만듭니다.

- atomic : 프로그래밍에서 데이터의 변경이 동시에 일어난 것처럼 보이게 하는 것을 의미한다. 데이터의 값을 변경하는 것은 항상 그 시간이 필요하다. atomic 한 데이터의 변경이 이루어지는 시간에는 lock 을 건다. 그래서 데이터를 변경하는 시간동안에는 접근이 이루어지지 않게한다.

그래서 프로퍼티가 *atomic 하다는 것은 멀티 스레드 환경에서 데이터가 반드시 변경전과 후의 상황에서만 접근하는 것을 보장한다. 즉, 데이터의 변경이 이루어지고 있는 순간에는 접근이 불가능하다.

5. Immutable Object
객체 생성 이후에 값을 변경할 수 없도록 만듭니다.

 

4. 동기화 객체 종류

동기화 객체 : 커널에서 제공하는 객체로서, Thread 사용시 문제되는 자원의 공유시 충돌 해결법 제시.

- 동기화 객체 종류

1. 크리티컬 세션 : 주요 보호 대상은 전역 객체. Lock/Unlock을 사용하여 자원의 동기화를 유지.

2. 뮤텍스 : Thread 동기화 +  Process 동기화. Lock/Unlock 사용해 동기화 유지. 전산 자원 소모량이 많음. 다른 스레드가 영영 자원에 접근할 수 없는 데드락 상태에 빠지기 때문에 제한시간을 두어 데드락을 방지.

3. 세마포어 : 한번에 한 스레드에 접근만 가능하게 하는 위의 동기화 객체(크리티컬세션, 뮤텍스)와는 달리 동시에 스레드의 접근을 허용할 수 있도록 한다.

ex) 서버측의 경우 동시 접속자 수가 1000명 있을 때, 10명까지로의 접근만 허용하고자 할 때 사용.

 

- 동기화 기법 종류

1. 유저 모드 동기화
- 커널 코드가 실행되지 않는 동기화 기법
- 성능상 이점이 있으나 기능상의 제한이 있음
Ex) 크리티컬 섹션 기반의 동기화, 인터락 함수 기반의 동기화

2. 커널 모드 동기화
- 커널에서 제공하는 동기화 기능을 활용하는 방법
- 커널 모드로의 변경이 필요하고 이는 성능 저하로 이어짐, 대신 다양한 기능 활용 가능
Ex) 뮤텍스 기반의 동기화, 세마포어 기반의 동기화, 이름있는 뮤텍스 기반의 프로세스 동기화, 이벤트 기반의 동기화

 

5. 뮤텍스 & 세마포어 차이

뮤텍스(Mutex)
- 공유된 자원의 데이터를 여러 "스레드"가 접근하는 것을 막는 것

- 상호배제라고도 하며, Critical Section을 가진 스레드의 Running time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술이다.

- 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 synchronized 또는 lock을 사용한다.

- 뮤텍스 객체를 두 스레드가 동시에 사용 할 수 없음

세마포어(Semaphore)
- 공유된 자원의 데이터를 여러 "프로세스"가 접근하는 것을 막는 것.


- 리소스 상태를 나타내는 간단한 카운터로 생각할 수 있다.

- 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용한다.

- 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있다.

- 각 프로세스는 세마포어 값은 확인하고 변경할 수 있다.

- 사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있다.
- 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야 한다.
- 세마포어는 이진수 (0 또는 1)를 사용하거나, 또는 추가적인 값을 가질 수도 있다.

 

<세마포어의 종류>

=> Binary 는 1개이므로 Mutex는 Semaphore에 포함된다고 할 수 있다.

=> Counting은 2개이상

 

차이

  • Semaphore는 Mutex가 될 수 있지만 Mutex는 Semaphore가 될 수 없다.
  • Semaphore는 소유할 수 없는 반면, Mutex는 소유가 가능하며 소유주가 이에 대한 책임을 가진다.
  • Mutex의 경우 Mutex를 소유하고 있는 스레드가 이 Mutex를 해제할 수 있다. 하지만 Semaphore의 경우 이러한 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.
  • Semaphore는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재하는 반면 Mutex는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 된다.

 

6. 스케쥴러

Q. 스케줄링이란?

여러 프로세서가 번갈아 사용하는 자원을 어떤 시점에 어떤 프로세스에 할당할지 결정하는 것이다.

Q. 스케줄링을 하는 이유?

다중 프로그래밍에서 프로세서(CPU)를 할당할 프로세스를 선택할때 전략이 필요하기 때문이다.

 

Q. 프로세스를 스케줄링하기 위한 세 가지 종류 Queue는 무엇이 있을까?

 

Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합, secondary storage에 형성되어 있는 큐

Ready Queue : 메모리에 load되어있는 프로세스들, 현재 메모리 내에 있으면서 CPU 를 잡아서 실행되기를 기다리는 프로세스의 집합

Device Queue : Device I/O 작업을 대기하고 있는 프로세스의 집합, device controller(하드웨어)에 있는 프로세스

 

Q. 스케줄러 알고리즘

 

FCFS(First Come First Served)

  • 특징
    • 먼저 온 고객을 먼저 서비스해주는 방식, 즉 먼저 온 순서대로 처리.
    • 비선점형(Non-Preemptive) 스케줄링
    • 일단 CPU 를 잡으면 CPU burst 가 완료될 때까지 CPU 를 반환하지 않는다
      할당되었던 CPU 가 반환될 때만 스케줄링이 이루어진다.
  • 문제점
    - convoy effect
    -소요시간이 긴 프로세스가 먼저 도달하여 효율성을 낮추는 현상이 발생한다.

🤔 convoy effetct 란

소요시간이 긴 프로세스가 먼저 도달하여 시간을 잡아먹고 있는 부정적인 현상을 의미한다. 짧은 작업을 먼저 처리하는 방식으로 CPU burst time이 짧은 프로세스에게 CPU를 선할당하는 방식이다.

🤔 비선점형(Non-Preemptive) 스케줄링

프로세스가 CPU를 점유하고 있다면 이를 빼앗을 수 없는 방식
필요한 문맥 교환만 일어나기 때문에 오버헤드가 상대적으로 적지만 프로세스의 배치에 따라 효율성 차이가 많이 난다.

🤔 선점형(Non-Preemptive) 스케줄링

프로세스가 CPU를 할당받아 실행 중이더라도 운영체제가 CPU를 강제로 빼앗을 수 있는 방식
CPU 처리 시간이 매우 긴 프로세스가 CPU 사용 독점을 막을 수 있어 효율적인 운영이 가능하다.
하지만 잦은 문맥 교환으로 오버헤드가 많이 발생한다.

 

SJF(Shortest - Job - First)

  • 특징
    - 다른 프로세스가 먼저 도착했어도 CPU burst time 이 짧은 프로세스에게 선 할당
    - 비선점형(Non-Preemptive) 스케줄링
  • 문제점
    - starvation(기아 상태)
    효율성을 추구하는게 가장 중요하지만 특정 프로세스가 지나치게 차별받으면 안되는 것이다. 이 스케줄링은 극단적으로 CPU 사용이 짧은 job 을 선호한다. 그래서 최악의 경우 사용 시간이 긴 프로세스는 거의 영원히 CPU 를 할당받을 수 없다.

SRTF(Shortest Remaining Time First)

  • 특징
    - 새로운 프로세스가 도착할 때마다 새로운 스케줄링이 이루어진다.
    - 선점형 (Preemptive) 스케줄링
    - 현재 수행중인 프로세스의 남은 burst time 보다 더 짧은 CPU burst time 을 가지는 새로운 프로세스가 도착하면 CPU 를 뺏긴다.
  • 문제점
    - starvation(기아 상태)
    새로운 프로세스가 도달할 때마다 스케줄링을 다시하기 때문에 CPU burst time(CPU 사용시간)을 측정할 수가 없다.

Priority Scheduling

  • 특징
    - 우선순위가 가장 높은 프로세스에게 CPU 를 할당하는 스케줄링이다. 우선순위란 정수로 표현하게 되고 작은 숫자가 우선순위가 높다.
    - 선점형 스케줄링(Preemptive) 방식
    더 높은 우선순위의 프로세스가 도착하면 실행중인 프로세스를 멈추고 CPU 를 선점한다.
    - 비선점형 스케줄링(Non-Preemptive) 방식
    더 높은 우선순위의 프로세스가 도착하면 Ready Queue 의 Head 에 넣는다.
  • 문제점
    - starvation(기아 상태)
    - 무기한 봉쇄(Indefinite blocking)
    실행 준비는 되어있으나 CPU 를 사용못하는 프로세스를 CPU 가 무기한 대기하는 상태
    해결책
    - aging
    아무리 우선순위가 낮은 프로세스라도 오래 기다리면 우선순위를 높여주자.

Round Robin

  • 특징
    - 현대적인 CPU 스케줄링
    - 각 프로세스는 동일한 크기의 할당 시간(time quantum)을 갖게 된다.
    - 할당 시간이 지나면 프로세스는 선점당하고 ready queue 의 제일 뒤에 가서 다시 줄을 선다.
    - RR은 CPU 사용시간이 랜덤한 프로세스들이 섞여있을 경우에 효율적
    - RR이 가능한 이유는 프로세스의 context 를 save 할 수 있기 때문이다.
  • 장점
    -Response time이 빨라진다.
    - n 개의 프로세스가 ready queue 에 있고 할당시간이 q(time quantum)인 경우 각 프로세스는 q 단위로 CPU 시간의 1/n 을 얻는다. 즉, 어떤 프로세스도 (n-1)q time unit 이상 기다리지 않는다.
    프로세스가 기다리는 시간이 CPU 를 사용할 만큼 증가한다.
    공정한 스케줄링이라고 할 수 있다.
  • 주의할 점
    설정한 time quantum이 너무 커지면 FCFS와 같아진다. 또 너무 작아지면 스케줄링 알고리즘의 목적에는 이상적이지만 잦은 context switch 로 overhead 가 발생한다. 그렇기 때문에 적당한 time quantum을 설정하는 것이 중요하다.
반응형