[CS기초] 프로세스 및 스레드

홍기대·2022년 9월 8일
0

CS기초

목록 보기
1/1

프로세스

프로세스는 실행되고 있는 컴퓨터 프로그램의 인스턴스. 프로세스는 프로그램을 메모리에 로드하고 실행
프로세스는 다음 리소스로 구성
1. Text(컴파일된 프로그램의 기계어 코드)
2. Data(전역, 정적, 상수 및 초기화되지 않은 변수)
3. Heap(동적 메모리 할당)
4. Stack(로컬 변수, 함수 호출, 매개변수, 반환 주소 등의 임시 데이터)

여기서 화살표는 동적 메모리 및 변수/함수에 따라 힙과 스택이 커질 수 있음을 나타냄

프로세스 상태 및 라이프사이클

  • Start: 초기 상태. 프로세스는 생성 시 이 상태임
  • Ready: 프로세스가 처리될 준비가 된 상태. 프로세스는 메모리로 이동 후 Start에서 Ready 상태로 이동. 다른 프로세스가 Running 상태로 이동된 경우에도 프로세스를 다시 원위치 가능
  • Running: 프로세스가 프로세서에 할당되고 처리가 시작된 상태.
  • Waiting: 프로세스가 리소스를 기다리고 있는 경우
  • Terminated: 실행이 완료되었거나 OS에 의해 종료된 상태

공정 제어 블록(PCB)

프로세스는 프로세서 제어 블록(PCB)을 사용하여 운영 체제에 의해 내부적으로 표현. 작업 제어 블록이라고도 함

PCB에는 다음 정보가 포함

  • 프로세스ID
  • 프로세스 상태
  • 프로세스 제어 정보(스케줄링 정보, 프로그램 카운터(프로세스가 다음에 실행할 명령어 주소), 프로세서 권한, CPU 레지스터(누산기, 스택, 색인 레지스터 등))

프로세스 생성 및 종료

exec() 및 fork()

프로세스는 다른 시스템 호출을 통해 새성.

  • exec(): 현재 프로세스 이미지를 새 프로세스 이미지로 바꾼다.
  • fork(): 호출 프로세스를 복제하여 새 프로세스를 생성. 새 프로세스를 자식 프로세스라고도 하며 호출 프로세서를 상위, 부모 프로세스라고도 함.

고아 프로세스

고아 프로세스는 부모 프로세스가 자식 프로세스보다 먼저 종료되면 자식 프로세스는 고아프로세스가 됨

좀비 프로세스

자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우, 자식 프로세스를 좀비 프로세스라고 함.

스레드

실행 스레드는 스케줄러에서 독립적으로 관리할 수 있는 가장 작은 명령 시퀀스. 스레드는 프로세스의 작은 구성 요소이며 여러 스레드가 동시에 실행되고 동일한 코드, 메모리, 변수 등을 공유 할 수 있음

각 스레드는 동일한 코드, 데이터 및 힙 블록을 공유하지만 고유한 스택을 가짐. 스레드는 자체 스택 메모리를 가지고 있기 때문에 종종 경량 프로세스라고 함.

프로세스 대 스레드

  • 프로세스와 스레드의 주요 차이점은 다른 프로세스는 동일한 메모리 공간 (코드, 변수 등)을 공유할 수 없는 반면 동일한 프로세스의 다른 스레드는 동일한 메모리 공간을 공유하는 것.
  • 스레드는 가볍지만 프로세스는 무겁다.
  • 스레드 전환은 OS와 상호 작용할 필요가 없지만 프로세스 전환은 OS와 상호 작용이 필요
  • 스레드가 변수를 변경하면 동일한 프로세스의 다른 모든 스레드가 이를 볼 수 있음.

멀티스레딩

멀티스레딩은 여러 스레드가 동시에 실행될 수 있도록 하는 CPU의 기능. 멀티스레딩은 단일 코어의 활용도를 높이는 것을 목표로 하기 때문에 멀티프로세싱과 다름.

동시성과 병렬성

동시 처리는 다른 작업이 동시에 진행되고 있음을 의미. 이것은 병렬로 실행된다는 의미가 아니라 단일 CPU를 최대한 활용하기 위해 서로 다른 스레드를 예약하여 작동.

병렬 처리는 다른 스레드가 동시에 처리되고 있음을 의미. 이것은 서로 다른 CPU에 서로 다른 스레드를 분산하여 수행 가능.

멀티스레딩의 장점과 단점

  1. 장점
  • CPU활용도 향상
  • 더 높은 처리량
  • 더 반응적인 프로그램
  • 자원의 효율적인 활용
  1. 단점
  • 복잡한 디자인
  • Race Conditions
  • Deadlocks
  • Starvation
  • Livelock
  • Thread Context Switch

프로세스 스케줄링

멀티프로그래밍은 CPU가 여러 작업을 실행하여 CPU활용도를 높이는 기술. 이것은 일반적으로 메모리에 여러 작업을 유지한 다음 몇 가지 스케줄링 알고리즘을 사용하여 언제 작업이 선택되는지 결정함으로써 수행. 프로세스 스케줄링은 OS가 수행. OS는 다양한 프로세스 상태(Start, Ready, Running, Waiting 등)에 대해 서로 다른 대기열을 유지 관리.

프로세스 스케줄러의 유형

최대 CPU 사용률로 다중 프로그래밍을 늘리고 메모리에서 프로세스를 관리하기 위해 함께 작동하는 세 가지 유형의 프로세스 스케줄러가 있음

  • 장기 스케줄러(작업 스케줄러)
  • 단기 스케줄러(CPU 스케줄러)
  • 중기 스케줄러(프로세스 스와핑 스케줄러)

장기 스케줄러(작업 스케줄러)

프로세스를 'Ready Queue'로 가져와 다중 프로그래밍의 정도를 제어. 프로세스를 'New' 상태에서 'Ready' 상태로 이동

장기 스케줄러는 균형을 유지하기 위해 CPU 바운드 프로세스와 I/O 바운드 프로세스 사이를 신중하게 선택하여 대기열에 추가할 프로세스를 결정

단기 스케줄러(CPU 스케줄러)

단기 스케줄러는 프로세스를 '준비' 상태에서 '실행 중' 상태로 이동. 'Ready Queue'에서 프로세스를 이동하고 디스패처를 사용하여 처리하도록 CPU에 제공. CPU 사용률을 최대화하고 시스템 성능을 높이려고 함.

단기 스케줄러는 장기 및 중기 스케줄러에 비해 매우 빈번하고 매우 빠르게 스케줄링 결정을 내립니다.

중기 스케줄러(프로세스 스와핑 스케줄러)

중기 스케줄러는 주 메모리에서 보조 메모리(예: 디스크 공간)로 프로세스를 스왑 인 및 아웃하는 작업을 수행.(다른 프로세스에서 사용할 수 있는 메모리를 만들기 위해) 일정 시간 동안 비활성화된 프로세스나 메모리를 많이 차지하는 프로세스 또는 우선 순위가 낮은 프로세스를 교체. 메모리를 사용할 수 있거나 프로세스가 차단 해제된 경우 등에 프로세스를 교체.

중기 스케줄러는 장기 스케줄러에 비해 더 자주, 더 빠르게 스케줄링 결정을 내림

컨텍스트 스위칭(Context Switching)

멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세서의 상태 또는 레지스터 값(context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(context)를 교체하는 작업. 자주 하면 오버헤드 발생

Contect란 CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보 (PCV에 저장됨)

인터럽트

인터럽트는 CPU가 프로그램을 실행하고 있을 때 실행중인 프로그램 밖에서 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 예외 상황을 처리할 수 있도록 하는 것을 말한다.어떤 인터럽트 요청이 와야 Context Switching이 일어날까?
1. I/O request (입출력 요청할 때)
2. time slice expired (CPU 사용시간이 만료 되었을 때)
3. fork a child (자식 프로세스를 만들 때)
4. wait for an interrupt (인터럽트 처리를 기다릴 때)

선점 및 비선점 스케줄링

선점은 나중에 재개할 의도로 실행 중인 작업을 일시적으로 중단하는 행위. 이것은 컨텍스트 스위칭을 통해 스케줄러에 의해 수행

선점형 또는 비선점형인 다양한 스케줄링 알고리즘이 있음

선점형 스케줄링 알고리즘은 몇 가지 기준에 따라 우선 순위가 높은 프로세스로 우선 순위가 낮은 프로세스를 선점
비선점 스케줄링 알고리즘은 프로세스가 '실행 중' 상태가 된 후 프로세스를 선점하지 않음

Race Condition

경쟁 조건은 여러 프로세스 또는 스레드 간에 발생할 수도 있음

  • 여러 프로세스가 메모리, DB, 캐시, 대기열 등과 같은 동일한 리소스에 액세스하고 업데이트한다.
  • 여러 스레드가 동일한 변수에 액세스하고 업데이트하려고 한다.

경쟁 조건은 동시 다중 스레드 응용 프로그램에서 버그로 이어짐

Critical Section

임계 구역에서 경쟁 조건을 피하기 위해 임계 구역은 원자적 연산으로 처리. 이것은 주어진 시간에 하나의 스레드만 임계 영역에 들어갈 수 있도록 함으로써 수행. 다른 스레드는 이전 스레드가 임계 영역을 종료한 후에만 해당 스레드에 액세스해야 함. 이를 달성하기 위한 다양한 동기화 도구가 있음

임계 구역 문제를 해결하려면 세 가지 조건이 필요

상호 배제(Mutual Exclusion) : 특정 시점에 하나의 스레드/프로세스만 임계 섹션에 있을 수 있음
진행률(Progress) : 임계 구역에 스레드/프로세스가 없고 다른 스레드가 임계 구역에 들어가기를 기다리고 있는 경우 그 중 하나가 임계 구역에 들어갈 수 있도록 허용.
Bounded Waiting : 프로세스/스레드는 임계 영역에 들어가기 위해 무기한 기다리지 않아야 함. 프로세스/스레드가 임계 섹션에 들어가도록 요청한 후 그리고 요청이 승인되기 전에 임계 섹션에 들어가는 것이 허용될 수 있는 다른 프로세스/스레드의 수에 대한 경계가 있어야 함

Synchronization Tools

Semaphore

  • 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줌 (동기화 대상이 하나 이상)
  • 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성. 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있으며, 각 프로세스는 세마포어의 값을 확인하고 변경 가능.
    자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스가 즉시 자원을 사용하고. 이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 함.
  • 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 사용

Mutex

  • 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아줌 (동기화 대상이 하나)

  • 임계구역(Critical Section)을 가진 스레드들의 실행시간(Running Time)이 서로 겹치지 않고 각각 단독으로 실행(상호배제_Mutual Exclution)되도록 하는 기술

  • 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법이고 Key에 해당하는 어떤 객체(Object)가 있으며, 이 객체를 소유한 스레드/프로세스만이 공유자원에 접근 가능.

  • 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화(Synchronization) 또는 락(Lock)을 사용함으로써 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없음

Deadlock

교착 상태는 두 개 이상의 프로세스가 리소스의 주기적 종속성을 가지고 있기 때문에 더 진행할 수 없는 상황. 교착 상태에서 프로세스는 '대기 중' 상태임. 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

Livelock

두 개 이상의 프로세스가 서로의 변경 사항에 따라 계속해서 동일한 작업을 수행하는 상황. 라이브록에서는 프로세스가 '실행 중' 상태에 있지만 진행이 되지 않음

라이브락은 두 스레드가 락의 해제와 획득을 무한 반복하는 상태
라이브락은 데드락을 피하려는 의도에서 수정한 코드가 불완전할 때 발생

Starvation

프로세스가 끊임없이 필요한 컴퓨터 자원을 가져오지 못하는 상황으로, 이러한 자원 없이는 처리를 끝낼 수 없는 병행 컴퓨팅에서 마주치는 문제

profile
열심히 살자

0개의 댓글