실행 중인 프로그램
으로, 코드, 힙, 스택 등을 포함한 시스템 자원과 메모리 등의 OS 자원이 할당된 단위이다.IPC 는 서로 다른 프로세스가 데이터를 주고받거나 동기화하는 방법을 의미함.
각 프로세스는 독립된 메모리 공간을 가지고, 한 프로세스의 데이터를 다른 프로세스가 직접 접근할 수 없음.
예시로는 세마포어(semaphores), 메시지 큐(Message Queues) 가 있음.
프로세스 테이블이란
- OS 가 모둔 실행 중인 프로세스에 대한 정보를 저장하고, 관리하기 위해 사용하는 데이터 구조를 말한다.
- 컴퓨터에서 프로그램이 실행되면, 해당 프로그램은 프로세스가 되고, OS는 해당 프로세스를 관리하기 위하여 프로세스 테이블에 여러 가지 중요한 정보를 입력함.
- 다음과 같은 정보 입력
- PID(Process ID) : 각 프로세스를 구별하는 고유한 번호
- 프로세스 상태 : 실행 중, 대기 중, 준비 완료 등
- 등등..
프로세스
스레드
fork()
, create()
, spawn()
과 같은 시스템 호출을 이용한다.fork()
, pthread_create()
와 같은 함수를 통해 생성된다.ProcessBuilder
로 외부 프로그램을 프로세스로 올리는 작업을 수행할 수 있다면스프링에서는 기본적으로 멀티 스레딩으로 동작한다.
순수 자바에서는 Runnable
와 Callable
, Thread
등으로 구현이 가능하다.
또한 스레드를 매번 생성하는 작업 자체가 비용이 어느정도 필요하기에 미리 ExecutorService
를 통하여 스레드 풀을 미리 생성해 놓는게 성능적으로 유리하다.
이미 생성된 스레드를 통해 병렬적으로 쓰기 작업을 수행하는 코드 예제이다.
public class MultiThreading {
public static void main(String[] args) {
try (Writer write = new OutputStreamWriter(System.out, UTF_8)) {
ExecutorService availableProcessors = makeMultipleThread();
submitTasks(availableProcessors, write);
//모든 스레드 작업이 완료될때 까지 기다리고, 스레드풀을 종료한다.
availableProcessors.shutdown();
availableProcessors.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS);
write.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
private static ExecutorService makeMultipleThread() {
// 현재 시스템의 코어 수만큼 스레드를 생성
return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
}
private static void submitTasks(ExecutorService executorService, Writer os) {
for (int i = 0; i < 10; i++) {
// 스레드 풀에 작업을 제출한다. ( 비동기적으로 콘솔에 출력스트림에 해당 스레드의 이름을 출력한다. )
executorService.submit(() -> {
try {
os.write("Thread Name : " + Thread.currentThread().getName() + "\n");
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}