이전 CPU의 명령어 처리 주기에 이어서 CPU가 기존 1 core에서 Multi-core로의 발전과 process 단위 실행에 대한 문제점을 개선하기 위해 나온 threading에 대해서 설명한다 

  • Process 
    • process는 하나의 코어에 하나만 동시에 작업될 수 있고 여러개의 process를 맡길 수 있는데 이때 동시에라는 말은 시간에 대한 개념으로 여러개의 process를 맡기더라도 정해진 스케쥴의 프로세스들을 시분할로 몇 ms씩 번갈아가면서 작업을 한다 
    • process에는 5가지 상태가 있다 -
      • create - 프로세스가 생성되는 중이다 
      • running - 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다 
      • ready - 프로세스가 CPU를 사용하고 있지는 않지만 언제든 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. ready상태의 프로세스들은 정해진 schedule에 따라 우선순위를 가지고 있고 우선순위가 높은 프로세스가 먼저 CPU를 할당받는다 
      • waiting(block) - 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태
      • terminated - 프로세스의 실행이 종료되었다 
    • 프로세스는 OS kernel에 설정된 Timeout에 따라 running, ready, waiting 상태를 계속 반복하게 된다
    • 이렇게 계속해서 프로세스를 중지시키고 다시 시작하고 할 때마다 계속해서 메모리의 특정 영역에 이전 프로세스의 정보를 저장하고 이번에 작업해야하는 프로세스의 정보를 읽어오는데 이러한 작업을 Context Switching 이라 한다 
    • Process context switching에 포함되는 정보는 다음과 같다
      • Process ID 
      • Process state 
      • program counter ( 이 프로세스가 다음에 실행할 명령어의 주소를 가지고있음)
      • registers
      • scheduling 정보 
      • memory 관리 정보 
      • process 계정 정보 
      • I/O state 정보 
    • 프로세스가 너무 자주 변경되면 context switching overhead가 커져 효율적이지 못하다 
    • 하지만 사용자는 더 많은 작업들을 동시에 실행시키고 싶어하고 이를 위해 사용하는 기술이 threading이다 
  • thread 
    •  어떤 프로세스내에서 실행되는 흐름의 단위를 말한다.
    • 일반적으로 하나의 프로그램은 하나의 스레드를 가지고 있지만 프로그램의 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다 
    • multi process의 경우 각 process는 독립적으로 실행되며 별개의 메모리를 차지하고 있는 것과 달리 multi thread는 프로세스 내부에서는 메모리를 공유해 사용할 수 있다. 또한 context switching overhead가 작아 프로세스간의 전환보다 스레드간의 전환속도가 더 빠르다 
    • 하지만 하나의 메모리를 둘이상의 흐름이 동시에 접근 할 수 있어 값을 읽고 쓸때 동시에 같은 메모리 주소에 접근하지 못하게 프로그래머의 계획이 필요로 하게 된다 
    • thread는 또 2가지로 나뉘는데 
      • User-Level Thread 
        • 커널 영역의 상위에서 지원되며 일반적으로 사용자 레별의 라이브러리를 통해 구현됨 
        • 프로세스내부의 하나의 스레드가 중단되면 다른 모든 스레드도 중단된다 . 커널이 프로세스 내부의 스레드를 인식하지 못하며 해당 프로세스를 대기상태로 전환하기 때문이다 
        • 일반적으로 프로그래밍을 할 때 사용되는 스레드가 사용자 레별 스레드와 비슷하게 실행된다 
      • Kernel-Level Thread
        • OS가 지원하는 스레드 기능으로 구현되고 커널이 스레드의 생성과 스케줄링을 관리한다 
        • 하나의 스레드가 중지되더라도 같은 프로세스 내부의 다른 스레드를 중단시키지 않는다

thread의 흐름 출처 : https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85), https://m.blog.naver.com/three_letter/220333796848
thread level

  • multi-threding
    • TMT ( Temporal Multi-Threading) - 일시적 멀티스레딩
      • 하나의 코어에서 여러개의 스레드를 시분할로 번갈아가면서 작동시킴 
    • SMT ( Simultaneous Multi-Threading) - 동시 멀티스레딩
      • 여러개의 스레드를 동시에 작동시킴 
      • 하드웨어 상에서 1개 이상의 명령어를 issue하고 dispatch 할 수 있다면 동시 멀티스레딩을 위해서는 각 스레드의 context를 저장할 추가적인 레지스터 정도의 하드웨어 모듈이 추가되면 구현이 가능하다 
      • 현재는 2-way, 4-way, 8-way SMT들이 있고  양방향(2-way) 동시 멀티스레딩을 주로 사용하는데 Intel에서 개발한 2-way SMT를 Hyper threading이라 한다 

*programing에서의 thread - 일반적인 프로그래밍에서 thread를 사용하면 여러개의 코어에 스레드를 적절하게 분배하지만 python의 경우 GIL(Global Interpreter Lock)로 인해 하나의 프로세스에서만 동작하게 되고 결국 하나의 프로세스에서 시분할로 여러개의 스레드가 작동되게 된다 그렇기에 완전한 병렬이라고 볼 수 없다.

 

  • Multi-processing 
    • Multi processing은 여러개의 프로세스들끼리 자원을 공유하며 동시에 작업을 진행하는 기술을 말한다 - multi threading의 경우 하나의 프로세스안에서 여러개의 스레드가 시분할로 작동된다면 multi processing은 다수의 프로세스들끼리 통신하여 한개 이상의 코어에서 동시에 프로세스에서 작업을 진행하는 것이다. 여기서 여러개의 코어로 말하지 않는 이유는 특정 코어에 고정적으로 프로그램을 동작시키지 않는다면 OS의 코어 할당 우선순위에 따라 같은 코어에 2개의 프로세스가  시분할로 작업될 수 있기 때문이다 
    • 하지만 process들간에는 메모리 공유가 되지 않고 각각의 독립된 공간에서 작업을 진행하기 때문에 같이 사용하는 데이터가 있을 경우 IPC(Inter Process Communication)을 사용하여 자원을 공유하여야 한다. 여기서 공유된 자원에 대하여 동시에 여러 프로세스들이 접근하는 것은 매우 위험하기에 권장되지 않는다 
    • IPC의 종류 
      • Pipe 방식 
        하나의 프로세스는 데이터를 쓰기만 하고 다른 하나는 데이터를 읽기만 한다 
        한쪽으로만 통신하기 때문에 Half-Duplex(반이중) 통신이라 부르기도 한다 
        만약 Full-Duplex(전이중) 통신을 원한다면 하나의 Pipe를 더 생성하여 Cycle을 만들면 된다 
        프로세스간에 PPID를 알고 있어야 정보의 전달이 가능하다 - 주로 자식, 부모 프로세스간 사용
      • Named Pipe (FIFO) 
        프로세스의 통신을 위해 이름이 있는 파일을 이용한다 
        위의 pipe와 다르게 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능하다 
        하지만 위와 마찬가지로 전이중 통신을 위해서는 두개의 FIFO파일이 필요로 하게 된다 
      • Message Queue 
        프로세스간에 공유하는 Queue를 생성한다 선입선출의 자료구조를 가지며 커널에서 관리한다 
        메모리공간에 위치하기 때문에 어느 프로세스에서던 데이터를 이용할 수 있다. 
      • Socket 
        네트워크를 이용하여 socket으로 데이터를 공유한다 
        127.0.0.1:50000 이런 IP:PORT로 접근 할 수 있기 때문에 물리적으로 다른 위치에 있는 하드웨어의 프로세스에서도 접근할 수 있다 
      • Shared memory 
        메모리의 일정공간(주소)를 공유한다 
        일반적으로 프로세스는 자신만의 메모리 공간을 가지고 있는데 kernel상에서 공유할 메모리공간을 따로 할당하여 프로세스에서 사용할 수 있게 한다 
        공유메모리 방식은 중간에 broker가 없기 때문에 IPC 방식들 중에 가장 빠르게 작동할 수 있다 
        공유메모리를 두개이상의 프로세스가 동시에 접근할 시 문제가 될 수 있기에 semaphore같은 관리장치를 이용하여 동시접근을 예방할 수 있다 
      • Memory map 
        Shared memory와 비슷하지만 열린 파일을 메모리에 올려 공유한다는 점이 다르다 
        파일은 시스템의 전역적인 자원이므로 서로다른 프로세스들 끼리 공유하는데 문제가 없다 

shared memory와 socket 방식
Pipe 방식

 

IPC Socket : https://github.com/dldidfh/distributed_process

 

GitHub - dldidfh/distributed_process

Contribute to dldidfh/distributed_process development by creating an account on GitHub.

github.com

공유 메모리 : https://github.com/dldidfh/tistory_code/tree/master/%EA%B3%B5%EC%9C%A0%EB%A9%94%EB%AA%A8%EB%A6%AC

'IT기초' 카테고리의 다른 글

(2) CPU Instruction Cycle  (0) 2022.11.09
(1) Linux 기초 - 리눅스란?  (0) 2021.11.22
[네트워크] 개발자용 네트워크 기초  (0) 2021.09.28

+ Recent posts