thread

· CS
개요 일반적으로, Process와 Thread의 차이를 말할 때 다음과 같은 글을 마주할 수 있습니다. (Process와 Thread의 차이 : https://nangmandeveloper.tistory.com/4) 위와 같은 글에서 Process와 Thread는 작업 단위, 저장 블록, 공유 자원, 상태 등으로 나누어집니다. 이 글에서는 이러한 부분보다 조금 더 근본적인 이야기를 해보고자 합니다. 단순히 사용하는 자원, Context Switching을 벗어나서, 공부하다가 마주치거나 스터디 중 마주친 질문에 대한 대답을 정리해 보도록 하겠습니다. 문제 소지가 있는 부분에 대한 의견은 언제나 환영입니다. MultiCore의 등장 2005년, 인텔의 펜티엄 D시리즈와 AMD의 애슬론 64 X2시리즈가 발..
· JAVA/Thread
개요 지난 글에서 Virtual Thread가 어떻게 다른지, 어떠한 부분에서 연관되어 있는지 알아봤습니다. 이번 글에서는 Virtual Thread의 코드를 따라가보며 어떻게 동작하는지 살펴보겠습니다. Virtual Thread의 LifeCycle Virtual Thread의 라이프사이클을 요약하면 위의 그림과 같은 모습입니다. Virtual Thread는 많은 상태를 가진 상태 머신이고, 이 흐름을 따라가면서 설명하도록 하겠습니다. 그림에 있는 상태 이외에도 더 많은 상태가 있지만, 그림에 나온 주요한 상태만을 간략하게 알아보겠습니다. 1. NEW, STARTED, RUNNABLE Virtual Thread의 생성자 코드입니다. Thread.ofVirtual을 통해 가상 스레드를 생성하면, 위의 생성..
· JAVA/Thread
개요 Virtual Thread는 기존 Thread를 완벽하게 대체하는 개념이 아닙니다. 오히려 Thread, Process라기보다는 Task, Runnable에 가깝게 생각해야 이해하기 편합니다. 이번 글에서는 어떠한 부분에서 Virtual Thread와 Thread가 다른지, 어떠한 부분에서 같이 일하게 되는지 알아보겠습니다. Thread LifeCycle에서의 Virtual Thread Thread는 마구잡이로 사용하면 자원의 낭비를 불러올 수 있고, 때문에 ThreadPool에서 관리하여 사용합니다. (ThreadPool - https://nangmandeveloper.tistory.com/7) ThreadPool에서 동작하는 Thread는 다음과 같은 라이프사이클을 가질 것입니다. 1. Thre..
· WEB/Spring
개요 이전에 Virtual Thread, Spring에서 Virtual Thread의 사용에 대해 작성한 포스트가 있었습니다. (Java21 Virtual Thread : https://nangmandeveloper.tistory.com/6) (Springboot에서 Virtual Thread사용 : https://nangmandeveloper.tistory.com/11) 해당 글에서 가상 스레드를 사용하는 법, Spring에서 가상 스레드를 사용하는 방법을 소개했습니다. 특히, Springboot에서 가상 스레드를 사용하는 경우, blocked상태가 적은 경우 일반 thread가 효율적이며 blocked상태가 많이 발생하는 경우 가상 스레드의 처리량이 더 높다는 부분을 확인할 수 있었습니다. 그렇다면,..
· WEB/Spring
개요 Virtual Thread는 일반 Thread보다 가볍기 때문에 Context Switching비용을 효과적으로 줄일 수 있습니다. 따라서, Context Switching이 많이 발생하는 환경에서 이를 사용한다면 처리량을 늘릴 수 있습니다. (참고 : Virtual Thread - https://nangmandeveloper.tistory.com/6) SpringBoot에서 Virtual Thread사용하기 JAVA21을 사용하는 SpringBoot에서 Virtual Thread를 간단히 사용할 수 있습니다. application.yml에서 해당 설정을 추가하면 됩니다. 이렇게 되면, Tomcat 내부적으로 사용하는 Thread를 Virtual Thread로 교체할 수 있습니다. 일반 작업을 수행..
· WEB/Spring
개요 Spring에서 사용자의 요청을 처리하기 위해서 HTTP Connection이 수립되어야 합니다. 이러한 사용자와의 Connection을 Process로 관리하는 것은 불가능합니다. 자원소모가 너무 클 뿐더러, 이미 Tomcat자체가 Process로 동작하기 때문입니다. 만약 사용자의 Connection을 Process로 관리한다면, Connection마다 Process생성, 제거 등을 해야 하고, Tomcat과의 Process간 통신 방식을 따로 수립해 사용해야 합니다. Tomcat에서는 이러한 Connection을 Thread로 처리합니다. HTTP Connection Tomcat 9.0미만 버전에서는 IO(Input Output) Connector를 사용했습니다. IO Connector에서는 ..
· WEB/Spring
개요 개발 공부를 시작할 때, 서버에서 사용하는 자원을 줄여야 한다는 사실은 누구나 알고 있습니다. 하지만, 이제 막 공부를 시작했다면 서버의 처리량이 얼마나 되는지, 내가 리팩토링을 했을 때 처리량이 얼마나 늘어나는지 확인할 수단이 마땅찮을 것입니다. 이 때 사용할 수 있는 소프트웨어가 바로 Jmeter, nGrinder입니다. 이번 글에서는 Jmeter를 이용해 HTTP Request를 임의로 서버로 전송함으로, 스트레스 테스트를 진행하는 방법을 알아보겠습니다. 다운로드 사용법은 매우 간단합니다. 공식 링크 - https://jmeter.apache.org/download_jmeter.cgi 위의 링크에 접속하여, apache-jmeter-5.6.2.zip파일을 다운로드 받습니다. 압축을 푼 뒤, b..
· JAVA/일반
개요 Java에서는 동시성 프로그래밍을 위해 Thread Class를 지원합니다. 이 Thread는 우리가 CS를 공부할 때 배웠던 Process, Thread의 Thread를 Java에서 구현한 것입니다. Thread를 사용하면 Process보다 많은 자원을 절약할 수 있습니다. 하지만, Thread를 그냥 사용한다면 많은 오버헤드가 발생합니다. Thread는 Kernel Thread, User Thread라는 두 종류가 있습니다. JVM은 User Thread를 Kernel Thread하나와 매칭하여 동작시킵니다. 따라서, Java로 Thread객체를 만들 때 Kernel단에 갔다 와야 할 것입니다. 그렇게 되면, System call, Interrupt, ISR등의 과정을 거쳐야 하기 때문에 비용이..
· JAVA/Thread
개요 Java19에서 Virtual Thread가 얼리억세스로 포함되었습니다. Java21에서는 Virtual Thread를 정식 기능으로 포함시켰습니다. Virtual Thread는 경량 스레드 모델입니다. 비슷한 모델로는 Go의 goroutine, Kotlin의 coroutine 등이 있습니다. Kotlin의 coroutine이 2017년 추가된 기능임을 감안하면, 6년이나 걸렸다는 것을 알 수 있습니다. 하지만 Virtual Thread가 Java21에 추가되며, 선택지가 하나 더 생겼습니다. 새로 서비스를 개발하는 입장에서는 Java + coroutine보다는 Only Java로 개발할 수 있을 것입니다. SpringBoot 3.2버전부터 Virtual Thread를 정식으로 지원하기 시작했습니다..
· JAVA/Thread
개요 JVM은 하나의 프로세스로 실행되고, 여러 개의 Thread를 실행할 수 있는 환경을 갖춥니다. 또 우리가 만든 자바 프로그램을 실행하고, main thread를 생성하고, 코드를 실행합니다. JAVA에서 Thread를 사용하는 대표적인 2가지 방법이 있습니다. Thread Class를 사용하는 방법과 Runnable Interface를 사용하는 방법이 바로 그것입니다. Thread 사용하기 public class Thread { public static void main(String[] args) { Thread thread1 = new ExampleThread(); Thread thread2 = new Thread(new ExampleRunnable()); thread1.start(); thre..
낭만주의 개발자
'thread' 태그의 글 목록