by 꽈배기
프로세스는 실행중인 프로그램을 나타낸다
프로세스는 CPU에 요청해 실행되는데 반해 CPU 자원은 한정되어 있다. 이를 위해 프로세스들은 한정된 시간 만큼만 CPU를 이용한다. 자신의 실행 차례에 정해진 시간만큼 CPU 자원을 이용하고 타이머 인터럽트가 발생하면 차례를 양보하게 된다.
이를 위해 사용하는 자료구조를 PCB (프로세스 제어 블록)이라 부른다. PCB는 프로세스 관련 정보를 저장하며 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기된다.
운영체제마다 상이하나 기본적인 내용은 비슷하다. 운영체제는 커널영역에 적재된 PCB의 정보를 보고 프로세스를 관리한다.
프로세스 실행 중 인터럽트에 의해 다른 프로세스로 실행 순서가 넘어가면 어떤 작업을 거쳐야 할까?
우선 기존에 실행되던 프로세스는 중간 정보를 백업해야한다.
기존의 실행중인 프로세스 정보를 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 일컫는다. 동시성을 보장하기 위한 환경에서 컨텍스트 스위칭을 통해 여러 프로세스가 끊임없이 번갈아가며 실행되도록 한다.
운영체제는 커널 영역에 적재된 PCB 정보를 바탕으로 프로세스를 관리한다. 그렇다면 사용자 영역에서는 프로세스가 어떻게 관리될까? 사용자 영역에서 프로세스는 메모리 영역을 구분하여 관리한다.
메모리 영역
코드와 데이터 영역은 프로그램 실행 시 크기가 고정되기에 정적 할당 공간이라 지칭한다.
프로그램 실행 중 동적으로 크기가 변할 수 있기에 동적 할당 공간이라 지칭한다.
둘의 크기는 가변적이므로 서로 간 증가하는 주소의 방향이 다르다.
윈도우 운영체제는 계층 구조를 가지고 있지 않으나, 대부분으 운영체제는 계층 구조로 프로세스를 관리한다.
부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 서로 다른 PID를 가진다.
부모 프로세스는 자식 프로세스를 어떻게 만들고 자식 프로세스는 어떻게 자신의 코드를 실행시킬까?
복제와 옷 갈아입기 부모 프로세스는 fork 시스탬 호출을 통해 자신의 복사본을 자식 프로세스로 생성 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
fork 시스템 호출
exec 시스템 호출
프로세스를 구성하는 실행 흐름의 단위 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
실행 흐름이 여러 개인 프로세스를 멀티 스레드 프로세스라 한다.
스레드 ID, 프로그램 카운터 등의 레지스터, 스택 스레드마다 실행에 필요한 최소한의 정보를 보유
프로세스를 이루는 스레드는 서로간의 자원을 공유 할 수 있다. 최근 사용되는 방식으로는 CPU에게 작업을 전달할때 전달되는 단위를 스레드 단위로 하기도 한다.
멀티 프로세스 : 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 실행
파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신이 있다.
해당 경우에 따라 스레드 할당수가 변할 수 있다.
CPU 바운드 같은 경우 CPU로부터 자원을 받는 경우가 많으며 CPU Burst (작업이 몰리는 경우)가 자주 발생하기에 스레드의 숫자를 코어와 동일하게 또는 +1 만큼 할당하는것이 context switching 을 고려하여 병목현상을 줄일 수 있다.
반대로 IO의 경우 CPU 바운드에 비해 많은 수의 스레드를 할당하여 사용할 수 있으나, 여건에 맞게 사용하여야 한다.
우선적으로 스레드가 사용될 환경을 봐야한다. 순차적으로 진행되는 프로그램의 경우 멀티스레드 환경이 큰 효과를 볼 수 없으며 코어의 성능을 넘는 스레드의 개수를 할당할 때 CPU 코어에 과도한 race condition이 발생하거나 context switching에 의해 병목이 발생할 수 있다. 또한 CPU bound인지 IO bound인지 고려하는것도 중요할 것이다. CPU burst가 자주 일어나는 CPU bound일 경우 스레드의 숫자를 과도하게 늘리는 것이 오히려 자원 사용성을 떨어뜨리는 결과를 불러올 수 있다.
tags: ComputerScience