Home > CS > 2024 > ๐Ÿ’พ [CS] CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ’พ [CS] CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?
CS

๐Ÿ’พ [CS] CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์†๋„๊ฐ€ CPU์˜ ์ฒ˜๋ฆฌ ์†๋„์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์—ฐ์‚ฐ์ด๋‚˜ ๊ณ„์‚ฐ ์ž‘์—…์ด ๋งŽ์•„์„œ CPU๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, CPU์˜ ์„ฑ๋Šฅ์ด ์ „์ฒด ์ž‘์—…์˜ ์„ฑ๋Šฅ์„ ๊ฒฐ์ •์ง“๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

1๏ธโƒฃ CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์˜ ํŠน์ง•.

1๏ธโƒฃ ๋ณต์žกํ•œ ๊ณ„์‚ฐ ์ž‘์—….

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ์ˆ˜ํ•™ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์•”ํ˜ธํ™”, ๋จธ์‹  ๋Ÿฌ๋‹ ๋“ฑ ๋งŽ์€ ์—ฐ์‚ฐ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • CPU๊ฐ€ ๊ณ„์†ํ•ด์„œ ๊ณ„์‚ฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด(์˜ˆ: ๋””์Šคํฌ, ๋„คํŠธ์›Œํฌ)์˜ ์†๋„์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  CPU์˜ ์†๋„์— ์˜ํ•ด ์„ฑ๋Šฅ์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ CPU ์‚ฌ์šฉ๋ฅ ์ด ๋†’์Œ.

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์€ CPU์˜ ์—ฐ์‚ฐ ์ž์›(CPU ์ฝ”์–ด(CPU Core)์™€ ํด๋Ÿญ ์†๋„(Clock Speed))์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ CPU Core

์ค‘์•™์ฒ˜๋ฆฌ์žฅ์น˜(Central Processing Unit, CPU) ๋‚ด๋ถ€์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ˜๋ฆฌ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ์ฝ”์–ด(Core)๋Š” ์ž์‹ ๋งŒ์˜ ์—ฐ์‚ฐ ์žฅ์น˜(ALU), ๋ ˆ์ง€์Šคํ„ฐ, ์ œ์–ด ์žฅ์น˜ ๋“ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์–ด, ํ”„๋กœ๊ทธ๋žจ์˜ ๋ช…๋ น์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„๋Œ€์˜ CPU๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Core(Multi Core)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด, ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ํด๋Ÿญ ์†๋„(Clock Speed)

ํด๋Ÿญ ์†๋„(Clock Speed)๋Š” CPU๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†๋„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ๋กœ, 1์ดˆ ๋™์•ˆ CPU๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด ์‚ฌ์ดํด์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
ํด๋Ÿญ ์†๋„(Clock Speed)๋Š” ํ—ค๋ฅด์ธ (Hz) ๋‹จ์œ„๋กœ ์ธก์ •๋˜๋ฉฐ, ๋ฉ”๊ฐ€ํ—ค๋ฅด์ธ (MHz) ๋˜๋Š” ๊ธฐ๊ฐ€ํ—ค๋ฅด์ธ (GHz)๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 1GHz๋Š” CPU๊ฐ€ 1์ดˆ์— 10์–ต ๋ฒˆ์˜ ๋ช…๋ น์–ด ์‚ฌ์ดํด์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
ํด๋Ÿญ ์†๋„(Clock Speed)๊ฐ€ ๋†’์„์ˆ˜๋ก CPU๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์—ฌ, ๋” ๋งŽ์€ ์ž‘์—…์„ ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ CPU ์‚ฌ์šฉ๋ฅ (CPU Utilization)์ด ๋†’๊ฒŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ, CPU ์„ฑ๋Šฅ์ด ์ „์ฒด ์ž‘์—… ์†๋„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์˜ ์˜ˆ.

1๏ธโƒฃ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ.

  • ๋Œ€๋Ÿ‰์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๋Š” ์ž‘์—…์€ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋งŽ์€ ๊ณ„์‚ฐ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ์ž‘์—…์€ CPU์˜ ๊ณ„์‚ฐ ์†๋„์— ์˜ํ•ด ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋น„๋””์˜ค ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ.

  • ๋น„๋””์˜ค ํŒŒ์ผ์„ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ๋””์ฝ”๋”ฉํ•˜๋Š” ์ž‘์—…์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ํ”„๋ ˆ์ž„์„ ์••์ถ•ํ•˜๊ฑฐ๋‚˜ ๋ณต์›ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU ๋ฐ”์šด๋“œ ์ž‘์—…(CPU-Bound Task)์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”.

  • ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๊ณผ์ •์€ CPU๊ฐ€ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ์ฃผ๋กœ ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ๊ณผํ•™ ๊ณ„์‚ฐ ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„.

  • ๋ฐ์ดํ„ฐ ๋ถ„์„, ์ˆ˜ํ•™์  ๋ชจ๋ธ๋ง, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋“ฑ ์ˆ˜๋งŽ์€ ๊ณ„์‚ฐ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ž‘์—…๋„ CPU ๋ฐ”์šด๋“œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ ํ†ต๊ณ„์ ์ธ ๊ณ„์‚ฐ์„ ํ•˜๋Š” ์ž‘์—…์€ CPU์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๊ฒŒ์ž„ ๋กœ์ง ๋ฐ ๋ฌผ๋ฆฌ ์—”์ง„.

  • ๊ฒŒ์ž„ ๋‚ด์˜ ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ, AI ์ฒ˜๋ฆฌ, ๊ฒŒ์ž„ ๋กœ์ง ๋“ฑ์€ ๋งŽ์€ ๊ณ„์‚ฐ์„ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU ๋ฐ”์šด๋“œ ์ž‘์—…์— ์†ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ CPU ๋ฐ”์šด๋“œ vs I/O ๋ฐ”์šด๋“œ

1๏ธโƒฃ CPU ๋ฐ”์šด๋“œ

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์ด CPU ์ฒ˜๋ฆฌ ์†๋„์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด๋‚˜ ์—ฐ์‚ฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ CPU ๋ฐ”์šด๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ๋น„๋””์˜ค ์ธ์ฝ”๋”ฉ, ์•”ํ˜ธํ™” ๋“ฑ.

2๏ธโƒฃ I/O ๋ฐ”์šด๋“œ

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์ด ์ž…์ถœ๋ ฅ(I/O) ์ž‘์—…์˜ ์†๋„์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๋“ฑ ์™ธ๋ถ€ ์žฅ์น˜์˜ ์†๋„์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ: ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ, ์›น ํŽ˜์ด์ง€ ์š”์ฒญ ๋“ฑ

4๏ธโƒฃ CPU ๋ฐ”์šด๋“œ ์ž‘์—…์˜ ์ตœ์ ํ™”.

1๏ธโƒฃ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallel Processing)

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…์€ ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ฝ”์–ด์—์„œ ๋™์‹œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Java์—์„œ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ(Multithreading)์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ Fork/Join Framework๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒœ์Šคํฌ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์˜ˆ์‹œ(Java์—์„œ Fork/Join Framework)

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;

public class SumTask extends RecursiveTask<Long> {
    private final int[] array;
    private final int start;
    private final int end;
    
    public SumTask(int[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }
    
    @Override
    protected Long compute() {
        if (end - start <= 10) { // ์ž‘์€ ์ž‘์—…์€ ์ง์ ‘ ๊ณ„์‚ฐ
            long sum = 0;
            for (int i = start; i < end; i++) {
                sum += array[i];
            }
            return sum;
        } else { // ํฐ ์ž‘์—…์€ ๋ถ„ํ• 
            int mid = (start + end) / 2;
            SumTask 
        }
    }
    
    public static void main(String[] args) {
        int[] array = new int[1000];
        ForkJoinPool pool = new ForkJoinPool();
        SumTask task = new SumTask(array, 0, array.length);
        long sum = pool.invoke(task);
        System.out.println("Sum: " + sum);
    }
}

2๏ธโƒฃ ์—ฐ์‚ฐ ์ตœ์ ํ™”.

  • ๋ฐ˜๋ณต์ ์ธ ๊ณ„์‚ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ตœ์ ํ™”ํ•˜๊ฑฐ๋‚˜, ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์—์„œ๋Š” ๋งค๋ฒˆ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค ์ •๋ ฌ ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ์ฒดํฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์บ์‹ฑ(Caching)

  • ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜๋Š” ๊ฐ’๋“ค์„ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ , ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๊ณ„์‹ผํ•˜์ง€ ์•Š๊ณ  ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…์—์„œ๋Š” ์ค‘๋ณต๋œ ๊ณ„์‚ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5๏ธโƒฃ ์š”์•ฝ.

  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…์€ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์ด CPU์˜ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ ์†๋„์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๋ณต์žกํ•œ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์•”ํ˜ธํ™” ๋“ฑ CPU๊ฐ€ ๋งŽ์€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ, ์—ฐ์‚ฐ ์ตœ์ ํ™”, ์บ์‹ฑ ๋“ฑ์˜ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ CPU ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CPU ๋ฐ”์šด๋“œ ์ž‘์—…์€ I/O ๋ฐ”์šด๋“œ ์ž‘์—…๊ณผ ๋Œ€์กฐ์ ์œผ๋กœ, ์—ฐ์‚ฐ ์ž‘์—…์ด ์ค‘์‹ฌ์ด ๋˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.