티스토리 뷰

Infra Structure/.system

Process와 Thread

가그린민트 2017. 9. 3. 14:58
프로세스는 운영체제로부터 자원을 할당받는 작업 단위를 말하며, 
쓰레드는 프로세스가 할당받아온 자원을 이용하는 실행단위이다. 

프로세스는 운영체제로부터 프로세스가 운영되기 위해 필요한 주소공간 / 메모리 등의 자원을 할당받고, 
쓰레드는 프로세스 내에서 프로세스가 받아온 자원을 공유하며 실행되는 흐름을 말한다.

지금 보면 명료한 정의인데, 처음 접했을 때는 직관적이지 않아 당혹스러웠다. 그래서 프로세스란 무엇인가?

(아래의 설명은 리눅스를 기반으로 설명하였습니다.)

프로세스는 실행중인 프로그램으로, 1개의 CPU는 1개의 프로세스만을 실행할 수 있다.

보통 우리가 HDD에 있는 프로그램을 실행하면, 명령어 등의 데이터가 메모리에 적재되고, 스케줄러에 의해 CPU에서 연산된다.

(이는 비용이 연산 및 I/O 속도에 비례하기 때문인데(CPU > memory > HDD), 평소에 ROM인 HDD에 저장해두고, 사용자가 실행시 RAM인 메모리에 적재하고, 이를 CPU의 L1/L2 캐시 및 레지스터로 읽은 후 연산한다.)

프로세스 상태 전이도






프로세스 상태 전이도를 통해 다시 살펴보면,

new : (HDD에 있는 프로그램을 실행하여) 프로세스가 실행되면, 

ready : CPU 대기 큐에 들어간다. (메모리에 적재됨)

running : CPU가 프로세스를 수행한 후, (보통 20ms 정도)

dispatch : 스케줄러는 ready상태에 있는 프로세스를 깨운다.

terminated : 프로세스가 종료되면 메모리 등의 자원을 반납한다.

만약, keyboard에 의한 I/O와 같이 매우 느린 연산을 동반하는 event가 발생시에 프로세스는 waiting 상태가 되고 입력이 완료되면 ready 상태로 돌아간다.


그런데, 프로세스는 어떻게 생성될까?

프로세스가 생기는 절차

1. fork()라는 시스템콜을 수행하면 새로운 프로세스가 생겨난다.

2. 새로운 자식 프로세스는 부모의 클론이다.

3. exec()라는 시스템콜이 프로세스를 원하는 모양으로 변신시킨다.

4. 실행된다.



1. 프로세스 그룹은 커널이 터미널 제어권을 관리하기 위한 목적으로 사용하는 프로세스들의 집합으로 쉘에서 실행된 프로세스와 그 자식 프로세스들이 하나의 프로세스 그룹으로 관리된다.


2. 터미널 제어권이란, 터미널로부터 입력되는 데이터와 터미널로부터 발생되는 시그널에 대한 제어권을 의미한다.


3. 커널이 프로세스 그룹을 식별하기 위한 식별자로 PGID를 부여하며, PGID는 별도로 부여하는 식별자가 아니고 해당 그룹의 리더 프로세스(쉘로부터 실행된 프로세스)의 PID를 PGID로 설정한다.


4. 터메널 제어권을 가지고 동작하는 모드를 Foreground mode라고 하고, 터미널에 대한 제어권 없이 동작하는 모드를 Background mode라고 한다. 

카피온라이트

프로세스가 fork에 의해 생성되면 부모와 자식은 서로 다른 메모리 공간에서 동작하게 되며 부모의 메모리를 그대로 복사하지만, 이는 매우 비용이 높은 처리이다. (윈도우의 createprocess는 부모 프로세스가 자식 프로세스를 생성한다.)


그래서 실제로 리눅스는 fork한 단계에서는 부모 자식에게 가상 메모리 공간은 각각 마련해주고, 각각의 가상 메모리 공간으로부터 동일한 물리 메모리 영역을 매핑한다. 

그러다가 부모 혹은 자식이 가상 메모리에 대해 쓰기를 수행하면(exec), 제각기 물리영역을 가지게 된다.

 즉, 쓰기 작업이 수행되지 않은 메모리 영역은 계속해서 공유되어 있을수 있으므로, 메모리상의 페이지 중복을 피하여 효율을 높일 수 있다.


그렇다면 가상메모리란 무엇인가?

가상메모리

리눅스 뿐만 아니라 멀티태스킹 OS의 중요한 기능으로 가상 메모리 구조가 있다.

ps aux 명령어로 프로세스 정보 확인 시 VSZ(virtual set size) 가 프로세스가 확보한 가상메모리 영역의 크기, RSS(resident set size)가 실제 물리 메모리 영역의 크기를 말한다.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root               1       0.0       0.1  19360  1344 ?           Ss     Aug29     0:01  /sbin/init

프로그램이 메모리를 사용할 때 물리적인 메모리를 직접 다루지 않고, 가상 메모리라는 소프트웨어적인 메모리를 다루는 구조(즉, HDD 등의 2차 기억장치를 메모리처럼 쓰는 것)이다. 하드웨어에서 제공하는 paging이라고 하는 가상 메모리 구조를 사용해 실현하였으며, OS가 이 가상 메모리 영역을 관리한다.


따라서,

1. 가상 메모리 구조를 사용할 경우 본래 물리 메모리 용량이상의 메모리를 다룰 수 있는 것처럼 프로세스에 꾸며 보일 수 있다.

(모든 프로세스들은 자신만의 주소공간을 가지므로 (32bit 주소체계에서 4GB), 가상메모리가 없을 경우 매우 큰 공간이 필요하다. 이에 실제 필요로 하는 부분만 메모리에 올리는 demand-paging 기법을 사용한다.)


2. 물리 메모리상에서는 뿔뿔히 흩어져 있는 영역을 연속된 하나의 메모리 영역으로 프로세스에게 보일 수 있고,

서로 다른 두 개의 프로세스가 참조하는 가상 메모리 영역을 동일한 물리 메모리 영역에 대응시켜 공유 메모리를 구현할 수 도 있다.


3. 물리 메모리가 부족한 경우는 장시간 사용되지 않은 영역의, 가상메모리와 물리메모리 영역 매핑을 해제한다. 해제된 데이터는 HDD 등에 저장해두고 다시 필요해지면 원래대로 되돌리는데 이를 Swap이라 한다. 따라서 Swap이 발생하고 있다는 것은 물리 메모리가 부족하다는 증거이므로, RSS의 크기가 큰 프로세스가 없는지 확인해야 한다.


다시 프로세스에 대해 이야기해보자.

프로세스 기본 조건

1. 모든 프로세스는 부모 프로세스를 가진다. 

    시스템 부팅을 담당하는 boot 프로세스(0번 프로세스)를 제외한 모든 프로세스는 부모 프로세스를 가진다.

    자식 프로세스가 살아있는 상태에서 부모 프로세스가 종료하게 되면, 자식 프로세스는 고아프로세스(Orphan Process)가 되며, 이 경우 대리모 프로세스(pid가 1인 init process)가 부모 역할을 수행한다.


2. 프로세스 종료시에는 자신의 종료 상태 정보를 부모프로세스에 반환해야 정상적으로 소멸할 수 있다.

    종료 상태정보란, 자신의 pid, exit code(종료시 반환하는 값), cpu time(cpu사용시간) 등의 정보를 말한다.

    프로세스 수행을 종료했지만 부모 프로세스가 종료상태 정보를 확인하지 않아서 커널이 관리 정보(PCB, FDT,...) 등을 가지고 있어, 소멸하지 않고 남아있는 상태의 프로세스를 좀비 프로세스라고 한다.  (시스템 가용성에 문제)

    # ps -l 을 통해 확인 가능
    S 필드 : 프로세스의 현재 상태
    R - 프로세스가 실행중이거나 CPU를 점유하기 위해 대기중인 상태
    S - 인터럽트 가능한 Sleep 상태
    D - 인터럽트가 불가능한 Sleep 상태
    T - 프로세스가 정지된 상태(Stopped)
    Z - 좀비 상태의 프로세스
    
    - 좀비프로세스 죽이기
    # ps -ef | grep defunct | awk '{print $3}' | xargs kill -9

    그런데, 커널이 관리하는 정보(PCB, FDT)란 무엇인가?

    PCB


    프로세스 관리 자료구조


    1. 프로세스가 생성되면 커널/운영체제는 개별 프로세스별로 관리정보를 담고 있는 프로세스 제어 블럭(PCB)를 생성한다. PCB에는 PID, Process State, Program Counter(다음에 실행할 명령어의 주소), Registers (메모리 및 I/O 주소 레지스터, 스택 포인터 등), list of open files(프로세스가 열고 있는 파일 목록)등이 담겨 있다.


    2. 프로세스가 생성되면 개별 프로세스별로 오픈한 파일을 관리하기 위한 파일 디스크립터 테이블(FDT)가 생성된다. 표준입력, 표준출력, 표준에러는 기본적으로 자동 오픈되며, 프로세스 내에서 오픈한 각각의 파일을 식별하기 위한 양의 정수값을 파일 디스크립터(fd)라고 한다. 


    3. 커널/운영체제가 시스템 내에서 여러 프로세스들에 의해 오픈된 파일들을 관리하기 위한 자료구조가 System open-file tables이다. open_mode(파일의 읽기/쓰기모드), offset(현재 파일 I/O를 수행하기 위한 위치값), reference_count(해당 파일의 참조 갯수를 의미하며, 파일 복제가 발생하게 되면, 이 값이 증가) 등이 있다.


    4. Active vnode table은 해당 파일의 i-node 정보를 가지고 일종의 캐시역할을 수행한다. 다양한 파일시스템의 i-node 정보를 관리하기 위해 vnode라는 참조체를 구성했다.

    Context Switch


    1. 한 프로세스에서 다른 프로세스로 작업이 변경(Context Switching)될 때, PCB(Program Counter, register 등)를 복원해 내야 한다.

        중단된 프로세스의 상태를 해당 프로세스의 PCB에 저장하고 실행될 프로세스의 상태를 PCB에서 복원하는 데 드는 비용인 (context switch) overhead가 CPU 입장에서는 큰 편이다. (그렇다고 한 프로세스가 점유하는 시간을 길게 설정하면 응답속도가 느려진다. 만약 1초면 각 요청별로 1초정도는 기다려야 한다. 보통은 20ms 정도라고 한다.)


    2. 리눅스 커널의 스케줄러는 프로세스를 상태별(CPU가 할당되기를 기다리거나, I/O가 완료되기를 기다리는 상태 등)로 나누어 관리하여 Task 실행 순서를 제어한다. 

        프로세스 디스크립터(PCB)에는 이 상태를 저장하는 영역이 있으며, 리눅스의 경우 double linked list 형태의 구조체로 구성되어 있다. 하나하나가 프로세스의 메타정보를 가지고 있으며, 현재 프로세스의 다음 프로세스는 current의 next를 보면 알 수 있다.


    3. 커널 내부적으로는 프로세스와 쓰레드가 거의 동일한 것으로 다뤄진다(둘다 Task 생성으로 본다). 쓰레드 하나에 대해 프로세스 디스크립터(PCB) 하나가 할당되며, 프로세스와 쓰레드는 완전히 동일한 로직으로 스케줄링 된다. 따라서 쓰레드를 커널 내부에서 경량 프로세스라고 하기도 한다.


    쓰레드


    쓰레드란, 프로세스 내에서 실행되는 시간의 흐름 단위로 프로세스는 최소 하나 이상의 쓰레드를 갖는다.

    (시간이 흐르면 Program Counter가 증가하므로, 논리적인 흐름은 Program Counter의 흐름이다.)


    하나의 프로그램에 동시에 병행해서 복수 개의 처리를 수행하고자 할 경우

    • 프로세스를 여러 개 생성해서 실행 컨텍스트를 여러 개 확보 (Multi-Process)
    • 쓰레드를 여러 개 생성해서 실행 컨택스트를 여러 개 확보 (Multi-Thread)

    두 방식의 결정적인 차이는, 전자가 메모리 공간을 개별적으로 갖는데 비해 후자는 메모리 공간을 공유한다는 점이다.


    따라서, 

    1. 메모리 사용 효율은 Multi-Thread가 더 높다. (다만, 실제로는 Multi-Process의 경우에도 카피온라이트로 인해 메모리 공간이 공유되므로 현저한 차이가 나는 것은 아니다)


    2. Multi-Thread의 경우 task 전환시에 메모리 공간의 전환이 발생하지 않는 만큼 전환비용(Context Switch Overhead)가 낮아진다. 메모리 공간을 전환하지 않게 되면 CPU 상의 메모리 캐시를 그대로 유지할 수 있는 등의 이점이 있어 성능상 현저한 차이가 난다.


    3. 프로그래밍 모델 관점에서 보면 Multi-Process는 기본적으로 프로세스 간 메모리를 직접 공유하지 않아, 메모리 공간이 독립해 있으므로 안전한 반면, Multi-Thread에서는 메모리 공간 전체를 복수의 쓰레드가 공유하므로 리소스 경합이 발생하지 않도록 주의해야 한다.


    멀티 쓰레드 (메모리 공간 동일)


    멀티 프로세스 (메모리 공간은 별도)




    참조 : 서버/인프라를 지탱하는 기술, 알기사









    댓글
    댓글쓰기 폼
    링크
    «   2020/04   »
          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    
    Total
    93,564
    Today
    44
    Yesterday
    168