본문 바로가기
코딩 공부/CS

[CS] 프로세스와 스레드

by 현장 2023. 2. 25.

프로세스(Process) 

실행중에 있는 프로그램(Program)메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 운영체제로부터 시스템 자원을 할당받는 작업의 단위 즉, 동적인 개념으로는 실행된 프로그램을 의미한다.

특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.

스레드(Thread)

프로세스 내에서 실행되는 여러 흐름의 단위로 프로세스의 특정한 수행 경로로 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다.

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

※ 스레드에 상태를 유지하게 되면 멀티 스레드 환경에서 RaceCondition이라는 문제가 생깁니다.

// Counter.java

package org.example.counter;

public class Counter implements Runnable {
    private int count = 0;

    public void increment() {
        count++;
    }

    public void decrement() {
        count--;
    }

    public int getValue() {
        return count;
    }

    @Override
    public void run() {
        this.increment();
        System.out.println(
        		"Value for Thread After Increment" + Thread.currentThread().getName() + " " + this.getValue()
            ); // 1
        this.decrement();
        System.out.println(
        		"Value for Thread at last" + Thread.currentThread().getName() + " " + this.getValue()
            ); // 0
    }
}
// RaceConditionDemo.java

package org.example.counter;

public class RaceConditionDemo {
    public static void main(String[] args) {
        Counter counter = new Counter();
        Thread thread1 = new Thread(counter, "Thread-1");
        Thread thread2 = new Thread(counter, "Thread-2");
        Thread thread3 = new Thread(counter, "Thread-3");

        thread1.start();
        thread2.start();
        thread3.start();

    }
}
// 싱글톤 객체에서 상태를 유지하게 설계하면 문제가 발생한다.
출력
 Value for Thread After IncrementThread2 2
Value for Thread After IncrementThread3 3
Value for Thread After IncrementThread1 2
Value for Thread at lastThread1 0
Value for Thread at lastThread2 2
Value for Thread at lastThread3 1

하지만 동기화를 통해서 해결도 가능합니다.

 

References

'코딩 공부 > CS' 카테고리의 다른 글

CGI(Common Gateway Interface)  (0) 2023.05.18
[Network] TCP와 UDP  (0) 2023.05.18
[CS] 프레임워크와 라이브러리  (0) 2023.02.13
[CS] 메모리 구조 (Stack, Heap, Data, Code)  (0) 2023.02.02
[CS] 객체지향설계 5원칙 : SOLID  (0) 2023.02.01