Thread에 대하여

짱구·2023년 10월 12일
1
post-thumbnail

Program

  • Program은 Process의 집합으로 디스크에 저장되어 있는 정적인 상태입니다.

  • 하나의 Program은 여러 개의 Process를 가질 수 있습니다.

ex) 크롬 브라우저는 각각의 탭마다 별도의 Process를 생성합니다.

Process

  • Process는 Program이 실행 중인 상태를 의미합니다.

  • Program이 메모리에 로드되어 활성화되면 Process가 됩니다.

  • Process는 레지스터, 프로그램 카운터, 스택 등과 같은 중요한 자원이 필요합니다.

  • Process가 시작되면 메모리와 cpu 코어 등 자원을 할당받습니다.

  • 하나의 Process는 하나 이상의 Thread를 가질 수 있습니다.

ex) Microsoft Word 앱에서 Thread 하나는 맞춤법 검사를 담당하고 다른 Thread는 문서에 텍스트를 삽입할 수 있습니다.

Thread

  • Thread는 프로세스 내에서 실행되는 가장 작은 실행 단위입니다.

  • 생성 및 종료에 많은 시간이 걸립니다.

  • Thread는 OS의 Kernel에게 작업을 요청하고 CPU가 요청받은 작업을 실행합니다.

Process와 Thread의 차이점

  1. Process는 보통 독립적이며 Thread는 Process의 하위 집합으로 존재합니다.

  2. Process는 각각 고유한 메모리 공간을 가지고 있습니다.

  3. 하나의 Process에 속하는 Thread들은 동일한 메모리를 공유하기 때문에 Thread 간의 통신은 성능적으로 우수합니다.

  4. Process 간의 Context Switching은 Thread 간의 Context Switching보다 더 많은 비용이 듭니다.

Context Switching

  1. CPU는 Thread 1의 요청이 완료되거나 실행 시간이 길어졌을 때(CPU Scheduling) Thread 1이 요청한 작업을 중단하고 Thread 2의 요청을 처리합니다.

  2. 그때 Thread 1의 작업 내용을 register에 저장하고 후순위로 미룹니다.

  3. 이후 다시 register에서 Thread 1의 순서가 되면 작업 내용을 불러와 처리를 계속 이어나갑니다.

  4. 이것을 Context Switching라고 하며 Context Switching이 자주 발생하면 성능 저하가 발생합니다.

Spring MVC Thread

  1. Spring MVC는 서블릿 기반의 웹 프레임워크이며 기본적으로 Thread Pool이라는 곳에서 Thread를 관리합니다.

  2. Thread들은 기본적으로 200개가 존재하며 Blocking 방식으로 실행이 됩니다.

  3. Blocking 방식이란 Thread가 OS의 Kernel에게 요청을 할 때 반환 값을 받을 때까지 Thread가 기다리게 됩니다.

예시

	fun getPosts(): Page<PostResponse> = postRepository.findAll()
  1. getPosts() 함수가 호출되면 postRepository.findAll() 메서드가 실행됩니다.

  2. Thread가 OS의 Kernel에게 DB 접근 요청을 보내고 Kernel은 CPU에게 데이터베이스에 접근하라는 명령어를 실행시킵니다.

  3. 커널은 해당 조회 요청을 받아들이고 CPU가 데이터베이스 프로그램을 실행합니다.

  4. 데이터베이스 프로그램은 조회 요청 받았으며 디스크에 접근해야 하기 때문에 조회 요청을 Kernel에게 보냅니다.

  5. Kernel은 CPU에게 디스크에 조회 요청을 보낸 후 조회를 하고 결과를 데이터베이스 프로그램에게 반환합니다.

  6. Thread는 아무 작업도 하지 않고 위 모든 작업이 끝날 때까지 기다립니다.

WebFlux Thread

  1. WebFlux는 Spring Framework의 리액티브 웹 모듈로 Netty 기반으로 구성되어있습니다.

  2. Thread는 기본적으로 하나의 CPU 코어에 1:1 할당이 되어 Context Switching이 발생하지 않으며 Async NonBlocking 방식으로 실행이 됩니다.

  3. Hyper Thread라는 하드웨어 Thread가 지원되는 환경이면 Netty Server는 (CPU 코어 * 2) 개의 Thread를 가지고 그렇지 않다면 할당된 CPU 코어의 수 만큼의 Thread를 가지게 됩니다.

  4. NonBlocking 방식이란 Blocking 방식과 다르게 Thread가 OS의 Kernel에게 요청을 전달하고 반환 값을 기다리지 않습니다.

  5. 이로 인해 Thread는 반환 값을 받지 않고 다른 요청을 처리합니다.

  6. 그리고 반환 값은 콜백 함수나 이벤트 루프가 돌 때 Thread가 반환 값을 캐치하여 클라이언트에게 전달해줍니다.

예시

	suspend fun getPosts(): Page<PostResponse> = postRepository.findAll()
  1. Spring MVC와 똑같이 getPosts() 함수가 호출되면 postRepository.findAll() 메서드가 실행됩니다.

  2. 하지만 Thread는 값을 반환 받는 것을 기다리지 않고 다른 작업을 실행합니다.

  3. 반환 값을 받고 이벤트 루프가 돌면 Thread는 클라이언트에게 값을 전달합니다.

Hyper Thread

  • Hyper Thread는 하나의 물리적인 CPU Core두 개의 논리적인 CPU Core로 나누어 동작시키는 기술입니다.

  • 두 개의 논리적인 CPU Core는 독립적으로 실행될 수 있게 되고 동시에 두 가지의 명령어를 처리할 수 있습니다.


2부 코루틴에서 계속...

profile
코드를 거의 아트의 경지로 끌어올려서 내가 코드고 코드가 나인 물아일체의 경지

0개의 댓글