프로그램을 실행 해주는 주체 = 프로세스 🏡
- 자신만의 고유 공간과 자원을 할당받아 사용
- 프로그램 단위
- 프로세스는 최소 하나 이상의 쓰레드를 보유
- 각각 별도의 주소 공간을 독립적으로 할당 받는다 (code,heap,stack)
📌 프로세스 만으로 작업을 처리할때의 문제점
- 프로세스 생성에 큰 오버헤드가 있음. * 프로세스 생성시 많은시간 소요
- 다른 프로세스 사용시 컨텍스트 스위칭의 비효율성이 생김.
- 프로세스 사이에 통신이 어려움. 비용이 비싼 IPC 사용해서 통신을 한다. (또는 LPC, 공유 메모리)
작업을 처리 해주는 주체 = 쓰레드 💁
- 쓰레드는 프로세스안에서 작업을 처리하는 주체 이다.
- 쓰레드는 자원 중에 stack 만 따로 할당받고 나머지 영역은 쓰레드끼리 서로 공유한다.
📌 쓰레드가 해결한 문제들 (무거운 프로세스가 하는 행동을 가볍게 대체)
- 프로세스 보다 크기가 작은 실행 단위 구현
- 프로세스의 생성 및 소멸에 따른 오버헤드 감소
- 쓰레드간 자원을 공유 함으로써 빠른 컨텍스트 스위칭
- 프로세스 들의 통신 시간, 방법 어려움 해소
- 치킨집을 하는 집(프로세스)🏡안에서 실제 업무를 분담에서 하는 직원(쓰레드)💁볼 수 있다.
(치킨 튀기는 직원, 주문받고 계산하는 직원, 서빙하고 설거지하는 직원)- 치킨집 안의 공간과 재료를 같이 쓴다. (쓰레드 자원 공유)
프로세스와 쓰레드의 차이점
프로세스 | 스레드 | |
정의 | - 실행중인 프로그램 - 독립적인 메모리 공간을 가지고 있음 |
- 프로세스 내에서 실행되는 여러가지 실행흐름 - 공유된 공간에서 작업처리 함 |
생성 | - 운영체제로 부터 자원 할당 및 제어 | - 프로세스 내에서 스레드를 생성하여 제어 |
독립성 | - 다른프로세스와 독립적으로 실행 | - 프로세스 내의 스레드들은 공유메모리에 접근하여 동시 실행 |
통신 | - IPC(inter-Process Communication)을 통해 통신 | - 공유 메모리나 메시지 전달 등을 통해 통신 |
오버헤드 | - 큼 | - 비교적 작음 |
안정성 | - 프로세스 오류로 다른 프로세스 영향을 주지 않음 | - 한 스레드의 오류가 전체 프로세스의 영향을 줄 수 있음 |
프로세스 내의 스레드 자원 공간 ( Stack 따로 / Code ,Data , Heap 공유 )
- 코드 영역(code area): 프로그래머가 작성한 프로그램이 저장 영역
- 데이터 영역(data area): 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들의 집합 영역
- 스택 영역(stack area): 호출한 함수의 종료 후 되돌아갈 메모리의 주소나 지역 변수 등 저장 영역
- 힙 영역(heap area): 동적으로 할당 데이터 영역
쓰레드 풀
프로그램이 작업을 동시에 실행할 수 있도록 여러 스레드를 미리 생성해두고 유지 관리 한다.
- 여러 Thread를 동시에 만들어 실행(병렬처리)할 수 있다.
쓰레드 풀은 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고
작업 큐(Queue)에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 것을 말한다.
💁 쓰레드 풀의 동작
- 초기화: 쓰레드 풀을 사용하기 전에 초기화해야 한다. 쓰레드 풀의 크기, 최대 쓰레드 수, 작업 큐 등의 매개변수를 설정한다.
- 작업 수신: 쓰레드 풀은 작업을 수신하고 처리할 준비를 합니다. 작업은 일반적으로 작업 큐에 추가된다.
- 작업 수행: 쓰레드 풀에서는 미리 생성된 쓰레드들이 작업 큐를 모니터링하고 대기 중인 작업을 가져와 처리한다. 이때 쓰레드 풀 내의 쓰레드들은 일반적으로 무한 루프를 돌면서 작업을 가져오기 위해 대기한다.
- 작업 처리: 쓰레드 풀의 스레드가 작업을 가져와서 처리한다. 작업은 일반적으로 작업 큐에서 FIFO(선입선출) 방식으로 가져오게 된다.
- 작업 완료 및 반환: 작업이 완료되면 해당 결과를 반환하고, 쓰레드는 다시 작업 큐에서 새로운 작업을 가져오기 위해 대기 상태로 돌아간다.
- 작업 대기: 작업 큐에 새로운 작업이 추가되면 쓰레드 풀의 스레드들은 대기 상태를 벗어나 작업을 가져와 처리한다. 이를 반복하여 계속적으로 작업을 수행한다.
- 종료: 쓰레드 풀을 더 이상 사용하지 않을 때 종료합니다. 종료할 때는 모든 작업이 완료되었는지 확인하고, 필요에 따라 남은 작업들을 처리하거나 버릴 수 있다.
동시성
싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 성질을 말한다.
동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것.
병렬성
멀티 코어에서 멀티 스레드를 동작시키는 방식으로, 한 개 이상의 스레드를 포함하는 각 코어들이 동시에 실행되는 성질을 말한다. 병렬성은 데이터 병렬성(Data parallelism)과 작업 병렬성(Task parallelism)으로 구분된다.
- 데이터 병렬성
데이터 병렬성은 전체 데이터를 쪼개 서브 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말한다.
자바8에서 지원하는 병렬 스트림이 데이터 병렬성을 구현한 것.
서브 데이터는 멀티 코어의 수만큼 쪼개어 각각의 데이터들을 분리된 스레드에서 병렬 처리한다.
- 작업 병렬성
작업 병렬성은 서로 다른 작업을 병렬 처리하는 것을 말한다.
대표적인 예는 웹 서버로, 각각의 브라우저에서 요청한 내용을 개별 스레드에서 병렬로 처리한다.
'개-발 > 이론' 카테고리의 다른 글
[MSA]Monolithic / MSA 아키텍처의 장 단점 (0) | 2024.07.05 |
---|---|
[CS] Spring Web MVC의 Dispatcher Servlet의 동작 원리 (0) | 2023.11.03 |
[CS] HTTP Method 특성 (멱등성, 안정성) (0) | 2023.04.24 |
[CS]웹 브라우저에 URL 입력하면 일어나는 일 (0) | 2023.04.14 |
[CS지식] JVM(Java Virtual Machine) 이해하기 (1) | 2022.11.30 |