<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Concurrency on Kelly Dev</title><link>https://kelly-chui.github.io/tags/concurrency/</link><description>Recent content in Concurrency on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 15 Aug 2026 15:54:01 +0900</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/concurrency/index.xml" rel="self" type="application/rss+xml"/><item><title>The Swift Programming Language. Concurrency (1)</title><link>https://kelly-chui.github.io/posts/the-swift-programming-language-29-concurrency-1/</link><pubDate>Fri, 23 Jun 2023 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/the-swift-programming-language-29-concurrency-1/</guid><description>&lt;figure class="theme-image"&gt;
&lt;img
class="theme-image__image theme-image__image--light"
src="https://kelly-chui.github.io/images/assets/swift-logo-light.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;img
class="theme-image__image theme-image__image--dark"
src="https://kelly-chui.github.io/images/assets/swift-logo-dark.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;/figure&gt;
&lt;h2 id="concurrency"&gt;Concurrency&lt;/h2&gt;
&lt;p&gt;스위프트는 구조화된 방식의 비동기적이고 병렬 수행되는 코드 작성에 대한 지원이 내장되어있다. &lt;em&gt;비동기(Asynchronuous)&lt;/em&gt; 코드는 일시중단 되었다가 나중에 재개할 수 있지만, 한번에 프로그램의 한 부분만 실행된다. 프로그램에서 코드를 중단하고 재개하면 네트워크에서 데이터를 불러오거나, 파일 파싱과 같은 긴 시간이 걸리는 작업을 계속 진행하면서 UI 업데이트와 같은 짧은 시간이 걸리는 작업을 계속할 수 있다. &lt;em&gt;병렬 코드(Parallel code)&lt;/em&gt; 는 동시에 실행되는 코드들을 의미한다 — 예를 들어 4코어 프로세서를 가진 컴퓨터는 각각의 코어가 코드 하나씩을 실행하게 하여, 네 개의 코드를 동시에 실행할 수 있다. 병렬과 비동기 코드를 사용하는 프로그램은 한번에 여러 작업을 수행하고, 외부 시스템을 기다리는 작업을 일시 중단한다. 이 챕터의 나머지 부분에서 용어 &lt;em&gt;동시성(concurrency)&lt;/em&gt; 는 비동기 및 병렬 코드를 지칭한다.&lt;/p&gt;</description></item><item><title>The Swift Programming Language. Concurrency (2)</title><link>https://kelly-chui.github.io/posts/the-swift-programming-language-30-concurrency-2/</link><pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/the-swift-programming-language-30-concurrency-2/</guid><description>&lt;figure class="theme-image"&gt;
&lt;img
class="theme-image__image theme-image__image--light"
src="https://kelly-chui.github.io/images/assets/swift-logo-light.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;img
class="theme-image__image theme-image__image--dark"
src="https://kelly-chui.github.io/images/assets/swift-logo-dark.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;/figure&gt;
&lt;h3 id="asynchronous-sequences"&gt;Asynchronous Sequences&lt;/h3&gt;
&lt;p&gt;이전 섹션의 listPhotos(inGallery:) 함수는 모든 배열의 원소들이 준비된 후, 비동기적으로 전체 배열을 리턴한다. 다른 접근 방법으로는 &lt;em&gt;비동기 시퀀스(asynchronous Sequence)&lt;/em&gt; 를 사용하여 컬렉션의 요소 하나를 한 번에 하나씩 기다리는 것이다. 다음은 비동기 시퀀스를 반복하는 모습이다.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Foundation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;handle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FileHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;standardInput&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;await&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;일반적인 for-in 루프를 사용하는 대신에, 위의 예시는 for 다음에 await를 작성한다. 비동기 함수나 메소드를 호출할 때 처럼 await를 쓰는 것은 정지 가능한 지점을 나타낸다. for-await-in 루프는 각 반복이 시작될 때, 다음 원소가 준비될 때 까지 기다리는 동안 실행을 정지한다.&lt;/p&gt;</description></item><item><title>The Swift Programming Language. Concurrency (3)</title><link>https://kelly-chui.github.io/posts/the-swift-programming-language-31-concurrency-3/</link><pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/the-swift-programming-language-31-concurrency-3/</guid><description>&lt;figure class="theme-image"&gt;
&lt;img
class="theme-image__image theme-image__image--light"
src="https://kelly-chui.github.io/images/assets/swift-logo-light.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;img
class="theme-image__image theme-image__image--dark"
src="https://kelly-chui.github.io/images/assets/swift-logo-dark.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;/figure&gt;
&lt;h3 id="actors"&gt;Actors&lt;/h3&gt;
&lt;p&gt;태스크를 이용하여 프로그램을 분리된 동시성 조각으로 나눌 수 있다. 태스크는 서로 독립적이기 때문에 동시에 실행되어도 안전하다. 하지만 가끔씩 태스크들 사이에 정보를 공유해야 하는 경우가 있다. 액터는 동시성 코드 사이에 정보를 안전하게 공유하도록 해준다.&lt;/p&gt;
&lt;p&gt;클래스처럼 액터는 레퍼런스 타입이다. 따라서 Classes Are Reference Types에서 값 타입과 레퍼런스 타입을 비교한 것이 액터에도 적용된다. 클래스와 다르게, 액터는 한번에 하나의 작업만 변경 가능한 상태(mutable state)에 접근하도록 허용하기 때문에, 여러 태스크가 액터의 한 인스턴스에 상호작용하는 것을 안전하게 해준다. 예를 들어 다음은 온도를 기록하는 액터이다.&lt;/p&gt;</description></item><item><title>Swift Concurrency. Explore Structured Concurrency in Swift (1) - WWDC21</title><link>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-explore-structured-concurrency-in-swift-1/</link><pubDate>Sat, 15 Aug 2026 15:54:01 +0900</pubDate><guid>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-explore-structured-concurrency-in-swift-1/</guid><description>&lt;p&gt;&lt;a href="https://kelly-chui.github.io/posts/wwdc-swift-concurrency-meet-async-await-in-swift-1/"&gt;앞서 정리한 세션&lt;/a&gt;에서는 completion handler 기반의 비동기 코드를 async/await로 작성하면서, 비동기 코드에서도 return, throw, try-catch와 같은 일반적인 제어 흐름을 사용할 수 있게 되었다.&lt;/p&gt;
&lt;p&gt;이번 포스팅에서는 WWDC21의 Explore Structured Concurrency in Swift 세션을 정리한다. async/await가 비동기 코드의 제어 흐름을 구조화했다면, structured concurrency는 여기서 더 나아가 동시에 실행되는 여러 task의 관계와 수명을 구조화한다.&lt;/p&gt;
&lt;h2 id="explore-structed-concurrency-in-swift"&gt;Explore Structed Concurrency in Swift&lt;/h2&gt;
&lt;p&gt;Swift Concurrency는 구조화된 프로그래밍(structured programming)의 아이디어에 기반한 structured concurrency라는 개념을 활용한다.&lt;/p&gt;
&lt;p&gt;옛날에는 프로그램에서 명령어를 나열하고, 컨트롤 플로우가 여기저기로 자유롭게 점프해서 코드를 읽기가 매우 어려웠다. (C의 &lt;code&gt;goto&lt;/code&gt;를 생각해보자)&lt;/p&gt;</description></item><item><title>Swift Concurrency. Meet async/await in Swift (2) - WWDC21</title><link>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-meet-async-await-in-swift-2/</link><pubDate>Mon, 03 Aug 2026 23:01:47 +0900</pubDate><guid>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-meet-async-await-in-swift-2/</guid><description>&lt;p&gt;1편에서는 async await를 어떻게 사용했는지 알아봤다면, 여기서는 테스트와 실제 앱 코드에서 async/await를 사용하는 법을 알아본다. 또한 기존에 존재하는 completion handler 기반 API를 continuation을 사용하여, async/await를 사용하는 async alternative로 변환하는 방법을 알아본다.&lt;/p&gt;
&lt;h2 id="비동기-코드-테스트하기"&gt;비동기 코드 테스트하기&lt;/h2&gt;
&lt;p&gt;async/await를 쓰면 비동기 코드도 동기 코드만큼 쉽게 테스트할 수 있다. XCTest는 &lt;code&gt;async&lt;/code&gt; 테스트를 지원한다.&lt;/p&gt;
&lt;p&gt;아래는 completion handler 방식의 비동기 코드를 테스트하는 코드이다.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MockViewModelSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;XCTestCase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;testFetchThumbnails&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kr"&gt;throws&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;expectation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;XCTestExpectation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;mock thumbnails completion&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mockViewModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchThumbnail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mockID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;XCTAssertNil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;expectation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fulfill&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expectation&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;aside class="callout" data-callout="note"&gt;
&lt;div class="callout__header"&gt;&lt;span class="callout__icon" aria-hidden="true"&gt;i&lt;/span&gt;&lt;span class="callout__title"&gt;fulfill&lt;/span&gt;
&lt;/div&gt;
&lt;div class="callout__body"&gt;&lt;code&gt;fulfill()&lt;/code&gt;은 expectation을 충족된 상태로 표시하는 메소드다. 일반적으로 비동기 작업이 완료되었을 때 호출한다.&lt;/div&gt;
&lt;/aside&gt;
&lt;p&gt;기존에는 &lt;code&gt;XCTestExpectation&lt;/code&gt;을 만들고, API를 호출한 뒤 expectation을 fulfill 하고, 지정한 시간 동안 기다리도록 작성해야 했다.&lt;/p&gt;</description></item><item><title>Swift Concurrency. Meet async/await in Swift (1) - WWDC21</title><link>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-meet-async-await-in-swift-1/</link><pubDate>Mon, 03 Aug 2026 20:03:38 +0900</pubDate><guid>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-meet-async-await-in-swift-1/</guid><description>&lt;p&gt;completion handler로 작성한 비동기 코드는 쉽게 장황해지고, 복잡해지고, 부정확해진다.&lt;/p&gt;
&lt;p&gt;Swift의 async/await는 비동기 코드를 일반 코드를 작성하는 것처럼 만들어 주고, 아이디어를 더 쉽게 반영하며, 더 안전하게 만든다.&lt;/p&gt;
&lt;p&gt;async/await는 단순한 비동기 표현 방식이 아니다. 이 세션에서는 async/await가 왜 기존 completion handler 방식보다 좋은지, 그리고 Swift의 컨셉에 왜 잘 맞는지를 계속해서 설명한다.&lt;/p&gt;
&lt;h2 id="meet-asyncawait-in-swift"&gt;Meet async/await in Swift&lt;/h2&gt;
&lt;p&gt;Foundation 같은 Apple SDK에는 &lt;code&gt;await&lt;/code&gt;할 수 있는 수백 개의 메소드가 존재한다. UIKit의 &lt;code&gt;UIImage&lt;/code&gt;는 섬네일을 만드는 API를 동기 방식과 비동기 방식으로 모두 제공한다.&lt;/p&gt;</description></item><item><title>Swift Concurrency. Behind the Scenes - WWDC21</title><link>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-behind-the-scenes/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/wwdc-swift-concurrency-behind-the-scenes/</guid><description>&lt;h2 id="threading-model"&gt;Threading model&lt;/h2&gt;
&lt;p&gt;뉴스 피드 리더 앱을 예로 들어보자. 앱의 상위 컴포넌트는 다음과 같이 나눌 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;사용자 인터페이스를 담당하는 메인 스레드&lt;/li&gt;
&lt;li&gt;사용자가 구독한 뉴스 피드를 추적하는 데이터베이스&lt;/li&gt;
&lt;li&gt;최신 콘텐츠를 가져오는 네트워킹 서브시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;사용자가 최신 뉴스를 요청하면 다음과 같은 흐름으로 처리할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;메인 스레드에서 이벤트 제스처 처리&lt;/li&gt;
&lt;li&gt;데이터베이스 작업을 처리하는 직렬 큐로 요청을 비동기적으로 디스패치
&lt;ul&gt;
&lt;li&gt;작업을 다른 큐로 보내면 메인 스레드는 데이터베이스 작업을 기다리지 않고 사용자 입력에 계속 반응할 수 있다.&lt;/li&gt;
&lt;li&gt;직렬 큐가 상호 배제를 보장하므로 데이터베이스 접근을 순서대로 처리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터베이스 큐에선 사용자가 구독한 피드에 URLSession을 통해 콘텐츠를 다운로드하는 네트워크 요청을 스케줄링&lt;/li&gt;
&lt;li&gt;결과가 도착하면 URLSession의 콜백이 Delegate Queue 위에서 호출되어서 각 결과의 Completion Handler가 동기적으로 데이터베이스를 업데이트한다.&lt;/li&gt;
&lt;li&gt;MainThread를 깨워서 UI를 리프레시한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;보기에는 합리적인 방법이다. 메인 스레드를 블록하지 않으면서 네트워크 요청을 동시에 처리할 수 있기 때문이다.&lt;/p&gt;</description></item><item><title>Swift Concurrency. 01. 도입 배경</title><link>https://kelly-chui.github.io/posts/swift-concurrency-01-introduction/</link><pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/swift-concurrency-01-introduction/</guid><description>&lt;p&gt;Swift Concurrency는 Swift 5.5에서 도입된 기능이다. &lt;code&gt;Foundation&lt;/code&gt;을 import 해야 쓸 수 있는 GCD와 다르게, Swift 언어 자체에 내장된 동시성 모델이다.&lt;/p&gt;
&lt;p&gt;Swift Concurrency는 크게 두 가지 부분으로 나뉘어진다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;async&lt;/code&gt;, &lt;code&gt;await&lt;/code&gt; 로 작성하는 새로운 동시성 모델&lt;/li&gt;
&lt;li&gt;애플리케이션을 여러 동시성 태스크로 분할하는 Actor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이 포스트에서는 Swift Concurrency의 도입 배경을 알아본다.&lt;/p&gt;
&lt;h2 id="gcd의-한계"&gt;GCD의 한계&lt;/h2&gt;
&lt;p&gt;GCD는 Objective-C에서부터 사용해온 애플이 만든 비동기 API다. Queue 기반으로 작업을 스케줄링 하고, 스레드 위에서 추상화 되어있기 때문에 스레드를 직접 생성하거나 관리할 필요가 없다.&lt;/p&gt;</description></item><item><title>프로세스와 스레드</title><link>https://kelly-chui.github.io/posts/cs-os-process-thread/</link><pubDate>Sun, 12 Jan 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-os-process-thread/</guid><description>&lt;h2 id="프로세스"&gt;프로세스&lt;/h2&gt;
&lt;p&gt;컴퓨터에서 실행 중인 프로그램의 인스턴스, 프로그램이 메모리에 올라가면 프로세스가 된다.&lt;/p&gt;
&lt;h3 id="프로세스의-상태"&gt;프로세스의 상태&lt;/h3&gt;
&lt;p&gt;운영체제마다 세부 상태는 다르지만, 기본적인 5상태 모델은 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;생성(New): 프로세스가 만들어지는 중인 상태&lt;/li&gt;
&lt;li&gt;준비(Ready): 실행에 필요한 자원을 갖추고 CPU 할당을 기다리는 상태&lt;/li&gt;
&lt;li&gt;실행(Running): CPU에서 명령을 실행하고 있는 상태&lt;/li&gt;
&lt;li&gt;대기(Waiting, Blocked): I/O 완료나 이벤트 발생을 기다리는 상태&lt;/li&gt;
&lt;li&gt;종료(Terminated): 실행이 끝난 상태&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;CPU 스케줄러가 준비 상태의 프로세스를 선택하면 실행 상태로 이동한다. 할당 시간이 끝나거나 선점되면 다시 준비 상태가 되고, I/O를 요청하면 대기 상태로 이동한다. 기다리던 작업이 완료되면 다시 준비 상태로 돌아간다.&lt;/p&gt;</description></item></channel></rss>