티스토리 뷰

728x90
반응형

목차

     

    Multi Process

     

    멀티 프로세스란 말 그대로 두 개 이상의 프로세스가 동시에 실행되는 것을 말한다.

     

    이때 프로세스를 진행 중인 CPU는 하나일 수도, 여러 개일 수도 있으며

     

    이는 전에 알아본 동시성, 병렬성과 같은 차이를 만든다.

     

    다시 언급하자면 하나의 CPU는 한 번에 하나의 작업만을 수행할 수 있기 때문에,

     

    여러 개의 작업이 동시에 실행될 경우 짧은 시간 동안 번갈아가며 동시성을 구현한다(이를 시분할 환경이라 한다).

     

    반면 두 개 이상의 CPU가 멀티 프로세스를 진행할 경우 프로세스를 나눠 처리하며 병렬성을 구현한다.

     

    주로 작업 사이의 독립적인 운영과 안정성이 중시될 때 사용되며, 아래와 같은 장단점을 갖는다.

     

    • 장점

      • 각 프로세스가 완전히 독립적이기 때문에 안정적이다 ↔ 개별 프로세스의 문제가 다른 프로세스로 전파되지 않는다.
        ex) 하나의 크롬 탭에서 문제가 생겨도 나머지 탭은 안전하다.
      • 미리 동일하게 맞춰진 데이터를 가지고 동시에 작업하면 비용이 적게 든다.
    • 단점

      • 완전히 독립적인 메모리 영역을 가지고 있기 때문에 Context Switching 발생 시 오버헤드가 크다.
      • 마찬가지 이유로 멀티 스레드에 비해 많은 자원을 소모한다.
      • 프로세서 사이의 통신(Inter-Process Communication) 구현이 복잡하다.

     

    계속해서 위에 언급했듯이 멀티 프로세스 작업 과정에서는 Context Switching이라는 현상이 발행할 수 있으며

     

    이때 대기에 들어가는 프로세스의 Context(일종의 정보)는 메모리에 적재되는데,

     

    이 프로세스를 관리하는 프로세스를 OS라고 부른다.

     

    좀 더 구체적으로 말하면 Context는 커널 내의 PCB(Process Control Block)에 저장된다.

     

    모르는 단어가 더 쏟아지기 전에 하나씩 정리하고 가자.

     

    Kernel

     

    커널은 OS의 핵심이자 정체성을 결정하는 요소라고 정의할 수 있다.

     

    반대 방향에서 말하자면 OS를 커널 위에 여러 소프트웨어를 올린 것으로 정의하는 것도 가능하다.

     

    덜 추상적으로 말하자면 운영체제 같은 큰 프로그램을 메모리에 상주시키는 건 낭비이기 때문에

     

    컴퓨터 전원이 켜질 때 반드시 필요한 부분만 골라서 메모리에 올린 뒤, 나머지 프로세스를 필요할 때 불러 사용한다.

     

    이때 반드시 필요한, 메모리에 상주하는 영역이 바로 커널이며

     

    이런 관점에서 보면 커널을 OS의 OS, 혹은 좁은 의미의 OS라고 부르는 것도 가능해진다.

     

    더 구체적으로 커널이 수행하는 작업은 아래와 같다.

     

    • 보안 - 하드웨어와 프로세스의 보안을 책임짐
    • 물리적 자원 관리 - 하드웨어 자원을 필요한 프로세스에게 분배 및 회수
    • 추상화 자원 관리 - 물리적으로 하나인 하드웨어를 여러개처럼 보이도록 추상화 후 관리

      • CPU → Task/Process
      • Memory → Page/Segment
      • Disc → File
      • Network → Socket
    • 프로세스 관리 - 수명주기와 실행주기, 스케줄링(프로세스에 자원 할당) 및 동기화 담당
    • Interrupt Handler - 입력 등에 의해 발생하는 Interrupt 처리
    • 시스템 콜 - 커널 영역의 서비스를 사용자 모드가 접근 가능하게 함
    • 입출력 통신과 외부 장치에 대한 접근 관리

    추가로 보통 언급하는 유닉스, 리눅스, 윈도우NT 등이 이 커널의 종류이다.

     

    PCB(Process Control Block) / TCB(Thread Control Block)

     

    프로세스 제어 블록은 한 마디로 말하면 프로세스 제어에 필요한 정보를 저장하는 커널의 자료구조이다.

     

    여기서 프로세스 제어란 수명, 실행주기 및 스케줄링 등을 말하며,

     

    프로세스와 함께 고유 PCB가 생성되고 종료와 함께 사라지는 특성을 가졌기 때문에

     

    OS의 프로세스는 PCB와 동일한 것이라고 보는 것도 가능하다.

     

    계속해서 PCB에는 굉장히 많은 정보가 저장되어 있는데, 그중 몇 개만 뽑으면 아래와 같다.

     

     

     

    • PID - Process Id, 식별자
    • Pointer - 부모, 자식, 현재 프로세스의 주소, 할당된 자원에 대한 포인터 정보
    • Process State - 프로세스 현재 상태(생성, 준비, 실행, 대기 종료)
    • Program Counter - 다음에 실행될 명령어의 주소
    • Open Files - 프로세스를 위해 열려있는 파일 목록
    • Sockets - 프로세스를 위해 열린 소켓 정보
    • CPU Register - 할당받은 레지스터(연산을 위해 CPU에 내장된 메모리) 정보
    • Memory-management information - 할당된 자원에 대한 정보
    • Accounting information - 누적 연산시간 등
    • I/O status information - 입/출력 정보

     

     

    또한 OS는 PCB에 빠르게 접근하기 위해 PID를 PK로 하는 테이블을 만들어 프로세스를 관리한다.

     

    이어서 컴퓨터의 발전에 따라 프로세스 안에 스레드가 등장하게 되는데,

     

    PCB 하나로는 내부의 스레드에 대한 정보를 전부 담는 것이 당연하게도 불가능했다.

     

    이와 같은 상황에서 탄생한 것이 바로 스레드 제어 블록(TCB)이다.

     

    TCB는 당연하게도 스레드 별로 생성되고, PCB 내부에 있으며, 일부 자원을 공유하기 때문에 적은 정보만 저장된다.

     

     

     

    • State - 스레드의 상태. 프로그램 카운터 등
    • Priority - 우선순위, 누적 연산 시간 등
    • Pointer - 프로세스 내부에서 스레드의 스택을 가리키는 포인터, PCB를 가리키는 포인터 등

     

     

     

    그림에서 봤듯이 PCB를 가리키는 포인터를 가지고 있기 때문에 함께 그리면 아래와 같이 된다.

     

    끝으로 이 PCB/TCB의 개념이 중요한 이유는 위에 언급했듯이 Context Switching에서 Context를 저장하기 때문이다.

     

    Context Switching

     

    이전 글에서도 잠깐씩 언급되었던 Context와 Context Switching, 이참에 확실히 정리하고 가자.

     

    Context란 직역하면 문맥이라는 뜻으로, 여기서는 프로세스/스레드의 작업에 대한 최소한의 문맥(상태, 프로그램 카운터 등)

     

    이라고 할 수 있다. 더 직관적으로는 실행 중인 작업에 대한 데이터 셋이라고 할 수도 있겠다.

     

    이어서 Context Switching이란 프로세스/스레드 작업 중 Interrupt나 System call 등이 발행했을 때

     

    실행 중인 작업을 멈추고 해당 Context를 PCB/TCB에 저장한 뒤,

     

    실행할 작업의 Context를 PCB/TCB에서 읽어와 작업을 이어가는 것을 뜻한다.

     

    이때, Context Switching에 드는 시간과 메모리 등 자원을 오버헤드라고 부르며,

     

    데이터의 종류와 양, 누적 연산 시간등에 따라 그 크기가 정해져 그대로 시스템에 부담이 된다.

     

    특히 코어 안에서 프로세스 사이의 전환이 일어날 경우, 공유하는 자원이 없기 때문에

     

    캐시를 초기화하고 새로 만들어야 해 오버헤드가 크다.

     

    반면 스레드는 데이터와 힙 메모리를 공유하기 때문에 캐시 데이터를 완전히 무너뜨릴 필요가 없고

     

    전환 속도도 매우 빠르다.

     

    Multi Processor, Multi Core, Multi Programming, Multi Tasking

     

    • 멀티 프로세서 - 2개 이상의 독립적인 CPU가 하나의 메모리를 나눠 쓰는 형태
    • 멀티 코어 - 하나의 CPU 안에 독립적인 CPU 여러 개를 모은 것. 각각의 CPU를 코어라 부름
    • 멀티 프로그래밍 - 하나의 메모리에 여러 개의 프로세스를 올리는 것
    • 멀티 태스킹 - 멀티 프로그래밍 환경에서 시분할 환경을 조성해 작업하는 것

     

    Multi Thread

     

    지난 글에서 스레드란 아래와 같은 것을 지칭한다고 했었다.

     

    • 프로세스 내부에서 프로세스의 자원을 사용하는 실행의 최소 단위
    • 독립 실행을 위해 각자의 PC Register, 스택을 가지며 프로세스 내부의 힙 메모리, 데이터, 코드는 공유

    이때 멀티 스레드란, 하나의 프로세스 내부에 여러 개의 스레드가 존재하는 것을 말한다.

     

    멀티 프로세스가 하드웨어적 개념이었던 것과 달리 멀티 스레드는 스레드를 효율적으로 사용하기 위한 논리적 개념이며,

     

    단일 CPU, 단일 프로세서에서도 구현할 수 있다.

     

    장단점은 아래와 같다.

     

    • 장점

      • 작업의 효율성이 높으며 하나의 프로세서를 최대한 활용할 수 있다.
      • 특정 자원을 공유하기 때문에 스레드 생성 속도가 빠르고 자원의 소모가 상대적으로 적다.
      • 역시 같은 이유로 Context Switching시 비용이 적게 발생한다.
      • 마찬가지 이유로 스레드간 통신 방식이 상대적으로 간단하다.
    • 단점

      • 특정 프로세스 내부에서 하나의 스레드에 문제가 발생하면 영향이 전체로 전파된다.
      • 자원 공유로 인한 데이터 일관성 깨짐, 교착상태 등의 문제가 발생한다.
      • 이를 해결하기 위한 동기화의 구현이 까다롭고, 디버깅 시 문제의 발생지점을 특정하기 어렵다.

     

    Single Thread

     

    당연히 싱글 스레드는 하나의 프로세스 안에 하나의 스레드만 존재하는 것을 가리킨다.

     

    이 경우 하나의 프로세스는 하나의 작업만 순서대로 처리하며, 멀티 스레드와 달리 공유자원과 개별 자원의 구분이 필요 없다.

     

    장단점은 아래와 같다.

     

    • 장점

      • 구현이 쉽고 자원을 적게 소모한다.
      • Context Switching이 발생하지 않으며 자원 공유에 따르는 문제 역시 발생하지 않는다.
      • 위와 같은 이유로 단순 계산에 가까울수록 연산 속도가 오히려 빠르다.
    • 단점

      • 연산이 복잡하거나 종류가 많을 경우 시간이 오래 걸린다.
      • 프로세스 내의 동시성 구현이 불가능하다.
      • 스레드가 유일하기 때문에 문제 발생시 처리하지 못하면 멈춰버린다.
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/06   »
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30
    글 보관함