[OS] 프로세스, 스레드

mingsso·2023년 11월 1일
0

CS

목록 보기
17/30
post-custom-banner

1️⃣ 프로세스의 개념

프로세스는 "실행 중인 프로그램"을 의미한다!

프로그램이 실행 중이라는 것 = 보조기억장치에 저장되어 있던 프로그램을 주기억장치에 적재하여, CPU가 실행하고 있거나 실행 예정인 것

  • 즉, 운영체제가 프로그램에 메모리를 할당하여 실행하면 프로세스가 됨
    이때 할당 받는 시스템 자원은 CPU 시간, 운영되기 위해 필요한 주소 공간, 독립된 메모리 영역(code, data, heap, stack)임
  • 기본적으로 프로세스당 최소 1개의 스레드를 가지고 있음
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없음
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간 통신(IPC, Inter-Process-Communication)이 필요함



2️⃣ PCB (Process Control Block)

운영체제가 프로세스를 제어하기 위해 정보를 저장해놓은 곳

PCB는 Context Switching 시 사용되는데, CPU 가 여러 프로세스를 빠르게 번갈아가며 작업하기 위해서는 프로세스에 대한 정보 및 상태를 저장/복원 할 필요가 있기 때문

❓Context Switching (문맥 교환)

*문맥 = 프로세스의 정보 및 상태 (PCB에 문맥을 저장하는 것)

하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 CPU에 적재하는 작업

하나의 CPU에서 여러 개의 프로세스가 동시에 수행되는 것처럼 보이는 이유는 문맥 교환이 빠르게 일어나고 있기 때문!

  • PCB는 PID(프로세스 식별자), 프로세스 상태, 프로그램 카운트(다음 실행할 명령어 주소), 레지스터 정보(Stack Pointer, General Register 등), 프로세스 스케줄링 정보, 계정 정보, 입출력 상태 정보, 메모리 관리 정보로 구성됨
  • PCB는 프로세스 생성 시 만들어지고, 주기억장치(커널 영역)에 유지되며, 운영체제에서 한 프로세스 전체를 정의함



3️⃣ 프로세스의 상태

  1. 생성(New)
    사용자의 요청에 의해 PCB가 생성이 되고, 프로세스가 메인 메모리에 적재되어 실행 준비를 마친 상태
  1. 준비(Ready)
    프로세스가 CPU를 얻을 때까지 자신의 차례를 기다리는 상태 (= ReadyQueue에 들어와 있는 상태)
  1. 실행(Run)
    ReadyQueue에 있던 프로세스가 자신의 차례를 부여받아 실제로 수행되는 상태
  1. 대기(Wait)
    프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료되기를 기다림 (= DeviceQueue에 들어와 있는 상태)
  • 준비 큐(ReadyQueue) = CPU 할당을 대기 중인 프로세스
  • 대기 큐(DeviceQueue) = 입출력 장치 할당을 대기 중인 프로세스
  1. 종료(Exit)
    프로세스가 자신의 작업을 모두 마친 뒤, 운영체제가 PCB를 제거하고 메인 메모리에서 빠져나간 상태

2→3 디스패치
ReadyQueue의 맨 앞에 있던 프로세스가 CPU를 점유하게 되는 것

3→2 Timer Runout
할당받은 CPU 시간이 초과되면, CPU 반납 후 다시 준비 상태로 전이됨

4→2 Wake Up
입출력이 완료되어 CPU 할당을 기다리는 상태



4️⃣ 멀티 프로세스

두 개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것(병렬처리)

  • 장점
    • 독립된 구조로 안전성이 높음
    • 즉, 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않음
  • 단점
    • 독립된 메모리 영역이기 때문에 작업량이 많을수록(Context Switching이 자주 일어나서 주소 공간의 공유가 잦을 경우), 오버헤드가 발생하여 성능 저하가 발생함




1️⃣ 스레드의 개념

프로세스 내에서 실제로 작업을 수행하는 주체를 의미함

  • 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행함 → 프로세스는 스레드에 대한 일종의 컨테이너 역할을 함
  • 두 개 이상의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 함
  • 즉, 스레드는 프로세스 내에서 실행되는 여러 흐름의 단위


스레드의 구조

스레드는 프로세스 내에서 독립된 Stack 영역을 할당받고, Code, Data, Heap 영역은 다른 스레드와 공유함

Stack 영역만 따로 할당받는 이유
스택은 함수 호출시 전달되는 인자, 복귀 주소값 및 지역변수 등을 저장하기 위해 사용되는 메모리 공간
각 스레드는 각각의 코드 및 실행 순서를 가질 수 있기 때문에, 스택 영역은 스레드마다 독립적으로 할당해야 함

TCB(Thread Control Block)

PCB처럼 TCB는 각 스레드마다 운영체제에서 유지하는 스레드에 대한 정보를 담고 있음

  • TCB는 PCB 안에 들어 있음
  • 스레드ID, 스택 레지스터, 프로그램 카운터, 스레드의 상태(running, ready, waiting, start, done), PCB 포인터가 들어감
  • 스레드가 생성될 때 운영체제에 의해 생성되며, 스레드가 실행을 마치고 소멸될 때 함께 소멸됨



2️⃣ 멀티 스레드

CPU의 최대 활용을 위해 프로세스가 두 개 이상의 스레드를 동시에 실행하는 것

문맥 교환이 엄청 빠르게 일어나면서, 사용자의 시선에서는 스레드가 동시에 실행되는 것처럼 보임

장점

  • 응답성이 향상됨
    • 스레드 중 일부가 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가함
  • 자원을 효율적으로 사용할 수 있음
    • 프로세스 내에서 자원을 공유하기 때문에 멀티 프로세싱에 비해 자원 소모가 적음. 스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있음
  • 프로세스의 문맥 교환에 비해 스레드의 문맥 교환이 더 빠름
    • TCB에는 Stack 및 간단한 포인터 정보만을 저장하기 때문에 PCB보다 TCB가 가벼워 더 빨리 읽고 쓸수 있음
    • 프로세스 문맥교환의 경우, 다른 프로세스의 실행으로 인해 CPU가 새로운 명령어와 데이터를 로드해야 하기 때문에 CPU 캐시 메모리를 초기화 하여야 함
    • 하지만 스레드 문맥교환의 경우, 프로세스 내 스레드 간에 스택과 레지스터 값 등 일부 컨텍스트 정보만 변경되므로 CPU 캐시 메모리는 초기화되지 않음

단점

  • 동기화에 주의해야 함
    • 프로세스와 달리 스레드는 데이터와 힙 영역을 공유하기 때문에, 특정 스레드가 다른 스레드에서 사용 중인 데이터에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있음
    • 동기화를 위해서 락을 과도하게 사용하면 성능 저하가 발생할 수 있음
  • 교착상태가 발생하지 않도록 주의해야 함



3️⃣ 스레드 안전(Thread-Safety)

멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것

스레드 안전 여부 확인 방법

아래 세 가지를 통해 스레드 안전 상태인지 판단할 수 있음

  • 전역 변수나 힙, 파일과 같이 여러 스레드가 동시에 접근할 수 있는 자원을 사용하는가
  • 핸들과 포인터를 통한 데이터의 간접 접근이 가능한가
  • 부수 효과를 가져오는 코드가 있는가

스레드 안전을 지키기 위한 설계 방법

  • 상호 배제(Mutual Exclusion)

    • 공유 자원에 하나의 스레드만 접근할 수 있도록 세마포어/뮤텍스로 락을 통제하는 방법
  • 원자 연산(Atomic Operation)

    • 공유 자원에 접근할 때는 원자 연산을 이용함
    • 공유 자원 변경을 수행하는 연산을 원자적으로 분리한 뒤에, 실제로 데이터의 변경이 이루어지는 시점에 락을 걸고 데이터를 변경하는 시간 동안 다른 스레드의 접근이 불가능하게 함
  • 스레드 로컬 저장소(TLS, Thread-Local Storage)

    • TLS는 스레드가 각각 가지고 있는 저장소임
    • 공유 자원의 사용을 최대한 줄이고 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법
    • 일반적으로 공유 상태를 피할 수 없을 때 사용하는 방식






참고자료

https://dololak.tistory.com/3
https://trumanfromkorea.tistory.com/51
https://80000coding.oopy.io/ef52431e-cf52-497b-824f-bcb365144c7a
https://ko.wikipedia.org/wiki/프로세스제어블록
https://ko.wikipedia.org/wiki/문맥_교환
https://velog.io/@mingadinga_1234/프로세스란-프로세스의-상태
https://enlqn1010.tistory.com/30
https://livenow14.tistory.com/67
https://show400035.tistory.com/170
https://velog.io/@nnnyeong/OS-프로세스와-스레드-Process-VS-Thread
https://en.wikipedia.org/wiki/Thread_control_block
https://velog.io/@gil0127/싱글스레드Single-thread-vs-멀티스레드-Multi-thread-t5gv4udj
https://mgyo.tistory.com/456
https://developer-ellen.tistory.com/205
https://inpa.tistory.com/entry/👩‍💻-프로세스-⚔️-쓰레드-차이#프로세스컨텍스트스위칭vs스레드컨텍스트스위칭
https://learn.microsoft.com/ko-kr/cpp/c-language/thread-local-storage?view=msvc-170
https://learn.microsoft.com/ko-kr/windows/win32/procthread/thread-local-storage

profile
🐥👩‍💻💰
post-custom-banner

0개의 댓글