ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 06. 프로세스와 스레드
    운영체제 2022. 8. 10. 02:37

     

     

    프로세스와 스레드는 싱글턴 패턴에서 다룬 바 있습니다.
    거기서는 개념만 대충 훑어보았기 때문에 더 자세하게 다뤄 보도록 하겠습니다.

     

    프로세스(Process)

     

    프로세스는 CPU가 현재 수행하고 있는 사용자 프로그램과 시스템 프로그램으로, 시스템의 작업 단위를 가리킵니다.

    ※ CPU는 다른 말로 프로세서라고 합니다.

     

     

    간단하게 말해 현재 실행되고 있는 프로그램을 말합니다.
    여러분들이 이 글을 보기 위해 켜 둔 브라우저도 프로세스에 해당합니다.

    정확하게는, 띄워 둔 브라우저 하나가 프로세스 하나에 해당합니다.

    프로세스가 2개 실행 중입니다.



    즉 응용 프로그램 자체가 프로세스를 뜻하는 것은 아닙니다.

     


    프로그램이 실행되면 프로그램의 코드

    프로세스 제어 블록(Process Control Block : PCB)이 메모리에 올라가게 됩니다.

     

     

     

     

    PCB는 프로세스 디스크립터라고도 하며, 프로그램의 상태 정보를 담은 자료구조 테이블입니다.

     

     

     

    프로세스 상태

    CPU는 한 번에 한 가지 일 밖에 하지 못합니다.

    하지만 우리가 동시에 여러 프로그램을 사용하면서도 위화감을 느끼지 못하는 이유는

    여러 프로세스가 순식간에 번갈아가며 처리되고 있기 때문입니다.

     

    이를 프로세스 스케줄링이라고 하며, 프로세스의 상태에 따라 프로세스가 자원을 할당받거나, 처리됩니다.

    프로세스 스케줄링은 Context Switching을 배울 때 자세히 알아보겠습니다.

     

     

    • new(생성) 상태 : 프로세스가 막 생성된 상태입니다.


    • ready(준비) 상태 : CPU를 할당받을 수 있는 상태로, CPU가 프로세스 자신을 처리해 주기를 기다리고 있는 상태입니다.
                                   먼저 ready 큐에 들어온 프로세스가 먼저 CPU를 할당받게 됩니다.


    • running(실행) 상태 : 프로세스가 CPU를 할당받은 상태입니다.



    • blocked(대기) 상태 : 프로세스를 처리할 수 없는 상태입니다.
                                       인터럽트나 다른 프로세스가 CPU를 선점할 때에 발생합니다.


    • terminated(완료) 상태 : 프로세스의 처리가 완전히 종료된 상태입니다.
                                            프로세스와 관련된 PCB도 시스템에서 전부 제거됩니다.

     

     

    여러 프로세스가 있으면 각 프로세스들은 준비 ~ 대기 상태를 반복하며 처리됩니다.

     

     

     


    프로세스의 구조

     

    프로세스가 생성될 때, 프로그램의 코드는 4가지 영역으로 분리되어 들어가게 됩니다.

     

     



     

    • Code(Text) 영역 : 프로그램의 전체 코드가 적재된 영역입니다.

    • Data 영역 :  전역 변수나 static 변수, 배열 등의 데이터가 있는 영역입니다.

    • Heap 영역 : 객체 등 동적으로 생성된 데이터가 있는 영역입니다.

    • Stack 영역 : 함수나 지역 변수 등 임시적인 데이터가 있는 영역입니다.

     

     

     


    멀티 프로세스

    프로세스는 독립적이기 때문에 자신이 가진 데이터를 공유할 수 없습니다.

    그 상태에서 프로그램에 에러가 발생한다면 어떻게 될까요?

    프로세스가 가지고 있던 데이터는 모조리 사라지게 됩니다.

     

    거기다 작업을 더 효율적으로 처리하기 위해, 멀티 프로세스라는 개념이 등장합니다.

     

     

    출처) https://devwhkang.gatsbyjs.io/posts/thread/

     

    멀티 프로세스여러 CPU가 여러 작업을 함께 수행하는 것입니다. 

     

    하나의 프로그램을 여러 프로세스로 나누어 담당하면 작업을 더 효율적으로 처리할 수 있습니다.

    하지만 프로세스는 데이터를 공유할 수 없다고 했었죠.

    그래서 별도의 공유 공간을 만들거나 특수한 통신 방법을 사용하는데, 

    이는 구현하기 어려울뿐더러 오버헤드가 발생하게 됩니다.

     

     

    이에 대한 방안으로 스레드가 사용됩니다.

     

     

     

     

    스레드(Thread)

    스레드는 프로그램 내에서 함수 단위로 실행되는 작업 단위입니다.

    스레드는 프로세스의 스택에 생성되어 스레드만의 별도 메모리 공간을 갖고,
    프로세스의 데이터, 코드, 힙을 공유하여 사용합니다.

    따라서, 스레드를 사용하면 데이터 변경과 참조에 좀 더 자유롭습니다.


    멀티 스레드

    스레드도 마찬가지로 멀티 스레드가 가능합니다.

    하나의 프로세스 내에서 여러 개의 스레드가 생성되어 작업을 분할하여 처리합니다.

     

     

     


    스레드의 자원 공유가 가능한 특성 때문에 멀티 프로세스 기법에 비해 오버헤드가 적고 효율적 입니다.

     

    하지만 멀티 스레드에는 치명적인 단점이 있습니다.

     

    • 한 개의 스레드에서 에러가 나게되면 전체 스레드(프로세스)가 종료됩니다. :
      > 스레드들은 데이터를 공유하여 사용하기 때문에 에러로 인한 데이터 오염을 막기 위해 
         프로세스 자체를 종료시켜야 합니다.

    • 동기화 문제가 일어날 수 있습니다.
      > A 스레드가 어떤 변수에 접근할 예정일 때, B 스레드가 변수의 값을 변경해버리면
         결과가 오염됩니다. 

     

     

    그럼에도 불구하고 오늘날 멀티 프로세스/스레드 환경 구축은 성능 향상을 위해 매우 필수적이기 때문에

    프로세스와 스레드에 대한 깊은 이해가 필요합니다.

    '운영체제' 카테고리의 다른 글

    08. 프로세스의 생성과 복사  (0) 2022.08.12
    07. PCB와 Context Switching  (0) 2022.08.10
    05. 컴퓨터 성능 향상 기술  (0) 2022.08.08
    04. 레지스터  (0) 2022.08.08
    03. 컴퓨터 구조  (0) 2022.08.08

    댓글

Designed by Tistory.