Home
>
CS
>
2024
>
πΎ [CS] I/O λ°μ΄λ μμ
(I/O-Bound Task)μ΄λ 무μμΌκΉμ?
CS
πΎ [CS] I/O λ°μ΄λ μμ
(I/O-Bound Task)μ΄λ 무μμΌκΉμ?
-
I/O λ°μ΄λ μμ
(I/O-Bound Task)μ μ
μΆλ ₯(Input/Output) μμ
μ μλμ μν΄ μ 체 μμ
μ μ±λ₯μ μ νλλ μμ
μ μλ―Έν©λλ€.
- μ¦, νλ‘κ·Έλ¨μ΄ μ€νλλ λμ CPUκ° λ°μ΄ν°λ₯Ό μ²λ¦¬νλ κ²λ³΄λ€, λ°μ΄ν°λ₯Ό μ½κ³ μ°λ μμ
(I/O)μμ λ λ§μ μκ°μ΄ μλΉλλ μν©μ λ§ν©λλ€.
1οΈβ£ I/O λ°μ΄λ μμ
(I/O-Bound Task)μ μ.
1οΈβ£ νμΌ μ
μΆλ ₯.
- νλ λμ€ν¬μ νμΌμ μ½κ±°λ μ°λ μμ
μ I/O λ°μ΄λ μμ
(I/O-Bound Task)μ λνμ μΈ μμ
λλ€.
- μλ₯Ό λ€μ΄, λμ©λ νμΌμ μ½μ΄μμ μ²λ¦¬νκ±°λ, κ²°κ³Όλ₯Ό νμΌμ μ μ₯ν λ, λμ€ν¬μ μ½κΈ°/μ°κΈ° μλμ λ°λΌ μμ
μ μ 체 μκ°μ΄ κ²°μ λ©λλ€.
2οΈβ£ λ€νΈμν¬ ν΅μ .
- μΈν°λ·μμ λ°μ΄ν°λ₯Ό λ€μ΄λ‘λνκ±°λ μ
λ‘λνλ μμ
μ λ€νΈμν¬ μλμ μμ‘΄ν©λλ€.
- μλ₯Ό λ€μ΄, μΉ νμ΄μ§μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ API μλ²λ‘ μμ²μ 보λ΄λ μμ
μ λ€νΈμν¬μ μ§μ° μκ°(latency)κ³Ό λμν(bandwidth)μ μν΄ μ νλ©λλ€.
3οΈβ£ λ°μ΄ν°λ² μ΄μ€ 쿼리.
- λ°μ΄ν°λ² μ΄μ€μμ λ°μ΄ν°λ₯Ό μ‘°ννκ±°λ μ½μ
νλ μμ
μ I/O λ°μ΄λ μμ
(I/O-Bound Task)μ
λλ€.
- λμ€ν¬μ μ μ₯λ λ°μ΄ν°λ₯Ό μ½μ΄μ€κ±°λ, λ°μ΄ν°λ₯Ό μ μ₯ν λ λμ€ν¬ μλμ λ°μ΄ν°λ² μ΄μ€μ μ²λ¦¬ μ±λ₯μ΄ μμ
μ μλλ₯Ό μ’μ°ν©λλ€.
2οΈβ£ I/O λ°μ΄λ vs CPU λ°μ΄λ
1οΈβ£ I/O λ°μ΄λ(I/O Bound)
-
μμ
μ μ±λ₯μ΄ I/O μλμ μν΄ μ νλλ μν©μ
λλ€.
- λ€νΈμν¬, λμ€ν¬, λ°μ΄ν°λ² μ΄μ€ λ±μ μ
μΆλ ₯ μ₯μΉμμ λ°μ΄ν°λ₯Ό μ½κ±°λ μ°λ μλκ° μ 체 μ±λ₯μ μν₯μ λ―ΈμΉ©λλ€.
- μλ₯Ό λ€μ΄, νμΌ λ€μ΄λ‘λλ λ°μ΄ν°λ² μ΄μ€μμ λλμ λ°μ΄ν° μ‘°νκ° I/O λ°μ΄λ μμ
μ
λλ€.
- μ΄ κ²½μ°, CPUλ λ°μ΄ν° μ²λ¦¬ν μ€λΉκ° λμ΄ μμ΄λ, λμ€ν¬λ λ€νΈμν¬μμ λ°μ΄ν°λ₯Ό λ°μμ€λ λμ λκΈ°νκ² λ©λλ€.
2οΈβ£ CPU λ°μ΄λ(CPU Bound)
- μμ
μ μ±λ₯μ΄ CPUμ μ²λ¦¬ μλμ μν΄ μ νλλ μν©μ
λλ€.
-
볡μ‘ν κ³μ°μ΄λ λ°μ΄ν° μ²λ¦¬ μμ
μ΄ λ§μ CPUκ° λλΆλΆμ μκ°μ κ³μ° μμ
μ μλΉν λ λ°μν©λλ€.
- μλ₯Ό λ€μ΄, μνΈν, μ΄λ―Έμ§ μ²λ¦¬, λ¨Έμ λ¬λ λͺ¨λΈ νμ΅ λ±μ΄ CPU λ°μ΄λ μμ
μ
λλ€.
- μ΄ κ²½μ°, μμ
μλλ CPU μ²λ¦¬ μ±λ₯μ μν΄ κ²°μ λ©λλ€.
3οΈβ£ I/O Bound μμ
μ΅μ ν.
1οΈβ£ λΉλκΈ° νλ‘κ·Έλλ°(Asynchronous Programming)
-
λΉλκΈ° I/O(Asynchronous I/O)λ I/O μμ
(I/O Task)μ΄ μλ£λ λκΉμ§ CPUκ° λκΈ°νμ§ μκ³ , λ€λ₯Έ μμ
μ κ³μ μνν μ μλλ‘ ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ I/O λκΈ° μκ°μ μ€μ΄κ³ , CPUλ₯Ό λ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
- μλ₯Ό λ€μ΄, νμΌμ λ€μ΄λ‘λνλ λμ λ€λ₯Έ μμ
μ μ²λ¦¬ν μ μμ΄, μμ
μ μ 체 μ²λ¦¬ μλλ₯Ό κ°μ ν μ μμ΅λλ€.
π μμ (Java λΉλκΈ° I/O)
import java.nio.file.*;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
public class AsyncFileRead {
public static void main(String[] args) {
CompletableFuture.runAsync(() -> {
try {
String content = Files.readString(Paths.get("example.txt")), StandardCharsets.UTF_8);
System.out.println(content);
} catch (Exception e) {
e.printStackTrace();
}
});
System.out.println("νμΌ μ½κΈ° μμ² μλ£");
}
}
- μ μ½λλ λΉλκΈ°λ‘ νμΌμ μ½κΈ° λλ¬Έμ, νμΌμ μ½λ λμ λ€λ₯Έ μμ
μ μνν μ μμ΅λλ€.
2οΈβ£ λ©ν°μ€λ λ©(Multithreading)
- μ¬λ¬ μ€λ λ(Thread)λ₯Ό μ¬μ©νμ¬ λμμ I/O μμ
μ μνν μ μμ΅λλ€.
- μ΄λ₯Ό ν΅ν΄ I/O μμ
μ΄ λκΈ°νλ λμ λ€λ₯Έ μ€λ λκ° CPUλ₯Ό μ¬μ©νμ¬ ν¨μ¨μ±μ λμΌ μ μμ΅λλ€.
- μλ₯Ό λ€μ΄, λ€νΈμν¬μμ μ¬λ¬ λ°μ΄ν°λ₯Ό λμμ κ°μ ΈμμΌ ν λ, κ° λ°μ΄ν°λ₯Ό κ°λ³ μ€λ λ(Thread)μμ μ²λ¦¬νλλ‘ νμ¬ λ³λ ¬ μ²λ¦¬λ₯Ό ꡬνν μ μμ΅λλ€.
π μμ(Java λ©ν°μ€λ λ©)
public class MultiThreadedDownload {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> downloadFile("http://example.com/file1"));
Thread thread2 = new Thread(() -> downloadFile("http://example.com/file2"));
thread1.start();
thread2.start();
}
public static void downloadFile(String url) {
// λ€νΈμν¬ νμΌ λ€μ΄λ‘λ μμ
μν
System.out.println("Downloading from " + url);
}
}
3οΈβ£ μΊμ±(Caching).
- μμ£Ό μ¬μ©νλ λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ μ μ₯ν΄λκ³ , νμν λλ§λ€ λΉ λ₯΄κ² μ κ·Όν μ μλλ‘ ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λμ€ν¬λ λ€νΈμν¬μ λΆνμν I/O μμ²μ μ€μΌ μ μμ΅λλ€.
- μλ₯Ό λ€μ΄, μΉ νμ΄μ§λ₯Ό λ‘λν λ, μ μ μΈ λ¦¬μμ€λ₯Ό μΊμ±(Caching)νλ©΄ λ€νΈμν¬ μμ²μ μ€μ΄κ³ λ λΉ λ₯΄κ² λ‘λν μ μμ΅λλ€.
4οΈβ£ ν¨μ¨μ μΈ λ°μ΄ν° μ²λ¦¬.
-
λ°μ΄ν°λ₯Ό λλμΌλ‘ ν λ²μ μ²λ¦¬νμ¬ I/O μμ²μ μ€μ
λλ€.
- μλ₯Ό μ¦μ΄, λ°μ΄ν°λ² μ΄μ€μ ν λ²μ μ¬λ¬ νμ μ½μ
νκ±°λ μ‘°ννλ λ°°μΉ μμ
(batch processing)μ ν΅ν΄, κ°λ³μ μΌλ‘ μ¬λ¬ λ² μ²λ¦¬νλ κ²λ³΄λ€ λ ν¨μ¨μ μΌ μ μμ΅λλ€.
π μμ(Java λ°μ΄ν°λ² μ΄μ€ λ°°μΉ μ²λ¦¬)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class BatchProcessingExample {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password")) {
String query = "INSERT INTO students (name, age) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(query);
conn.setAutoCommit(false);
for (int i = 0; i < 100; i++) {
pstmt.setString(1, "Student " + i);
pstmt.setInt(2, 20 + i);
pstmt.addBatch();
}
pstmt.executeBatch();
conn.commit();
System.out.println("Batch insertion completed.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4οΈβ£ μμ½.
-
I/O λ°μ΄λ μμ
μ μ
μΆλ ₯ μμ
μ μλμ μν΄ μ±λ₯μ΄ μ νλλ μμ
μ λ§ν©λλ€.
- νμΌ μ½κΈ°/μ°κΈ°, λ€νΈμν¬ ν΅μ , λ°μ΄ν°λ² μ΄μ€ μ‘°ν λ±μ΄ λνμ μΈ I/O λ°μ΄λ μμ
μ
λλ€.
- μ΄λ¬ν μμ
μ CPUκ° λ°μ΄ν°λ₯Ό μ²λ¦¬νλ κ²λ³΄λ€ μ
μΆλ ₯ μ₯μΉμμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ 보λ΄λ μκ°μ΄ λ μ€λ 걸리λ κ²½μ°κ° λ§μ, CPUλ λκΈ° μνμ 머무λ₯΄κ² λ©λλ€.
- μ΄λ₯Ό κ°μ νκΈ° μν΄ λΉλκΈ° νλ‘κ·Έλλ°, λ©ν°μ€λ λ©, μΊμ± λ±μ κΈ°λ²μ νμ©νμ¬ μ
μΆλ ₯ ν¨μ¨μ λμ΄κ³ , μ 체 μμ€ν
μ±λ₯μ ν₯μ μν¬ μ μμ΅λλ€.