운영체제에서 프로세스는 하나의 작업 단위이다. 사용자가 마우스를 더블클릭하여 프로그램을 실행하면 그 프로그램은 프로세스가 된다.
폰 노이만 구조에서 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와서 작업이 진행된다는 의미이다. 프로그램은 저장장치에 저장되어 있는 정적인 상태, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태.
현대의 운영체제는 시분할 방식을 기본으로 사용한다. 따라서 프로세스가 여러 상태를 오가며 실행된다.
프로세스는 컴퓨터 시스템의 작업단위로 태스크(task) 라고 부른다.
우선 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다. 동시에 프로세스 제어 블록(PCB)를 만든다. 프로세스 제어 블록에는 프로세스를 처리하는 데 필요한 다양한 정보가 들어 있다. 프로세스 제어 블록이 없으면 프로그램이 전환되지 못한다.
하나의 프로세스를 실행하려면 프로세스 구분자, 메모리 관련 정보, 프로그램 카운터와 각종 레지스터 같은 중간값을 관리해야 하며, 이러한 정보를 보관하는 데이터 구조가 데이터 블록이다.
프로그램이 프로세스가 된다는 것은 운영체제로 부터 프로세스 제어 블록을 얻는다는 뜻이고, 프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻이다.
프로세스 = 프로그램 + 프로세스 제어 블록 프로그램 = 프로세스 - 프로세스 제어 블록
일괄 작업 시스템의 프로세스 상태는 생성, 실행, 완료이다. 시분할 시스템에서의 프로세스 상태는 일괄 작업 시스템보다 복잡하다. CPU를 얻어 실행중인 프로세스가 중간에 다른 프로세스에 CPU를 넘겨주는 일이 빈번하기 때문이다.
프로세스의 네가지 상태
준비 상태에 있는 여러 프로세스 중 다음에 실행할 프로세스를 선정하는 일은 CPU 스케줄러가 담당한다. 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업을 디스패치라고 한다. CPU 스케줄러는 프로세스의 전 상태, 즉 생성, 준비, 실행, 완료에 관하여 모든 프로세스의 작업이 원만하게 이루어 지도록 관리한다.
프로세스의 다섯가지 상태
입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태를 대기 상태라고 한다. 이는 작업 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행 상태로 두지 않고 대기 상태로 옮기는 것.
대기 상태의 프로세스는 요청한 입출력이 완료되면 입출력 관리자로부터 인터럽트를 받는다. 대기 상태에서 입출력이 끝는 프로세스는 실행 상태로 가지 않고 준비 상태로 돌아가 자기 차례를 기다린다.
프로세스 제어 블록은 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조로 TCP라고도 한다.
문맥 교환의 의미
문맥 교환은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다. 이때 두 프로세스 제어 블록의 내용이 변경된다. 이와 같이 두 프로세스 제어 블록을 교환하는 작업이 문맥 교환이다.
문맥 교환의 절차
프로세스는 코드 영역, 데이터 영역, 스택 영역으로 구성된다.
fork() 시스템 호출의 개념
fork() 시스템 호출은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 커널에서 제공하는 이함 수는 프로세스를 복사하는 일종의 시스템 호출이다. 프로세스를 복사할 때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 되며, 두 프로세스는 부모-자식 관계로 연결된다.
fork() 시스템 호출의 동작 과정
fork() 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다.
fork() 시스템 호출의 장점
exec() 시스템 호출의 개념
기존의 프로세스를 새로운 프로세스로 전환하는 함수이다.
fork() : 새로운 프로세스를 복사하는 시스템 호출
exec() : 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출이다.
exec() 시스템 호출을 사용하는 목적은 프로세스의 구조체를 재활용하기 위함이다.
exec() 시스템 호출의 동작 과정
exec() 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다. 또한 데이터 영역이 새로운 변수로 채워지고 스택영역이 리셋된다. exec() 시스템 호출은 기존의 프로세스 구조를 그대로 둔 채 내용만 바꾸어 새로 실행하는 것이다.
스레드의 정의
프로세스는 요리 작업 전체와 같고, 스레드는 요리를 완성하기 위해 수행하는 각각의 조리에 해당하는 것이다. CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다. 그러므로 CPU가 처리하는 작업의 단위는 프로세스로 부터 전달받은 스레드이다. 운영체제의 입장에서 작업 단위는 프로세스이고 CPU 입장에서의 작업단위는 스레드이다.
프로세스와 스레드의 차이
프로세스끼리는 약하게 연결되어 있는 반면 스레드끼리는 강하게 연결되어 있다.
스레드 관련 용어
멀티스레드의 구조
비슷한 일을 하는 2개의 프로세를 만드는 대신 코드, 데이터 등을 공유하면서 여러개의 일을 하나의 프로세스 내에서 하는 것이다. 정적인 영역은 프로세스가 실행되는 동안 바뀌지 않는 영역이고, 동적인 영역은 스레드가 작업을 하면서 값이 바뀌거나 새로 만들어지거나 사라지는 영역이다.
멀티스레드의 장점
프로세스 내 공유가 가능한 부분을 제외하고 실행과 관련된 부분을 스레드로 나누어 관리하면 자원의 중복 사용을 피함으로써 낭비를 막을 수 있다. 또한 하나의 프로세스에서 여러 스레드를 사용하면 작업의 효율을 높일 수 있다.
멀티스레드의 단점
멀티스레드의 경우 모든 스레드가 자원을 공유하기 때문에 한 스레드가 문제가 생기면 전체 프로세스에 영향을 미친다. 반면 프로세스를 여러개 만드는 방식의 경우 각 프로세스가 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스로 전달 되지 않는다.