• 프로세스(process)란?
    • 실행파일을 클릭했을 때, 메모리(RAM) 할당이 이루어지고, 이 메모리 공간으로 코드가 올라간다. 
    • 이 순간부터 이 프로그램은 '프로세스'라 불리게 된다. 
    • 즉, 사용자가 작성한 프로그램이 운영체제에 메모리 공간을 할당받아 실행 중인 것.
      (프로그램에 사용되는 데이터와 메모리 등의 자원, 스레드로 구성 된다.)

  • 스레드(thread)란?
  • 프로세스의 스케줄링
    • CPU는 하나인데, 동시에 여러 프로세스가 실행되어야 한다.
    • CPU는 여러 개의 프로세스를 번갈아가면서 실행하는데  매우 고속이기 때문에 우리 눈에는 동시에 실행되는 것처럼 보인다.
    • 이러한 멀티 프로세스 운영체제에서 프로세스의 CPU 할당 순서 및 방법을 결정짓는 것을 '스케줄링'이라 한다. 

  • 프로세스의 상태변화
    • 프로세스는 Ready, Running, Blocked 상태를 지닌다.
    • Running 상태인 프로세스는 더 우선순위가 높은 프로세스가 실행될 경우 Ready 상태가 되고, 우선순위가 높은 프로세스가 실행된다.
    • Blocked상태에 있는 프로세스는 스케줄러의 관심 밖에 있어서 스케줄러에 의해 선택이 되지 않는 프로세스이다. 

  • 콘텍스트-스위칭(Contxt-switch)과 프로세스
    • cpu내에 존재하는 레지스터들(cpu ram 계산 임시 기억공간) 현재 실행 중인 프로세스 관련 데이터로 채워진다.

    • 실행 중인 프로세스가 변경이 되면, cpu 내내 레지스터들의 값이 변경되어야 하는데 변경되어야 하는데, 변경 이전 프로세스가 지니고 있던 데이터는 어딘가에 저장해주어야 한다 (이어 실행하기 위해)

    • 그리고 새로 실행되는 프로세스가 아니라면 실행될 레지스터들이 지니고 있던 데이터들을 이어서 실행해야 하는데 이과정이 콘텍스트 스위칭이다.

    • 시스템에 많은 부담을 준다. 레지스터 개수가 많을수록, 프로세스별로 관리되어야 할 데이터 종류가 많을수록 부담이 된다 부담이 된다. 콘텍스트 스위칭에 소요되는 시간을 중이려면 저장하고 복원되는 콘텍스트 정보의 개수를 줄여주면 된다.
       
  • 메모리 구조 관점에서 본 프로세스와 스레드
    • 자식 프로세스가 생성되고 난 다음에는 부모 프로세스가 가진 핸들 테이블은 상속되지만 모든 것(Code/data/heap/stack영역) 이 독립적으로 만들어진다.

    • 이러한 메모리 구조를 지녔기에, 프로세스 간에 데이터를 주고받기 위해서는 IPC(Inter Process Communication)가 필요하다.

    • 하지만 스레드를 생성하는 경우 메모리 구조는 다르다. 
      • 프로세스가 스레드 A와 B를 생성한 경우 스레드를 생성할 때마다, 해당 스레드만을 위한 ThreadStack영역(실행 흐름의 추가를 위한 최소 조건)만이 생성될 뿐, 나머지 영역(Code, Data, Heap)은 부모 프로세스 영역을 공유하고 있다. 스레드마다 스택을 독립적으로 할당해준다. 
         
  • 콘텍스트 스위칭이 빨라진 스레드와 캐시 적중
    • 스레드는 공유하는 영역이 많기 때문에 프로세스보다 비교적 콘텍스트 스위칭이 빠르다.

    • 캐시는 CPU와 메인 메모리 사이에 위치하며 CPU에서 한번 이상 읽어 들인 메모리의 데이터를 저장하고 있다가, CPU가 다시 그 메모리에 저장된 데이터를 요구할 때, 메인 메모리를 통하지 않고 데이터를 전달해 주는 용도이다.  (멀티스레드 프로그래밍 시 데이터 불일치 이유, 동기화를 해주는 이유)

    • 프로세스 콘텍스트 스위칭이 일어났을 경우, 공유하는 데이터가 없으므로 캐시가 지금껏 쌓아놓은 데이터들이 무너지고 새로 캐시 정보를 쌓아야 한다. 이것이 프로세스 콘텍스트 스위칭에 부담이 되는 요소이다. 
      반면, 스레드라면 저장된 캐시 데이터는 스레드가 바뀌어도 공유하는 데이터가 있으므로 의미 있다. 그러므로 콘텍스트 스위칭이 빠른 것이다. 

    • 물리적 스레드는 cpu코어와도 관련이 깊다. cpu 코어는 instruction(명령 주기) 하나씩 해석하여 연산을 실행하는 유닛을 뜻한다. 
      스레드란 물리적인 코어 개수와는 별개로 '논리적인' 코어 개수를 뜻하며 통상적으로는 11 코어에 1 스레드를 돌리는 게일반적이었지만, 코어 사용률을 높여 1 코어당 여러 개의 스레드를 동시에 돌리는 하이퍼스레딩 기법이 비교적 최근에 등장하였다. 보통은 cpu core 1개당 실행되는 instance  한 개만 존재하는데, 하이퍼스레딩 시 여러 개의 instance 동시에 돌아간다 생각하면 된다.

    • 정리해 보자면스레드 코어 안에서 Fetch, Decode, Execute, Memory Access, Write 등이 instruction 세부 작업들이 실행되는 과정이라 보면 된다

    • 운영체제가 스케줄링을 할 때 동시에 실행 가능한 스레드 수(CPU 스레드)는 정해져 있다. 

    • 하지만 메모리가 허용하는 소프트웨어적 스레드 수는 얼마든지 많을 수 있다.
      이들 중 운영체제에 의해 실행되지 않는 스레드는 잠들어 있을 수도 있으며 운영체제는 이들 중 물리적 스레드가 허용 가능한 만큼의 스레드를 할당하여 동시에 실행시킨다.
  • 결론
    • 보통 DB 서버의 경우에는 보통 CPU 개수 x 2를 추천한다.

    • 하지만 내 생각은 최적의 스레드 수라 고하면 아예 답이 없는 것 같다.

    • 그래도 *멀티스레드 사용 시 최적의 cpu, thread 개수가 궁금하다면?

    • CPU 몇 개인 시스템에서 특정 I/O 모델로 워커 스레드를 어떤 식으로 쓰고, 다른 구성 요소는 이상적이다 한다는 식으로 가정을 넣다 보면 "경험적으로 최적에 가까운" 워커 스레드 수나 네트워크 I/O 스레드 수 같은 게 나올지는 모르기 때문이다.

+ Recent posts