1. Threadλ?
μ΄μ체μ μμ νλμ νλ‘μΈμ€(process)λ μ¬λ¬ κ°μ μ°λ λ(thread)λ₯Ό κ°μ§ μ μλ€. μ°λ λλ νλ‘μΈμ€ λ΄μμ μ€ν νλ¦μ μλ―Ένλ©°, νλ‘μΈμ€μ μμμ 곡μ νλ©΄μλ λ 립μ μΈ μ€ν νλ¦μ κ°μ§λ€. μ¦, νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ μμ μ λμμ μνν μ μλλ‘ λμμ€λ€.
1.1. νλ‘μΈμ€μ μ°λ λμ μ°¨μ΄
- νλ‘μΈμ€λ μ€ν μ€μΈ νλ‘κ·Έλ¨μ μΈμ€ν΄μ€λ‘, λ 립μ μΈ λ©λͺ¨λ¦¬ 곡κ°(Code, Data, Heap, Stack λ±)μ κ°μ§λ€.
- μ°λ λλ νλ‘μΈμ€ λ΄μμ μ€νλλ μμ λ¨μλ‘, κ°μ νλ‘μΈμ€ λ΄μ λ€λ₯Έ μ°λ λλ€κ³Ό Code, Data, Heap, File λ±μ μμμ 곡μ νμ§λ§, νλ‘κ·Έλ¨ μΉ΄μ΄ν°(PC), λ μ§μ€ν°, μ€ν(Stack)μ κ°λ³μ μΌλ‘ κ΄λ¦¬λλ€.
- λ°λΌμ νλ‘μΈμ€ κ° ν΅μ (IPC: Inter-Process Communication)μ μλμ μΌλ‘ λΉμ©μ΄ λ§μ΄ λ€μ§λ§, μ°λ λ κ° ν΅μ μ 곡μ λ©λͺ¨λ¦¬λ₯Ό νμ©νμ¬ ν¨μ¬ ν¨μ¨μ μΌλ‘ μνλ μ μλ€.
1.2. CPU μ€μΌμ€λ§ λ¨μ
CPUλ₯Ό μ μ νλ λ¨μλ **νλ‘μΈμ€ ID(pid)κ° μλλΌ μ°λ λ ID(tid)**μ΄λ€. μ¦, μ€μ λ‘ CPUλ₯Ό μ μ νκ³ μ€ννλ κ²μ νλ‘μΈμ€κ° μλλΌ μ°λ λμ΄λ©°, κ° μ°λ λλ λ 립μ μΈ νλ‘κ·Έλ¨ μΉ΄μ΄ν°(PC), λ μ§μ€ν°, μ€νμ κ°μ§λ€.
2. λ©ν°μ°λ λ©(Multithreading)
λ©ν°μ°λ λ©μ νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ κ°μ μ°λ λλ₯Ό μμ±νμ¬ λ³λ ¬λ‘ μ€ννλ κΈ°μ μ΄λ€. μ΄λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ μ±λ₯μ ν₯μμν¬ μ μλ€.
2.1. λ©ν°μ°λ λ©μ μ₯μ
- μλ΅μ±(Responsiveness):
- μ¬μ©μμ μ λ ₯μ λΉ λ₯΄κ² μ²λ¦¬ν μ μμ
- μλ₯Ό λ€μ΄, GUI νλ‘κ·Έλ¨μμ UI μ°λ λκ° λ³λλ‘ λμνλ©΄, μκ°μ΄ μ€λ 걸리λ μ°μ° μ€μλ UIκ° λ©μΆμ§ μκ³ λ°μν μ μμ
- μμ 곡μ (Resource Sharing):
- νλ‘μΈμ€ λ΄μμ Code, Data, Heap λ±μ 곡μ νμ¬ μ°λ λ κ° λ°μ΄ν° κ΅νμ΄ μ©μ΄ν¨
- λ³λμ 곡μ λ©λͺ¨λ¦¬λ₯Ό λ§λ€ νμ μμ΄ κ°λ¨νκ² λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μμ
- κ²½μ μ±(Economy):
- μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νλ κ²λ³΄λ€ μλ‘μ΄ μ°λ λλ₯Ό μμ±νλ κ²μ΄ λΉμ©μ΄ μ κ² λ¦
- 컨ν μ€νΈ μ€μμΉ(Context Switching)λ νλ‘μΈμ€ κ°λ³΄λ€ μ°λ λ κ°μμ λ λΉ λ¦
- λ³λ ¬μ±(Scalability):
- λ©ν°μ½μ΄ μμ€ν μμ μ°λ λλ₯Ό νμ©νλ©΄ μ¬λ¬ μμ μ λμμ μ€ννμ¬ μ±λ₯μ ν₯μμν¬ μ μμ
- CPU μ½μ΄κ° λ§μμλ‘ λ³λ ¬ μ€ν ν¨κ³Όκ° λμ± κ·Ήλνλ¨
2.2. μμ : ν΄λΌμ΄μΈνΈ-μλ² λͺ¨λΈμμμ λ©ν°μ°λ λ©
μλ₯Ό λ€μ΄, ν΄λΌμ΄μΈνΈ-μλ² μμ€ν μμ ν΄λΌμ΄μΈνΈκ° μλ²μ μμ²μ λ³΄λΌ λ, μλ²λ κ° μμ²μ κ°λ³ μ°λ λλ‘ μ²λ¦¬ν μ μλ€. μ΄λ₯Ό ν΅ν΄ νλμ μμ²μ μ²λ¦¬νλ λμμλ λ€λ₯Έ μμ²μ κ³μ λ°μ μ μμΌλ―λ‘ μλ²μ μλ΅μ±μ΄ ν₯μλλ€.
3. Javaμμμ μ°λ λ μμ± λ°©λ²: (1)Thread ν΄λμ€ μμ
Javaλ λ©ν°μ°λ λ©μ κΈ°λ³Έμ μΌλ‘ μ§μνλ©°, λ€μκ³Ό κ°μ λ°©μμΌλ‘ μ°λ λλ₯Ό λ§λ€ μ μλ€.
λ€μμ Thread ν΄λμ€λ₯Ό μμνμ¬ μ°λ λλ₯Ό μμ±νκ³ μ€ννλ μμ μ΄λ€.
3.1. μ½λ μ€λͺ
package ch04;
class MyThread1 extends Thread {
public void run() {
try {
while (true) {
System.out.println("Hello, Thread!");
Thread.sleep(500);
}
}
catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
}
}
public class ThreadExample1 {
public static final void main(String[] args) {
MyThread1 thread = new MyThread1();
thread.start();
System.out.println("Hello, My Child");
}
}
3.2. μ½λ λΆμ
1) MyThread1 ν΄λμ€: μ°λ λ μ μ
class MyThread1 extends Thread {
- Thread ν΄λμ€λ₯Ό μμλ°μ μλ‘μ΄ μ°λ λλ₯Ό μ μνλ€.
- Thread ν΄λμ€λ₯Ό μμνλ©΄ run() λ©μλλ₯Ό μ€λ²λΌμ΄λ©νμ¬ μ°λ λμ λμμ ꡬνν μ μλ€.
public void run() {
try {
while (true) {
System.out.println("Hello, Thread!");
Thread.sleep(500);
}
}
catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
}
- run() λ©μλλ μ°λ λκ° μ€νλ λ μνν λμμ μ μνλ€.
- while (true)λ₯Ό μ¬μ©νμ¬ λ¬΄ν 루νλ₯Ό λλ©΄μ "Hello, Thread!"λ₯Ό 0.5μ΄λ§λ€ μΆλ ₯νλ€.
- Thread.sleep(500);μ νΈμΆνλ©΄ μ°λ λκ° 500ms λμ λκΈ°νκ² λλ€. μ΄κ±Έ μμ λ©΄ λ무 λΉ λ₯΄κ² μΆλ ₯λλ€.
- InterruptedExceptionμ μ°λ λκ° κ°μ μ’ λ£λ λ λ°μνλ μμΈλ‘, catch λΈλ‘μμ "I'm interrupted"μ μΆλ ₯νκ³ μ’ λ£λλ€.
2) ThreadExample1 ν΄λμ€: μ°λ λ μ€ν
public class ThreadExample1 {
public static final void main(String[] args) {
- main() λ©μλλ Java νλ‘κ·Έλ¨μ μμμ μ΄λ€.
MyThread1 thread = new MyThread1();
- MyThread1 ν΄λμ€μ κ°μ²΄(μ°λ λ)λ₯Ό μμ±νλ€.
thread.start();
- start() λ©μλλ₯Ό νΈμΆνλ©΄ μλ‘μ΄ μ°λ λκ° μμ±λκ³ run() λ©μλκ° μ€νλλ€.
- run() λ©μλλ₯Ό μ§μ νΈμΆνμ§ μκ³ start()λ₯Ό νΈμΆν΄μΌ λ©ν°μ°λ λ©μ΄ λμνλ€.
System.out.println("Hello, My Child");
- λ©μΈ μ°λ λμμ "Hello, My Child"λ₯Ό μΆλ ₯νλ€.
- λ©μΈ μ°λ λμ MyThread1 μ°λ λλ λμμ μ€νλλ―λ‘ μΆλ ₯ μμλ 보μ₯λμ§ μλλ€.
3.3. νλ‘κ·Έλ¨ μ€ν κ²°κ³Ό
μ΄ νλ‘κ·Έλ¨μ μ€ννλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λμ¨λ€.
Hello, My Child
Hello, Thread!
Hello, Thread!
Hello, Thread!
Hello, Thread!
...
- "Hello, My Child"λ λ©μΈ μ°λ λμμ μ€νλλ€.
- "Hello, Thread!"λ MyThread1 μ°λ λμμ 0.5μ΄λ§λ€ λ°λ³΅ μΆλ ₯λλ€.
- λ©μΈ μ°λ λμ MyThread1 μ°λ λλ λ 립μ μΌλ‘ μ€νλλ―λ‘ μΆλ ₯ μμλ λ³λλ μ μλ€.
3.4. μ°λ λμ μ€ν μμκ° μΌμ νμ§ μμ μ΄μ
- start()λ₯Ό νΈμΆνλ©΄ μ΄μ체μ κ° CPUλ₯Ό ν λΉν λκΉμ§ μ°λ λλ μ€νλμ§ μλλ€.
- λ°λΌμ "Hello, My Child"κ° "Hello, Thread!"λ³΄λ€ λ¨Όμ μΆλ ₯λ μλ μκ³ , νμ μΆλ ₯λ μλ μλ€.
- μ΄μ체μ κ° μ°λ λμ μ€ν μμλ₯Ό κ²°μ νλ―λ‘ μ€νν λλ§λ€ κ²°κ³Όκ° λ€λ₯Ό μ μλ€.
3.5. μ 리
β Thread ν΄λμ€λ₯Ό μμνμ¬ μλ‘μ΄ μ°λ λλ₯Ό λ§λ€μλ€. β run() λ©μλμμ λ°λ³΅μ μΌλ‘ "Hello, Thread!"λ₯Ό μΆλ ₯νλ€. β thread.start();λ₯Ό νΈμΆνλ©΄ μλ‘μ΄ μ°λ λκ° μ€νλλ€. β λ©μΈ μ°λ λμ μλ‘μ΄ μ°λ λλ λ 립μ μΌλ‘ μ€νλλ―λ‘ μ€ν κ²°κ³Όκ° μΌμ νμ§ μλ€.
4. Javaμμμ μ°λ λ μμ± λ°©λ²: (2)Runnable μΈν°νμ΄μ€ ꡬν
Javaμμλ Thread ν΄λμ€λ₯Ό μμνλ κ² μΈμλ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ°λ λλ₯Ό μμ±ν μ μλ€. μ΄ λ°©λ²μ λ€μ€ μμμ΄ λΆκ°λ₯ν Javaμ νΉμ±μ λμ± μ μ°νκ² μ°λ λλ₯Ό νμ©ν μ μλλ‘ ν΄μ€λ€.
4.1. μ½λ μ€λͺ
package ch04;
class MyThread2 implements Runnable {
public void run() {
try {
while (true) {
System.out.println("Hello, Runnable!");
Thread.sleep(500);
}
}
catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
}
}
public class ThreadExample2 {
public static final void main(String[] args) {
Thread thread = new Thread(new MyThread2());
thread.start();
System.out.println("Hello, My Runnable Child!");
}
}
4.1. μ½λ λΆμ
1) MyThread2 ν΄λμ€ μ μ
class MyThread2 implements Runnable {
- MyThread2 ν΄λμ€λ Runnable μΈν°νμ΄μ€λ₯Ό ꡬν(implements).
- Runnableμ "μ°λ λκ° μ€νν μμ μ μ μνλ μΈν°νμ΄μ€"
- μ¦, MyThread2λ "μ°λ λκ° μ€νν μμ "μ μ μν ν΄λμ€
2) run() λ©μλ μ μ
public void run() {
try {
while (true) {
System.out.println("Hello, Runnable!");
Thread.sleep(500);
}
}
catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
}
- run() λ©μλλ μ°λ λκ° μ€νν μμ μ μ μνλ κ³³
- while (true) { ... } → 무ν 루νλ₯Ό λλ©΄μ "Hello, Runnable!"μ κ³μ μΆλ ₯
- Thread.sleep(500); → 0.5μ΄(500ms) λμ μ€νμ μ μ λ©μΆ€
- catch (InterruptedException ie) { ... } → λ§μ½ κ°μ λ‘ μ°λ λκ° μ€λ¨λλ©΄ "I'm interrupted"λΌλ λ©μμ§λ₯Ό μΆλ ₯
3) ThreadExample2 ν΄λμ€μμ μ°λ λ μ€ν
public class ThreadExample2 {
public static final void main(String[] args) {
- main() λ©μλλ νλ‘κ·Έλ¨μ΄ μ€νλ λ κ°μ₯ λ¨Όμ μ€νλλ κ³³
4) μ°λ λ κ°μ²΄ μμ±
Thread thread = new Thread(new MyThread2());
- new MyThread2() → μ°λ¦¬κ° λ§λ MyThread2 κ°μ²΄λ₯Ό μμ±
- new Thread(new MyThread2()) → Thread ν΄λμ€μ μμ±μμ MyThread2 κ°μ²΄λ₯Ό λ겨μ€
- μ΄ κ³Όμ μμ Thread κ°μ²΄κ° MyThread2μ run() λ©μλλ₯Ό μ€νν μ€λΉλ₯Ό ν¨
5) μ°λ λ μμ
thread.start();
- start()λ₯Ό νΈμΆνλ©΄ μ°λ λκ° μ€νλ¨
- start()λ₯Ό μ€ννλ©΄ Javaκ° μλμΌλ‘ run() λ©μλλ₯Ό μ€ν
6) λ©μΈ μ°λ λμμ λ©μμ§ μΆλ ₯
System.out.println("Hello, My Runnable Child!");
- λ©μΈ μ°λ λλ λ³λλ‘ "Hello, My Runnable Child!"λ₯Ό μΆλ ₯
- μ€μν μ μ μ°λ λλ λ 립μ μΌλ‘ μ€νλκΈ° λλ¬Έμ μΆλ ₯ μμκ° μΌμ νμ§ μμ μ μμ
4.2. νλ‘κ·Έλ¨ μ€ν κ²°κ³Ό
Hello, My Runnable Child!
Hello, Runnable!
Hello, Runnable!
Hello, Runnable!
...
- "Hello, My Runnable Child!"λ λ©μΈ μ°λ λμμ μ€ν
- "Hello, Runnable!"μ μλ‘μ΄ μ°λ λμμ 0.5μ΄λ§λ€ λ°λ³΅ μΆλ ₯
- λ©μΈ μ°λ λμ MyThread2 μ°λ λλ λ 립μ μΌλ‘ μ€νλλ€.
4.3. Runnableμ μ¬μ©νλ μ΄μ
β Thread ν΄λμ€λ₯Ό μμλ°μΌλ©΄ λ€λ₯Έ ν΄λμ€λ₯Ό μμν μ μμ§λ§, Runnable μΈν°νμ΄μ€λ ꡬννλ©΄μ λ€λ₯Έ ν΄λμ€λ₯Ό μμν μ μλ€. β μ½λμ κ΅¬μ‘°κ° λ μ μ°νκ³ , μ μ§λ³΄μκ° μ¬μμ§λ€. β μ¬λ¬ μ°λ λλ₯Ό νλμ Runnable κ°μ²΄μμ μ€νν μ μλ€.
4.4. μ 리
Javaμμ μ°λ λλ₯Ό μμ±νλ λ°©λ²μλ Thread ν΄λμ€λ₯Ό μμνλ λ°©λ²κ³Ό Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ λ°©λ²μ΄ μλ€. Runnable λ°©μμ λ μ μ°νκ³ , κ°μ²΄μ§ν₯μ μΈ μ½λ μμ±μ κ°λ₯νκ² νλ€. λ©ν°μ°λ λ©μ μ νμ©νλ©΄ νλ‘κ·Έλ¨μ μλ΅μ±μ λμ΄κ³ μ±λ₯μ ν₯μμν¬ μ μλ€!
5. λΆλͺ¨ threadμ λκΈ°
package ch04;
public class ThreadExample4 {
public static final void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i <5; i++) {
System.out.println("Hello, Lambda Runnable!");
}
};
Thread thread = new Thread(task);
thread.start();
try {
thread.join();
}
catch (InterruptedException ie) {
System.out.println("Parent thread is interrupted");
}
System.out.println("Hello, My joined Child!");
}
}
5.1. μλ°μμ μ€λ λ
- μ€λ λλ νλ‘κ·Έλ¨μ΄ λμμ μ¬λ¬ μμ μ μνν μ μλλ‘ νλ μ€ν λ¨μ
- μλ° νλ‘κ·Έλ¨μ κΈ°λ³Έμ μΌλ‘ λ©μΈ μ€λ λ(main thread)μμ μ€ν
- μΆκ°λ‘ μλ‘μ΄ μ€λ λλ₯Ό λ§λ€λ©΄, μ¬λ¬ μμ μ λμμ μ€νν μ μμ
5.2. μ½λ λΆμ – λΆλͺ¨ μ€λ λ(λ©μΈ)μ μμ μ€λ λ
public static final void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i <5; i++) {
System.out.println("Hello, Lambda Runnable!");
}
};
Thread thread = new Thread(task);
thread.start(); // (1) μμ μ€λ λ μμ!
try {
thread.join(); // (2) λΆλͺ¨ μ€λ λκ° μμ μ€λ λκ° λλ λκΉμ§ κΈ°λ€λ¦Ό
} catch (InterruptedException ie) {
System.out.println("Parent thread is interrupted");
}
System.out.println("Hello, My joined Child!"); // (3) μμ μ€λ λ μ’
λ£ ν μ€νλ¨
}
5.3. μ€ν νλ¦ μμΈ μ€λͺ
1οΈβ£ | λ©μΈ μ€λ λ(main)κ° μ€νλ¨ | πβοΈ λ©μΈ μ€λ λ |
2οΈβ£ | Runnable task μ μ (λλ€μ) | πβοΈ λ©μΈ μ€λ λ |
3οΈβ£ | Thread thread = new Thread(task); (μλ‘μ΄ μ€λ λ κ°μ²΄ μμ±) | πβοΈ λ©μΈ μ€λ λ |
4οΈβ£ | thread.start(); νΈμΆ → μλ‘μ΄ μ€λ λ μμ! | πβοΈ λ©μΈ μ€λ λ → πβοΈ μμ μ€λ λ μμ± |
5οΈβ£ | μμ μ€λ λκ° μ€νλ¨ (Hello, Lambda Runnable!μ 5λ² μΆλ ₯) | πβοΈ μμ μ€λ λ |
6οΈβ£ | thread.join(); → λ©μΈ μ€λ λλ μμ μ€λ λκ° λλ λκΉμ§ κΈ°λ€λ¦Ό(μΌμ μ μ§) | πβοΈ λ©μΈ μ€λ λ(λκΈ°) |
7οΈβ£ | μμ μ€λ λ μ’ λ£ | πβοΈ μμ μ€λ λ μ’ λ£ |
8οΈβ£ | Hello, My joined Child! μΆλ ₯ | πβοΈ λ©μΈ μ€λ λ λ€μ μ€ν |
5.4. join()μ΄ μλ€λ©΄?
λ§μ½ thread.join();μ μμ νλ©΄, λ©μΈ μ€λ λλ κΈ°λ€λ¦¬μ§ μκ³ λ°λ‘ λ€μ μ½λ(System.out.println("Hello, My joined Child!");)λ₯Ό μ€ν. κ·ΈλΌ μ€ν κ²°κ³Όκ° μμ¬μ λμ¬ μλ μμ
β join() μλ κ²½μ° (μμ μ€λ λκ° λλ λκΉμ§ κΈ°λ€λ¦Ό)
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, My joined Child! // π₯ μμ μ€λ λκ° λλ ν μΆλ ₯λ¨
β join() μλ κ²½μ° ( μΆλ ₯ μμκ° μμΌ κ°λ₯μ± λμ )
Hello, Lambda Runnable!
Hello, My joined Child! // β οΈ λΆλͺ¨ μ€λ λκ° λ¨Όμ μ€νλ μλ μμ
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
5. threadμ μ’ λ£: Interrupt
interrupt() λ©μλλ₯Ό μ¬μ©νμ¬ μμ μ€λ λλ₯Ό μ€λ¨ν μ μλ€. μλλ μ΄λ₯Ό νμΈν μ μλ μμ μ μ€λͺ μ΄λ€.
5.1. μ½λ μ€λͺ
public class ThreadExample5 {
public static void main(String[] args) throws InterruptedException {
// (1) μμ μ€λ λμ μμ
μ μ
Runnable task = () -> {
try {
while (true) {
System.out.println("Hello, Lambda Runnable!"); // (2) 0.1μ΄λ§λ€ μΆλ ₯
Thread.sleep(100); // (3) 0.1μ΄ λκΈ°
}
}
catch (InterruptedException ie) { // (4) InterruptedException μμΈ μ²λ¦¬
System.out.println("I'm Interrupted"); // (5) μΈν°λ½νΈ μ μΆλ ₯
}
};
// (6) μλ‘μ΄ μ€λ λ μμ±
Thread thread = new Thread(task); // task μ€νμ μν μλ‘μ΄ μ€λ λ
thread.start(); // (7) μμ μ€λ λ μμ
Thread.sleep(500); // (8) λ©μΈ μ€λ λ 0.5μ΄ λκΈ°
thread.interrupt(); // (9) μμ μ€λ λμ μΈν°λ½νΈ μ νΈ λ³΄λ
System.out.println("Hello, My interrupted Child!"); // (10) λ©μΈ μ€λ λμ μΆλ ₯
}
}
5.2. νλ‘κ·Έλ¨ μ€ν κ²°κ³Ό
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
I'm Interrupted
Hello, My interrupted Child!
6. Multicore νλ‘κ·Έλλ°
Multicore μμ€ν μμλ μ¬λ¬ κ°μ νλ‘μΈμ μ½μ΄κ° λμμ μμ μ μ²λ¦¬ν μ μμ΄, λ³λ ¬ μ€ν(Parallel Execution)μ ν΅ν΄ μ±λ₯μ κ·Ήλνν μ μμ. νμ§λ§ Multithreadingμ μ¬λ¬ μ€λ λκ° λμμ μ€νλκΈ° λλ¬Έμ, λ€μν λ¬Έμ λ€μ΄ λ°μν μ μμ.
1. μ£Όμ λ¬Έμ λ€
- Task μλ³: λ³λ ¬λ‘ μ€νν μ μλ μμ μ ꡬλΆνλ κ²μ΄ μ€μ
- κ· ν λ¬Έμ : κ° μμ μ μ²λ¦¬ μκ°κ³Ό 리μμ€λ₯Ό κ· ν μκ² λΆλ°°ν΄μΌ ν¨
- λ°μ΄ν° λΆν : ν¨μ¨μ μΈ λ°μ΄ν° λΆν μ΄ νμ
- λ°μ΄ν° μμ‘΄μ±: μμ κ° λ°μ΄ν° μμ‘΄μ±μ ν΄κ²°ν΄μΌ ν¨
- λλ²κΉ μ΄λ €μ: μ¬λ¬ μ€λ λκ° λμμ μ€νλμ΄ λλ²κΉ μ΄ μ΄λ €μμ§
2. λ³λ ¬ μ²λ¦¬μ λ κ°μ§ μ ν
- λ°μ΄ν° λ³λ ¬μ±: λμΌν μμ μ μ¬λ¬ λ°μ΄ν° μΈνΈμ λν΄ λμμ μ²λ¦¬.
- μμ λ³λ ¬μ±: μλ‘ λ€λ₯Έ μμ μ λμμ μ€ν.
3. λΆμ° μμ€ν κ³Ό ν΄λΌμ°λ
νλ μμ€ν μμλ λΆμ° μμ€ν κ³Ό ν΄λΌμ°λλ₯Ό ν΅ν΄ μ¬λ¬ μλ²κ° λ³λ ¬λ‘ μμ μ λΆλ΄ν©λλ€. μ΄λ Multicore μμ€ν μ λμ΄μλ λΆμ° μ²λ¦¬ νκ²½μ μλ―Ένλ©°, λ°μ΄ν° μμ‘΄μ±κ³Ό κ· νμ λ§μΆλ κ²μ΄ μ€μ
6. Amdahl'sμ 곡μ
μ½μ΄λ 무쑰건 λ§μμλ‘ μ’μκΉ?
Amdahl's λ²μΉμ λ³λ ¬ μ²λ¦¬μμ μ±λ₯ ν₯μμ νκ³λ₯Ό μ€λͺ ν¨. μ½μ΄ μκ° λ§μμ§μλ‘ μ±λ₯μ΄ λΉλ‘ν΄ μ¦κ°νλ κ²μ΄ μλλΌ, λ³λ ¬ μ²λ¦¬ν μ μλ λΆλΆμ νκ³λ‘ μΈν΄ μ±λ₯ ν₯μμ νκ³κ° μ‘΄μ¬.
Amdahl's λ²μΉ 곡μ:
Stotal=1(1−P)+PNS_{total} = \frac{1}{(1 - P) + \frac{P}{N}}
- S_total: μ 체 μ±λ₯ ν₯μ λΉμ¨
- P: λ³λ ¬νκ° κ°λ₯ν λΆλΆμ λΉμ¨
- N: μ¬μ©νλ νλ‘μΈμ(μ½μ΄)μ μ
ν΅μ¬ ν¬μΈνΈ
- μ½μ΄κ° λ§λ€κ³ 4λ°° λΉ¨λΌμ§μ§ μλλ€: μλ₯Ό λ€μ΄, λ³λ ¬νκ° κ°λ₯ν λΆλΆμ΄ 75%λΌλ©΄, 4κ°μ μ½μ΄λ‘λ μ±λ₯μ΄ μ½ 3λ°° ν₯μ. λλ¨Έμ§ 25%μ μμ°¨μ μ²λ¦¬ λΆλΆμ μ¬μ ν ν μ½μ΄μμ μ²λ¦¬λμ΄ λ³λ ¬ μ²λ¦¬μ μ±λ₯ ν₯μμ μ νμ μ€.
- λ³λ ¬ μ²λ¦¬μ νκ³: λ³λ ¬ μ²λ¦¬κ° κ°λ₯ν λΆλΆμ΄ λ§μ§ μμΌλ©΄, μ½μ΄ μκ° μ무리 λ§μλ μ±λ₯ ν₯μμ΄ μ νμ .