1월8일 월 TIL

장숭혁·2024년 1월 8일
0

TIL작성

목록 보기
44/60

Process와 Thread의 차이

  • Process

  • Thread

프로세스는 운영체제에서 관리하는 작업의 단위로, 연산 작업들이 연속적으로 이어져 내려온다는 것을 의미한다. 이 연속적인 흐름은 프로세스 수준에서는 하나만 존재하며, 외부 요인에 따라 그 흐름이 바뀔 수 있다.

스레드는 프로세스 내에서 실행되는 여러 흐름의 단위로, 프로세스는 반드시 한 개 이상의 스레드를 가지고 있다. 흐름이 여러 개 존재할 때, 이들은 동시에 각자의 작업을 수행한다. 이렇게 코드의 실행 순서가 여러 흐름으로 나뉘는 것을 스레드라고 부른다.

여러 개의 스레드가 동시에 작동하는 것을 '멀티스레딩(Multi-Threading)'이라고 한다. 이는 한 프로세스 내에서 여러 작업을 동시에 처리할 수 있게 해주어 효율성을 높인다.

컴퓨터의 세계는 크게 세 가지 계층, 즉 '사용자 모드(User Mode)', '커널 모드(Kernel Mode)', 그리고 '하드웨어 모드(Hardware Mode)'로 이루어져 있다.

사용자 모드에서는 일반적인 응용 프로그램이 실행되며, 커널 모드에서는 운영체제의 핵심 부분이 실행된다. 하드웨어 모드는 실제 컴퓨터 하드웨어가 동작하는 단계이다.

컴퓨터의 중앙 처리 장치(CPU)는 여러 코어를 가질 수 있으며, 연산을 수행할 때 하드 디스크보다는 RAM(1차 메모리 또는 주 기억 장치)을 사용한다. RAM은 빠른 접근 속도를 가지므로 연산에 효율적이다.

운영체제(OS)는 프로세스에 가상 메모리를 할당한다. 프로세스 내의 모든 스레드는 이 할당된 가상 메모리 공간에서 동작하며, 그 공간은 제한적이다.

멀티스레딩은 '동시성(Concurrency)'과 '동기화(Synchronization)'라는 개념을 함께 내포한다. 동시성은 여러 스레드가 동시에 작동하는 것을 의미하며, 동기화는 이러한 동시에 수행되는 스레드들이 서로 올바르게 작동하도록 조정하는 것을 가리킨다.

'프로세스'는 한 가구(집)와 같이 상상할 수 있다. 한 가구에 세 명의 세대원이 각각 자신의 방을 가지고 있고, 부엌이나 화장실 같은 공용 공간을 공유하는 것처럼, 프로세스 내에서는 여러 스레드가 각자의 공간을 가지며 일부 공간을 공유한다. 이 때 '가구(집)'는 가상 메모리 공간으로 볼 수 있으며, '세대원'은 각자의 흐름을 가지는 스레드를 의미한다.

스레드는 각자의 스택과 힙을 가지며, 이는 스레드 로컬 스토리지(TLS)로 불린다. 스레드마다 고유한 TLS를 가지고 있다. 이는 '각자의 방'과 같이 생각할 수 있다. 이들이 모여 살고 있는 공간은 운영체제가 프로세스에 부여한 가상 메모리 공간으로 제한되며, 이는 '공용 공간(화장실, 부엌, 거실)'을 상상하면 이해하기 쉽다.

만약 일거리가 있다면, 세 사람이 리소스를 공유해서 사용할 것인지, 아니면 각자 따로 작업할 것인지 결정해야 한다. 이는 가상 메모리가 각 스레드에 개별적으로 부여되고, 각 스레드가 독립적으로 스택과 힙을 가지는 '재택근무'와 같다.

어떤 방식이 더 효율적인지는 운영체제의 설계 철학에 따라 달라진다. 윈도우는 스레드 위주의 철학을 가지고 있으며, 리눅스는 프로세스 위주의 정책을 가지고 있다. 도커는 이러한 리눅스의 철학을 공유하는 측면을 가지고 있다.

https://www.youtube.com/watch?v=x-Lp-h_pf9Q 이 유튜브를 보고 제 나름대로 정리하였습니다.

CPU와 Core와의 관계

CPU

CORE

CPU(중앙 처리 장치)는 컴퓨터의 뇌라고 할 수 있는 핵심적인 부품으로, 모든 연산과 명령을 처리하는 역할을 담당한다.

코어는 CPU 내부에 위치한 독립적인 처리 장치를 의미한다. 각 코어는 독립적으로 명령을 수행할 수 있다.

  • 코어의 수는 CPU가 동시에 처리할 수 있는 작업의 수를 결정하게 된다.
  • 코어의 수가 많을수록 동시에 처리할 수 있는 작업의 수가 많아지므로, 병렬 처리 능력이 향상되고 전반적인 시스템 성능이 향상된다. (어플리케이션이 멀티 코어를 지원하고, 운영체제가 적절하게 스레드를 분배할 수 있을 때에 한해서이다.)

SSE 방식 JavaSpring&MongoDB 코드 분석

-Controller
@CrossOrigin
@GetMapping(value = "/chat/roomNum/{roomNum}",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Chat> findByUsername(@PathVariable Integer roomNum){
return chatRepository.mFindByRoomNum(roomNum)
.subscribeOn(Schedulers.boundedElastic());
}

-Repository
@Tailable
@Query("{roomNum:  ?0}")
Flux<Chat> mFindByRoomNum(Integer roomNum);
"produces = MediaType.TEXT_EVENT_STREAM_VALUE) 

@CrossOrigin은 스프링 프레임워크에서 제공하는 어노테이션으로, Cross-Origin Resource Sharing (CORS)를 활성화 하는 데 사용된다. 이 어노테이션을 사용하면 해당 컨트롤러의 엔드포인트에 대한 Cross-Origin 요청을 허용할 수 있다. @GetMapping 어노테이션과 함께 사용되어 특정 URL에 대한 GET 요청에 대해 CORS 정책을 설정할 수 있다.

produces = MediaType.TEXT_EVENT_STREAM_VALUE@GetMapping 어노테이션의 옵션 중 하나이다. 이 옵션은 해당 엔드포인트의 응답 형식을 지정하는 데 사용된다. MediaType.TEXT_EVENT_STREAM_VALUE는 SSE(Server-Sent Events)를 사용하여 텍스트 이벤트 스트림을 반환하도록 설정한다. 따라서 클라이언트가 이 엔드포인트에 대해 GET 요청을 보내면, 서버는 SSE 형식으로 지속적인 이벤트 스트림을 반환한다.

@TailableSpring Data MongoDB에서 제공하는 어노테이션으로, 커서컬렉션을 계속해서 모니터링하고 변경 사항을 반환할 수 있도록 한다. 이 어노테이션은 MongoDB의 tailable 커서를 사용하여 엔티티를 검색하고, 변경 사항을 계속해서 감지하는 데 사용된다.

FluxReactor 프로젝트에서 제공하는 리액티브 스트림 타입 중 하나이다. Flux는 0개 이상의 요소를 비동기적으로 발행하는데 사용되며, 이 경우 Chat 객체의 Flux를 반환한다. Flux은 SSE 형식으로 지속적인 이벤트 스트림을 통해 채팅 데이터를 비동기적으로 반환한다.

.subscribeOn(Schedulers.boundedElastic())는 Reactor의 스케줄러를 지정하여 비동기적으로 작업을 수행하는 데 사용된다. boundedElastic 스케줄러는 bounded 쓰레드 풀을 사용하여 작업을 처리하며, 이를 통해 블로킹 작업이나 I/O 작업을 비동기적으로 처리할 수 있다. 따라서 Flux 스트림의 처리는 boundedElastic 스케줄러에서 실행된다.

profile
코딩 기록

0개의 댓글

관련 채용 정보