-
프로세스(Process) & 스레드(Thread) 정리WEB & CS 2023. 8. 13. 14:45
* 프로세스와 스레드를 공부하기 전에 알아두면 좋은 정보
- 메모리 구조
- code
- 실행 명령을 포함하는 코드들
- cpu가 처리
- data
- 전역변수(global)와 정적(static)변수가 저장
- 프로그램이 종료되면 소멸된다.
- heap
- 동적 메모리 영역
- 사용자가 관리할 수 있는 메모리
- 메모리의 낮은 주소에서 높은 주소 방향으로 할당
- stack
- 지역변수, 매개변수등의 일시적인 데이터가 저장
- 함수 호출이 완료되면 소멸
- Last-In First-Out방식에 따라 동작
- code

memory * context swiching
- cpu에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정
- 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고 다른 프로세스를 처리하기 위한 과정
- 현재 실행중인 프로세스의 상태(context)를 먼저 저장
- 다음 프로세스를 동작시켜 작업을 처리
- 이전에 저장된 프로세스의 상태(context)를 다시 복구
* 인터럽트 : CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요함을 CPU에게 알림
프로세스(Process)
- 프로세서에 의해 실행되는 프로그램이다.
- 하나 이상의 스레드를 가지고 있다.
- OS로부터 자원을 할당받음
- 메모리에 올라온 프로그램의 독립적인 인스턴스
- 독립적인 메모리 구조를 갖는다.
- 다른 프로세스의 변수나 자료구조에 접근이 어렵다.
- 다른 프로세스에 접근하기 위해서 파이프, 소켓등의 IPC를 사용해야한다.

process 스레드(Thread)
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스가 할당받은 자원을 이용
- 프로세스의 stack만 독립적으로 할당받고 나머지(heap, data, code)는 공유한다.
- 다른 프로세스의 스레드에는 접근이 어렵다.
- 동일 프로세스에서 한 스레드가 자원을 변경하면 다른 스레드는 결과를 즉시 확인할 수 있다.

thread 멀티 프로세스
- 여러 프로세스를 구성해 프로그램을 구동
- 하나에 프로세스에 문제가 발생해도 다른 프로세스에는 영향이 없다.
- context swiching 비용이 크게 발생한다.
- context swiching 과정에서 모든 데이터를 지우고 다시 정보를 불러와야한다.
멀티 스레드
- 여러 스레드로 구성하고 각 스레드로 하나의 작업을 처리
- 시스템 자원의 효율성 증대
- context swiching 비용이 적어진다.
- 메모리를 공유하고 있기 때문에 context swiching 과정에서 속도가 빠르고 통신에 대한 부담이 적다.
- 자원 공유를 전역변수를 이용해 충돌이 발생해 동기화 문제가 발생한다.
- 하나에 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
* Java에서의 Thread
- JVM에 의해 관리되고 있다.
- 프로세스가 존재하지 않는다.
- main()도 하나의 스레드이다.
- main() 이외에 다른 스레드를 생성하려면 Thread클래스를 상속받거나 Runable 인터페이스를 구현한다.
class Msg implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("msg....."); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Dev extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("dev....."); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Main { public static void main(String[] args) { Msg m = new Msg(); Thread thread_msg = new Thread(m); thread_msg.start(); Dev d = new Dev(); d.start(); for (int i = 0; i < 10; i++) { System.out.println("main....."); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }* 결과

위 코드 실행 결과 'WEB & CS' 카테고리의 다른 글
WAS(Web Application Server)와 WS(Web Server) 차이점 (0) 2023.10.04 Redirect와 Forward의 차이점 (0) 2023.09.29 Sync & Async & Blocking & Non-Blocking (0) 2023.08.11 자료구조 시작 전 사전지식_linkedList (0) 2023.08.11 CORS 에러 정리(2)_시나리오 (0) 2023.08.11 - 메모리 구조