[JAVA] Process와 Thread

춤추는 머쉬룸·2024년 1월 2일
0

2024 CNU NHN ACADEMY

목록 보기
1/15
post-thumbnail

Java Network Programming 01
(Week 01)

Process

  • i5, i7 같은 것.
  • CPU 에서 PU 는 Process Unit. C 는 중앙
  • GPU에서도 마찬가지. G는 그래픽. 단순한 연산을 반복하기를 잘함.
  • 작업 관리자에 뜨는 하나하나의 프로그램이 프로세스
  • 프로세스 안에 쓰레드 안에 레지스터, 스택, 힙, 스태틱, 코드가 있음. 코드는 실행하는 프로그램. 스택, 힙, 스태틱은 메모리에 올라가는 것들.
  • Static : 실행할 때 올려놓고 바뀌지 않는 것. 정적인 것.
  • Heap : 자바는 따로 메모리 관리 안해도 되지만 garbage collector 가 있어서 알아서 관리해줌. new로 해서 생성되는 모든 것.
  • Stack : 함수에서 쓰는 것들이 계속해서 쌓이는 곳. return 하면 다 풀어짐.

  • CPU 는 한 시점에 하나의 프로세스만 동작함.
  • 근데 왜 우리 눈에는 다 같이 도는 것처럼 보이지?
    • 사실 a, b, c가 있으면 어마어마하게 빠르게 돌아가면서 돈다.
    • 초당 20억번 나눠서 연산 가능
    • CPU 점유율을 보면 알 수 있음
    • a 에서 b 로 바뀌는 순간 a에 있던 건 메모리에 백업해둠. b 에 있는 것들은 다시 리소스에 올려서 연산 다시 시작 == task switching
    • 이러한 정보를 가진 것이 레지스터

  • Storage 의 프로그램을 실행하면, 실행을 위해 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라간다. 이 순간부터 Process 가 된다.
  • Process == task

Thread

  • 프로세스에 프로그램을 올리는데 같은 프로그램일 때 안바뀌는 영역이 있다! Code, Static, Heap 영역은 같은 프로그램이라면 바뀌지 않음. 공유가 가능함. Heap 은 사실 각자 쓰지만 new 해서 만들어지는 것이라 공유 가능함.
  • 그러나 Stack 은 나만의 정보고, Register은 값들을 가지고 있는 곳으로, 계산이 실질적으로 이루어지는 곳
  • 쓰레드를 사용하는 프로그램을 프로그래밍 할때는 두개 돌린다고 생각하는 것이 아니라 공유되는 영역만 생각하면 됨

  • 요즘 네트워크는 모두 비동기
    • 누가 대신 좀 받아줘. 왔으면 나에게 전달
    • 하나의 프로그램에서 주고 받고가 되어야 하기 때문에 쓰레드가 필요


Process 와 Thread 차이

  • 프로세스는 모든 자원을 가지고 있어서 무겁다. 쓰레드는 분리가 필요한 자원들만 최소한으로 가져서 가볍다
  • 프로세스는 프로세스 별로 자체 메로리를 갖는다. 쓰레드는 다른 프로세스와 메모리를 공유한다.
  • 프로세스는 개별 메모리로 프로세스 간 통신이 느리다. 쓰레드는 공유 메모리로 직접 통신이 가능해서 빠르다.
  • 프로세스는 os 자체에서 메모리를 관리한다. 그래서 memory swapping 이 가능하다. 쓰레드는 불가능하다. → 리소스가 적을 때의 이야기

Single Thread

  • Main 쓰레드에서 작업 진행, 작업은 순차적으로 진행
  • 하나의 프로세스에서 오직 하나의 스레드로만 실행
    • 단일 레지스터와 스택으로 구성
    • Context Switching 작업을 요구하지 않음
    • 동시성 제어에 대한 처리를 신경쓰지 않아도 됨

Multi Thread

  • 프로그램 내에서 두 개 이상의 동작을 동시에 실행
    • 프로세서의 활동을 극대화
    • 두 개가 동작을 동시에 실행
    • io (ssd, network) 에 엑세스 하면 Cpu 동작하는 소리가 완전 큼. Cpu 에 비해서 다른 기계들은 느리니까 그 사이에 다른 작업을 하고 있을 수 있음.
  • 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유
    • 자원의 생성과 관리의 중복성 최소화
    • 수행 능력 향상

0개의 댓글