ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CS] 가상메모리, 프로세스, 쓰레드, 멀티 프로세스, 멀티 쓰레드
    Computer Science/CS 2024. 3. 2. 20:43
    728x90

     

    가상메모리

    Virtual Memory

    메모리가 실제 메모리보다 많아 보이게 하는 기술로, 어떤 프로세스가 실행 될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에서 착안하여 고안되었다.

     

    ● 애플리케이션의 일부분만 메모리(기억장치)에 올려진다면, 메모리에 올라가지 않는 나머지는 어디에 위치할까?

      → 보조기억장치! 즉, 디스크!

    가상 메모리의 핵심은 보조기억장치이다.

    ● 애플리케이션이 실행될 때, 실행에 필요한 일부분만 메모리에 올라가며 애플리케이션의 나머지는 디스크에 남게 된다. 즉, 디스크가 RAM의 보조기억장치(backing store)처럼 작동하는 것임.

    ● 결국, 빠르고 작은 기억장치(RAM)을 크고 느린 기억장치(디스크)와 병합하여, 하나의 크고 빠른 기억장치(가상메모리)처럼 동작하게 하는 것이다.

    ● 가상 메모리를 구현하기 위해서는 컴퓨터가 특수 메모리 관리 하드웨어를 갖추고 있어야만 한다.

       MMU(Memory Management Unit)

       - MMU는 가상주소를 물리주소로 변환하고, 메모리를 보호하는 기능을 수행한다.

       - MMU를 사용하게 되면, CPU가 각 메모리에 접근하기 이전에 메모리 주소 번역 작업이 수행된다.

       - 그러나 메모리를 일일이 가상 주소에서 물리적 주소로 번역하게 되면 작업의 부하가 너무 높아지게 되어 MMU는 RAM을 여러 부분(페이지, pages)로 나누어 각 페이지를 하나의 독립된 항목으로 처리한다.

       - 페이지 및 주소 번역 정보를 기억하는 작업이 가상 메모리를 구현하는데 있어 결정적인 절차이다.

     

    프로세스, 쓰레드 

    ● 프로세스: 운영체제로부터 자원을 할당 받은 실행 중이 작업(실행중인 프로그램)

                        프로세스 단위로 CPU가 스케줄링한다. 

      쓰레드 : 프로세스가 할당 받은 자원을 이용하는 실행의 단위, 실질적으로 연산하는 주체(실행 중인 작업에서 일하는 일꾼)

     

    1. Process(작업)은 최소 1개의 Thread(연산)가 존재.

    2. 연산을 하기 위해서는 CPU + RAM(연습장)이 필요하다.

    3. 페이지 단위로 RAM을 잘라서 할당.

    4. 실제로 RAM을 직접 쓰지 않는다 → 가상 메모리로 만들어서 쓴다(유저모드에서 커널 안거치고 하드웨어로 바로 접근 못함. 메모리 직접 사용 못하기 때문)

    5. HDD(2차 메모리)로도 가상메모리로 사용할 수 있게 한다.

    6. OS는 가상메모리를 프로세스에게 할당.

    7. 프로세스에 속한 모든 쓰레드는 프로세스의 가상메모리로 공간이 제약된다.

     

    멀티 프로세스, 멀티 쓰레드

    멀티 쓰레드

    가상메모리 1개 할당 받아 N개의 스레드들이 공간을 공유하여 작업.

    하나의 프로세스에 여러 스레드로 자원을 공유하여 작업을 나누어 수행 멀티프로세스보다 적은 메모리 공간을 차지하고 문맥교환이 빠른 장점이 있지만, 동기화 문제, 하나의 스레드 장애로 전체 스레드가 종료될 위험이 있다.

     

    +동시성, +동기화

     

    ● TLS(Thread Local Storage) : 쓰레드마다 stack구조로 관리되는 메모리

      heap은 여러 쓰레드가 접근하여 사용하는 공용 공간이다.

     

    여러개의 쓰레드는 한 프로세스인 한 메모리 영역을 공유하여 작업한다.

    한 메모리 영역을 스레드들이 나눠서 작업을 한다.

    JVM 힙 메모리가 공유된다!

     

    장점

    한 메모리 영역을 스레드들이 나누어서 작업한다. 메모리 공간이 덜 사용된다.

    스레드 간의 작업량이 작아 문맥 교환이 빨라 시스템 처리량이 증가한다.

     

    단점

    메모리 공간을 공유하기 때문에 문맥 교환이 많이 발생한다. 

    스레드가 오류가 나면 프로그램 전체에 영향을 주게 된다.(프로그램이 종료될 수 있다)


     

    멀티 프로세스

    가상메모리 N개 할당 받게 되고, 그렇게 되면 Stack + Heap영역도 N개 만큼 잡힌다.

    두개 이상의 프로세서(CPU)가 하나 이상의 작업을 동시에 처리하는 것(병렬)

    하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만,멀티 스레드보다 많은 메모리 공간과 CPU를 차지하는 단점이 있다.

     

    여러 개의 프로세스는 여러 개의 메모리가 할당된다. 메모리가 많이 차지한다.

    메모리가 공유되지 않는다!

    스레드는 각 프로세스(메모리)영역에서만 작업한다. 

     

    장점

    다른 프로세스가 오류나도 메모리를 공유하지 않기 때문에 다른 프로세스에 영향을 주지 않는다.

    안정성 UP

     

    단점

    여러 개의 메모리가 할당되어 메모리가 많이 차지한다.

    각각의 독립된 메모리 영역을 가지고 있어, 작업량이 많을수록 오버헤드가 발생하고 문맥교환으로 인한 성능 저하를 유발한다.

     

    구현

    애플리케이션의 포트를 두 개(3333, 3334) 생성하면 터미널이 2개 생긴다. 프로세스가 2개 생성된다.


    두 개의 프로세스가 서로 메모리가 다른데 공유하고 싶다면?

    통신해야 한다. (메모리 공유 상태가 아니기 때문)

    - 소켓 통신

    - HTTP 통신 (REST API)

    - Message Queue (redis, Kafka)

    - IPC


    멀티쓰레드, 멀티프로세스 중 무엇이 더 빠른가?

    멀티쓰레드가 빠르다.

    쓰레드 사이 작업량이 작아 문맥교환이 빠르기 때문이다.

    멀티프로세스는 독립된 메모리 영역이기 때문에 작업량이 많을수록 문맥교환이 자주 일어나 오버헤드가 발생하여 성능저하가 발생할 수 있다.


    멀티쓰레드, 멀티프로세스 둘 중 무엇이 더 좋은가?

    운영체제 설계 철학이 다르다.

    ● 윈도우 : 쓰레드 위주

    ● 리눅스 : 프로세스 위주 정책 구사 → 도커가 적합한 이유가 되기도 함.

    멀티쓰레드, 멀티프로세스 둘 중 무엇이 더 좋은지는 정답이 없다.

    상황 및 일의 특성에 따라 달라진다.

    Context Switching

    문맥 교환

    CPU는 한번에 하나의 프로세스만 실행 가능하다.

    CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context Switching이라고 한다.

    동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.

    (프로세스 or 쓰레드 인듯!)

     

    1. CPU에서 수행할 Process, Thread 가 바뀔 때, 원래 있던 정보를 PCB, TCB에 갱신한다.

    2. 바꾸는 Process, Thread의 PCB, TCB의 정보를 가져와 해당 정보로 CPU를 세팅해주고 상태를 바꾼다.

    이것이 Switching한다는 것이다.

     

    한 프로세스 내의 쓰레드들은 힙, 데이터, 코드 영역을 공유하고, 스택영역과 레지스터 영역은 개별적으로 가진다.(스레드마다 할당)

    Thread Context Switching의 경우에는 CPU는 thread의 context → TCB만 변경하면 된다.

    Process Context Switching의 경우에는 CPU는 thread + process → PCB, TCB를 모두 변경해야 한다. 

    따라서 TCW의 경우가 오버헤드가 더 적다.

     

    PCB

    process control block

    중량 프로세스를 관리하는 자료구조.

    Process ID와 상태, 우선순위, 메모리 정보 등을 저장한다.

    멀티 프로세스 환경에서는 PCB가 PC(Program Counter), Register Set정보도 포함한다.

     

    운영체제의 스케줄러에 의해 문맥교환되는 프로세스 정보의 단위이다.

     

     

    TCB

    thread control block

    경량 프로세스를 관리하는 자료구조. 즉, 스레드를 관리하는 자료구조

    PC(Program Counter), Register Set(CPU정보), PCB를 가르키는 포인터 정보를 가지고 있다.

     

    스레드 라이브러리에 의해 문맥 교환되는 스레드 정보의 단위이다.

     

     

    MSA

    멀티 프로세스를 알면 MSA를 알 수 있다.

     

    스프링 애플리케이션을 8080하나 띄우고, 8081을 하나더 띄우자.

    서버마다 분리해 놓은 것이다. 서버마다 기능 단위로 분리하여 띄우는 것이다.

    분리된 서버들은 멀티 프로세스 상태다. (멀티 프로세스를 한 머신에 두지 않고 여러 대의 서버에서 실행)

    통신하려면 REST API 통신해야 한다.

    이것이 멀티 프로세스를 사용하는 MSA방식이다.

     

    서비스를 분리하면 한 서비스가 중단되어도 문제 서비스만 종료된다.

    그러면 다른 서비스로 장애가 전파되지 않는다.

     

    MSA는 결국 멀티프로세스이다.

     

     

    참고

    https://ahnanne.tistory.com/15

    https://eunajung01.tistory.com/55

     

     

     

    728x90

    'Computer Science > CS' 카테고리의 다른 글

    [CS] 해시 충돌, Chaining, Open Addressing  (0) 2024.03.20
    [CS] SDK, API  (0) 2024.03.03
    [CS] 컴퓨터 구성 요소  (0) 2024.02.29
    [CS] HTTP HTTP/2 HTTPS QUIC  (0) 2023.12.07
    [CS] REST API  (1) 2023.12.07

    댓글

© 2022. code-space ALL RIGHTS RESERVED.