Server

Process와 Thread

기기디 2022. 4. 4. 23:26

정의

Process

  • 실행중인 프로그램을 말한다. 운영체제로부터 시스템 자원을 할당 받는 작업의 단위를 말한다.
  • 프로그램을 실행하면 OS로 부터 메모리를 할당받아 프로세스가 된다.
  • 정리 : 운영체제에서 자원을 할당받아 실행중인 프로그램이다.

Thread

  • 프로세스 내에서 실행되는 흐름의 단위. 할당 받은 자원을 이용하는 실행의 단위. 프로세스 안에서 여러개가 생길 수 있다.
  • 프로세스의 자원을 이용해서 실제로 작업을 수행하는것을 쓰레드라고 말할 수 있다.
  • 경량 프로세스라고 불리기도 한다.
  • 정리 : 쓰레드는 프로세스 안에서 실제로 작업을 수행하는 실행단위이다.

Multi Process

  • 하나의 응용프로그램을 여러개의 프로세스로 구성하여 하나의 작업을 처리하게 하는것이다.

Multi thread

  • 하나의 응용프로그램을 여러개의 쓰레드로 구성하고 하나의 작업을 처리하게한다.

특징

Process

  • 기본적으로 최소 1개의 스레드(메인스레드)를 가지고있다.
  • 하나의 프로세스는 stack, heap, data, text(code) 크게 네개의 메모리 영역으로 나눠져 있다.
  • Stack : 매개변수,지역변수 등 임시적인 데이터를 저장할때 사용하는 공간. / Heap : 동적으로 할당되는 메모리 / Data : 전역변수 / Text : Program의 코드
  • 프로세스가 다른 프로세스에 접근하려면 프로세스간 통신IPC를 사용해야한다.

Thread

  • 같은 프로세스안에서 스레드별로 register,Stack영역은 따로 할당받고 Text, Data, Heap영역들은 공유한다.
  • 모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출스택을 필요로 하기 때문에 새로운 쓰레드를 실행시킬때마다 새로운 호출스택이 생성되고 종료되면 호출스택은 소멸된다. → 모든 쓰레드는 독립적인 작업을 수행하기 위하여 개별적으로 스택멕모리를 할당받는다.

Java에서 Thread

  • 자바에서 Thread구현하는 방법은 Thread Class를 상속받거나 Runnable인터페이스를 구현하는 방법으로 나눠져 있다. 자바는 다중상속을 지원하지 않아 Thread클래스를 상속받으면 다른 클래스를 상속 받을 수 없기에 Runnable클래스를 구현하는 방법이 존재한다.
  • start()안에 run()이 존재한다. start()로 해당 쓰레드의 호출스택callStack을 생성하고 호출스택에 run()이 실행되어 Thread가 작업을 수행한다.
  • 자바에서 스레드는 JVM이 운영체제 역할을 한다. JVM기준에서는(JVM도 가상OS니까) 프로세스가 존재하지 않고 스레드만 존재하며 자바 스레드는 JVM에 의해서 스케줄되는 실행단위 코드블록이다.
  • 한번 종료된 쓰레드는 다시 실행할 수 없다.

Multi Process

  • 프로세스간 접근을 위하여 IPC가 필수적으로 구현되어야한다. 멀티스레드 환경에서 스레드간 통신과 비교했을때 더 많은 리소스를 사용한다.
  • 개별 프로세스마다 운영체제로부터 자원을 할당받아야한다.

Multi Thread

  • 멀티프로세스환경과 비교했을때 스택영역을 제외한 메모리영역을 공유하여 사용하기 때문에 상대적으로 멀티 프로세스구조보다 메모리를 적게 사용한다. 같은 환경에서 멀티프로세스 구조였다면 프로세스마다 새롭게 시스템 자원을 할당받아 사용해야한다.

보조개념정리

ContextSwitching문맥교환

  • 여러 프로세스를 돌아가며 작업을 처리하는 과정을 말한다.
  • 동작중인 하나의 프로세스가 대기를 하면서 해당 프로세스의 상태(context)를 보관하고 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
  • cpu안의 레지스터가 맡는 실행중이 프로세스가 변경되면 레지터스들의 값이 변경되어야한다. 변경되기전에 이전 프로세스가 가지고 있던 데이터들을 저장해줘야한다. 이걸 context라고 부른다. 그리고 새로 실행되는 프로세스가 아니라면 이전에 실행될때 레지스터들이 지니고 있던 데이터들을 불러와서 이어서 실행하는 과정을 말한다.

IPC

  • Inter Process Communication. 프로세스간 데이터를 주고받는 작업을 말한다.

PCB

  • 운영체제가 프로세스를 제어하기 위해 정보를 저장해놓는곳으로 프로세스상태관리와 컨텍스트 스위칭을 위하여 필요하다.

데몬쓰레드

  • 실행중인 다른 일반쓰레드가 없으면 자동종료된다.
  • 이러한 특징은 모니터링 쓰레드에 사용된다. 특정 쓰레드를 모니터링하는 쓰레드가 있다는 가정하에 특정쓰레드가 종료되면 관련된 모니터링 쓰레드도 종료가 되어야 프로세스가 종료될 수 있을것이다. 이런 경우 모니터링쓰레드를 데몬쓰레드로 만들어 활용한다.
  • 가비지컬렉터, 화면자동갱신기능 등이 데몬쓰레드에 속한다.

결론

멀티스레드가 멀티프로세스보다 많이 사용되는 이유

  • 같은 작업을 수행한다는 가정하에 멀티스레드가 훨씬 더 적은 자원을 사용하기 떄문이다. 첫번째로 멀티프로세스는 프로세스간 작업을 하기위해 IPC를 통해야하는데 멀티스레드는 별도로 통신 할 필요없이 Heap메모리 공유를 통하여 병렬작업이 가능하여 훨씬 더 적은 메모리를 소비한다. 두번쨰로 멀티프로세스는 프로세스마다 운영체제로부터 새롭게 자원을 할당받아야하는데 멀티스레드는 하나의 프로세스 안에서 스레드당 별도의 스택영역을 하는것만으로도 동시에 여러 작업을 수행하는게 가능하다. 세번째로 같은 컨텍스트 스위칭이 일어나더라도 멀티쓰레드가 더 빠르다. 프로세스는 프로세스간 공유하는 데이터영역이 없으므로 저장된 캐시가 존재하지 않는 반면에 스레드는 컨텍스트스위칭이 일어나도 캐시를 공유하기에 컨텍스트 스위칭이 빠르다. 또한 컨텍스트스위칭이 프로세스는 PCB하드웨어 영역에서 일어나는 반면 쓰레드는 프로세스에 할당된 메모리영역 안에서 이루어진다.

멀티프로세스 대비 멀티스레드의 단점

  • 동기화의 문제가 존재한다. 스레드간 통신의 방법으로 메모리공간을 공유한다. 공유하는 객체,메소드를 동시에 여러 스레드가 접근하면 충돌이 일어나 각 스레드의 실행결과가 정확한 값을 보장하지 않는다. 이런 동기화문제를 개발자가 직접 컨트롤해줘야한다는 단점이 존재한다.