프로세스(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 |