개발자 면접 공부/운영체제,CS

프로세스(PROCESS) , 스레드(THREAD) #2

chogyujin 2020. 1. 18. 19:17
728x90

단일 스레드

- 하나의 프로세스에서 하나의 스레드 실행

- 하나의 레지스터와 스택으로 표현

멀티 스레드

- 프로그램을 다수의 실행 단위로 나누어 실행

- 프로세스 내에서 자원을 공유하여 자원생성과 관리의 중복을 최소화

- 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공

- 각각의 스레드가 고유의 레지스터와 스택으로 표현됨

단일 스레드와 멀티스레드 시스템


단일 스레드와 멀티스레드의 장단점

 

단일 스레드의 장점

1) 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.

여러 개의 스레드가 공유된 자원을 사용할 경우 각 스레드가 원하는 결과를 얻게 하려면

공용 자원에 대한 접근이 통제되어야 하며 이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다.

단일 스레드 모델에서는 이러한 작업이 필요하지 않다.

 

2) 문맥 교환(context switch) 작업을 요구하지 않는다.

문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.

 

단일 스레드의 단점

1) 여러 개의 CPU를 활용하지 못한다.

프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.

이 때 고려해야할 문제가 있는데, 바로 다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가에 대한 문제다.

사실 이것은 멀티 스레드 환경의 서버 프로그램도 확장성을 확보하기 위해 풀어야 할 숙제이긴 하다.

단순하고 빠른 메모리 기반 NoSQL 데이터 베이스인 Redist가 좋은 고려대상이다.

하지만 서버 프로그램 인스턴스 간 상태 공유를 최소화하거나 가능하면 없애는 방향으로 아키텍처를 설계하는 것이 가장 바람직한 방법이라고 한다.

 

멀티 스레드의 장점

1) 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.

2) 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다

3) 프로세스의 문맥교환보다 스레드의 문맥교환이 더 빠르다.

 

멀티 스레드의 단점

1) 하나의 스레드만 실행중일 때에는 실행시간이 되려 지연될 수 있다.

2) 멀티 스레딩을 위해 운영체제의 지원이 필요하다.

3) 스레드 스케쥴링을 신경써야 한다


멀티 프로세스(Multi Process)

  • 부모-자식 관계라고 해도 자신만의 메모리 영역을 가지게 된다.
  • 환경변수와 프로세스 핸들 테이블이 상속 가능할 뿐 결국 독립적인 관계이다.
  • fork를 통해 프로세스를 복사한다.
  • 유닉스 계열에서 ps 명령어로 현재 수행되고 있는 프로세스를 확인할 수 있다.
  • 프로세스 간의 통신을 하려면 IPC(Inter Process Communication; 세마포어, 큐, 공유메모리)를 통해야 한다.

멀티 프로세스

멀티 스레드(Multi Thread)

  • 하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동 시킬 수 있다.
  • 스레드는 다음과 같은 공유 메모리를 가진다.

멀티 스레드

멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가진다

  1. 컨텍스트 스위칭(Context Switching) 시에 공유 메모리 만큼의 시간(자원) 손실이 줄어든다.
    : 프로세스 간의 컨텍스트 스위칭시 단순히 CPU 레지스터 교체 뿐만이 아니라 RAM과 CPU사이의 캐쉬메모리에 대한 데이터 까지 초기화 되므로 상당한 부담이 발생한다.
  2. Stack을 제외한 모든 메모리를 공유하기 때문에 global(전역), static(정적) 변수 그리고 new, malloc에 의한 모든 자료를 공유할 수가 있다.
    : 이는 프로세스간 통신(ex.pipe)과 같이 복잡한 과정을 거치지 않고 보다 효율적인 일처리가 가능하다는 것을 뜻한다. (핸들 테이블과 환경변수는 덤이다.)

멀티 프로세스로 할 수 있는 작업들을 멀티 스레딩으로 하는 이유

1. 멀티 프로세스로 실행되는 작업을 멀티 스레드로 할 경우 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.

2. 프로세스 간의 Context Switching시 캐시, 메모리에 대한 데이터까지 초기화가 되어서 오버헤드가 크다.

3. 스레드는 프로세스 내의 메모리를 공유하기 때문에 데이터 교환이 더 간단하다.

4. 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

5.  프로세스 간의 통신 보다 스레드 간의 통신이 메모리와 자원 할당에 필요한 비용을 줄일 수 있다.

 

IPC를 통한 프로세스간의 통신

프로세스간 데이터 교환을 하려면 소켓이나 공유 메모리 같은 IPC(Inter Process Communication)을 이용해서 데이터 교환을 해야 한다.

 

스레드 간 통신

프로세스를 뛰우기 위해 메모리와 자원을 할당하는 작업 없이 이미 프로세스에 할당된 자원과 메모리를 그대로 사용하여 스레드를 생성하여 작업하므로 메모리와 자원 할당에 필요한 비용을 줄일 수 있다.