ABOUT ME

Today
Yesterday
Total
  • [운영체제] Process 와 Thread
    운영체제 2021. 12. 3. 01:21

    프로세스(Process)

    • 프로세스는 프로그램이 CPU에서 처리될 수 있도록 메모리에 올라온 상태를 말한다.
    • 프로세스끼리는 독립적인 메모리 주소를 가지고 있으며 할당된 메모리는 Code, Data, Stack, Heap 영역으로 나뉜다. 각 영역별로 저장되는 것이 다르다.
    • Code : 실행할 프로그램의 코드가 저장되어 있는 영역이다. 코드 명령문들이 저장되어, 이 명령문을 하나씩 불러와서 실행한다.
    • Data : 프로그램의 전역변수와 정적변수가 저장되는 공간이다. 이 변수는 프로그램 실행 전에 선언되어서, 프로그램이 끝날 때까지 남아있는 변수이기 때문에, 크기도 많이 할당되지 않고, 변화가 크게 생기지 않는다.
    • Heap & Stack : 할당된 메모리에서 Code영역과 Data영역을 제외한 나머지 메모리를 모두 Heap과 Stack이 사용한다. 이 중 가장 낮은 주소에서부터 높은 주소로 올라가며 저장하는 것이 Heap이고, 높은 주소에서 낮은 주소로 내려가며 저장하는 것이 Stack이다.
      • Heap : 사용자가 직접 관리하는 메모리 영역으로 런타임에 크기가 결정된다. 즉 사용자가 코드를 어떻게 이용하냐에 따라서 동적으로 더 넓게 할당 받을 수 있으며, 사용이 끝나면 할당이 해제된다.
        변수를 전역적으로 액세스할 수 있으며, 상대적으로 액세스가 느리다.
        스택과는 다르게 메모리 크기에 제한이 없고, 대신 유저가 메모리를 직접 관리해줘야한다.
      • Stack : CPU가 직접 관리하는 메모리 영역으로 컴파일 타임에 크기가 결정된다. 즉 코드를 쭉 훑은 다음 크기가 정적으로 결정된다. 따라서 유저의 이용에 따라 런타임에 stack 크기를 초과하면 stack overflow가 발생하여 오류가 발생하게 된다.
        CPU가 관리하므로 액세스가 빠르며 수를 유저가 명시적으로 할당하거나 해제할 필요가 없고, 다만 이미 고정되었으므로 변수의 크기를 조정할 수 없다.

     

    또한 한개의 CPU에서 동시에 한개의 프로세스만 처리할 수 있는데, 우선 순위가 높은 프로세스가 들어와서 interrupt를 발생시킨다면 프로세스를 교체해주어야 하고, 이 때 Context Switch가 발생한다.

     

     

    Context Switch

    • 컴퓨터의 저장 공간 중 가장 연산속도가 빠른 것은 레지스터이다. 따라서 프로세스를 수행중일 때 register에 대부분의 정보가 저장되는데, 다른 프로세스로 교체될 때, 이 register에 해당 프로세스의 정보가 들어와야하므로 현재까지의 상태를 저장해주어야 한다. 이 때 프로세스 정보 저장 공간인 PCB(Process Control Block)이라는 곳에 상태를 저장한다. 그 후 새로 들어온 프로세스의 PCB에서 데이터를 불러와서 프로세스를 실행 시키는 것이 Context Switch이다. 
      • 게임에서 전사 캐릭터를 하다가 마법사 캐릭터를 들어가고싶으면 지금까지 한 전사 캐릭터를 저장하고 메인메뉴로 갔다가 마법사 캐릭터로 접속하는 것과 같은 이치
    • 레지스터 뿐만 아니라 Process State, Precess Counter 등이 함께 PCB에 저장된다.
    • 이전에 수행하던 Process의 정보를 저장하고, 수행할 Process의 정보를 불러와서 register에 할당하는 과정에서 CPU 사용률이 줄어드는데, 이 것을 오버헤드(overhead)가 발생했다고 하며, 오버헤드가 많이 발생할수록 CPU를 효율적으로 사용하지 못한 것이 되므로, 적게 발생하도록 하는 것이 좋다.

     

     

    쓰레드(Thread)

    • 프로세스 내부에 존재하는 프로세스의 실행 단위.
    • 프로세스는 최소 1개의 쓰레드로 이루어져 있으며 멸티쓰레딩이 보편화된 오늘날엔 프로세스는 여러개의 쓰레드로 나눠져 있는 것이 일반적이다. 이렇게 쓰레드가 여러개인 프로세스를 Multi-Thread Process라고 한다.
    • 한 프로세스 안의 쓰레드들은 Code, Data, Heap 영역까지는 공유한다. Stack 영역과 Register는 따로 사용한다.
    • 그러므로 Context Switch가 일어났을 때 Stack과 Register만 저장하면 된다.
    • 따라서 한 프로세스 내부의 쓰레드끼리 Context Switch가 일어난다면 프로세스 간의 Context Switch보단 오버헤드가 적다.

     

    마치며...

    • 프로세스는 프로그램이 메모리에 올라온 상태, 쓰레드는 프로세스의 실행 단위
    • 프로세스는 독립적인 Code, Data, Heap, Stack, Register를 가지고, 쓰레드는 같은 프로세스 내의 쓰레드끼리 Code, Data, Heap을 공유하고 Stack과 Register는 독립적으로 사용
    • Context Switching은 CPU가 하던 작업을 멈추고 다른 작업을 하기 위해 현재까지 진행상황을 PCB에 저장해서 미뤄놓고 다른 프로세스나 쓰레드를 실행할 준비를 하는 것으로, CPU 사용률을 낮춰서 오버헤드가 되는 것
    • 쓰레드는 프로세스에 비해 Context Switching으로 인한 오버헤드가 적다. 그 이유는 Code, Data, Heap을 공유해서 PCB에 복사할 필요가 없기 때문

    댓글

Designed by Tistory.