<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 박은영</title>
    <description>The latest articles on DEV Community by 박은영 (@eyabc).</description>
    <link>https://dev.to/eyabc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3100930%2F67442772-5db6-4f4f-bfde-ee95efc516e1.jpeg</url>
      <title>DEV Community: 박은영</title>
      <link>https://dev.to/eyabc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eyabc"/>
    <language>en</language>
    <item>
      <title>Netty의 비동기/이벤트 기반 모델에서 태스크 전환(task switching)</title>
      <dc:creator>박은영</dc:creator>
      <pubDate>Mon, 28 Apr 2025 11:22:18 +0000</pubDate>
      <link>https://dev.to/eyabc/nettyyi-bidonggiibenteu-giban-modeleseo-taeseukeu-jeonhwantask-switching-4bld</link>
      <guid>https://dev.to/eyabc/nettyyi-bidonggiibenteu-giban-modeleseo-taeseukeu-jeonhwantask-switching-4bld</guid>
      <description>&lt;h2&gt;
  
  
  ✅ 전제 이해: Netty는 NIO 기반 비동기 이벤트 드리븐 프레임워크
&lt;/h2&gt;

&lt;h2&gt;
  
  
  📌 핵심 개념 3가지
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F557c55d820xot7rhzicx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F557c55d820xot7rhzicx.png" alt="Image description" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 Netty에서 Task Switching은 어떻게 일어날까?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ 운영체제 레벨에서의 태스크 스위칭은 거의 없음
&lt;/h3&gt;

&lt;p&gt;Netty는 &lt;strong&gt;EventLoop (=스레드 1개)&lt;/strong&gt;가 다수의 채널을 감시.&lt;br&gt;
예를 들어, 1개의 스레드로 수천 개의 소켓 채널을 Selector를 통해 감시 가능.&lt;br&gt;
즉, Netty는 "스레드 수를 늘리지 않고도 많은 작업을 처리"함.&lt;br&gt;
따라서 OS의 컨텍스트 스위칭 비용은 매우 낮음.&lt;/p&gt;

&lt;p&gt;톰캣은 "요청 1건 ↔ 스레드 1개" 구조&lt;br&gt;
Netty는 "스레드 1개 ↔ 수천 요청 (비동기 태스크)" 구조&lt;/p&gt;
&lt;h3&gt;
  
  
  2️⃣ Netty 내부의 Task Switching = Runnable 실행 순서 변화
&lt;/h3&gt;

&lt;p&gt;Netty에서 태스크는 Runnable 단위로 EventLoop의 큐에 쌓임.&lt;br&gt;
EventLoop는 다음 순서로 태스크를 실행함:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. I/O 이벤트 감지&lt;/span&gt;
    &lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;// 2. I/O 이벤트 처리 (읽기/쓰기 등)&lt;/span&gt;
    &lt;span class="n"&gt;processSelectedKeys&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;// 3. 사용자 등록한 task 실행 (ex. future.addListener)&lt;/span&gt;
    &lt;span class="n"&gt;runAllTasks&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;즉, Task Switching이란 → 큐에서 Runnable을 꺼내 실행하는 순서가 바뀌는 것.&lt;/p&gt;

&lt;p&gt;🧠 스레드 전환이 아닌, 실행할 Runnable 단위 태스크가 전환되는 구조이기 때문에,&lt;br&gt;
OS 수준의 컨텍스트 스위칭은 거의 없음&lt;br&gt;
Netty의 성능이 수직적으로 올라갈 수 있는 이유&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 톰캣 vs Netty의 스레드 및 태스크 처리 구조
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1gm3xl3uusz1q3evp70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1gm3xl3uusz1q3evp70.png" alt="Image description" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧬 좀 더 깊게: runAllTasks() 내부에서 무슨 일이?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ChannelFuture.addListener() 로 등록한 콜백&lt;/li&gt;
&lt;li&gt;ctx.executor().execute(runnable) 같은 사용자 정의 태스크&lt;/li&gt;
&lt;li&gt;위와 같은 비동기 작업들이 큐에 들어감
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(;;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 1. I/O 이벤트 처리&lt;/span&gt;
        &lt;span class="n"&gt;processSelectedKeys&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// 2. 등록된 task 실행 (비동기 콜백)&lt;/span&gt;
        &lt;span class="n"&gt;runAllTasks&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;이 과정에서 스레드 자체는 고정되어 있으므로, 컨텍스트 스위칭이 아닌, Runnable 스케줄링만 일어나는 것!&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 정리: Netty의 Task Switching 정체는?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovi17kuq49nncczm0kwc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovi17kuq49nncczm0kwc.png" alt="Image description" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👉 따라서 Netty의 "태스크 스위칭"은
&lt;/h2&gt;

&lt;p&gt;OS 스케줄러가 개입하는 스레드 전환이 아니라, 사용자 공간(User Space)에서 태스크 큐를 전환 실행하는 것&lt;br&gt;
이게 컨텍스트 스위칭 비용을 줄이면서도 고성능 처리가 가능한 핵심 구조입니다.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
