실행중인 프로그램을 프로세스라고 한다.
보조기억장치에 저장된 프로그램을 메모리에 적재되고 실행하는 순간 프로그램은 프로세스가 된다.사용자가 보는 앞에서 실행되는 프로세스는 포그라운드 프로세스라 하고, 사용자가 보지 못하는 뒤에서 실행되는 포르세스는 백그라운드 프로세스라고 한다. 백그라운드 프로세스중 사용자와 상호작용하지 않고 자기 할 일만 수행하는 프로세스를 유닉스에선 데몬이라하고, 윈도우에선 서비스라고 한다.
프로세스는 실행을 위해 cpu를 필요로 하지만 cpu자원은 한정되어 있다.
프로세스들은 차례대로 돌아가며 한정된 시간 만큼만 cpu를 이용하고, 끝났음을 아리는 인터럽트가 발생하면 자신의 차례를 양보한다. 이렇게 프로세스의 실행 순서를 관리하고, 프로세스에게 자원을 배분하기 위해 운영체제는 프로세스 제어 블록(PCB)를 이용한다.
PCB는 프로세스 생성 시에 커널영역에 만들어지고, 실행되면 폐기된다. 즉 프로세스마다 PCB가 생기는 것이다.
프로세스를 식별하기 위해 부여되는 고유한 번호, 똑같은 프로그램이라 하더라고 두 번 실행하면 두 개의 프로세스가 생성된다.
프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원하기 위해 레지스터 값들이 저장되어 있다.
프로세스가 현재 입출력장치를 사용하기 위해 기다리는 상태인지, cpu를 사용하기 위해 기다리는 상태인지, cpu를 이용하는 상태인지에 대한 정보
프로세스가 언제, 어떤 순서로 cpu를 할당받을지에 대한 정보
프로세스가 메모리의 어느 주소에 저장되어있는지에 대한 정보
어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보
하나의 프로세스에서 다른 프로세스로 실행순서가 넘어갈때, 바로 직전까지 실행되던 프로세스가 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 입출력 장치 등 중간정보를 PCB에 백업하고 새로운 프로세스에 대한 백업 정보를 PCB로부터 복구하여 실행하는 것을 context switching이라고 한다.
프로세스가 생성되면 커널영역에 PCB가 생성되고, 프로세스는 사용자 영역에 크게 코드영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.
프로그램을 구성하는 명령어들이 갑자기 바뀔 일이 없으니 코드 영역의 크기가 변할 리 없고, 데이터 영역에 저장될 내용을 프로그램이 실행되는 동안에만 유지 될 것이므로 크기가 고정된 영역이라 정적할당 영역이라고 한다.
실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다, 코드 영역은 cpu가 실행할 명령어가 담겨있기 때문에 쓰기가 금지되어 있다.
데이터 영역에는 프로그램이 실행되는 동안 유지할 전역변수 같은 데이터가 저장되는 공간이다.
힙과 스택은 그 크기가 변할 수 있기 때문에 동적할당 영역이라고 한다.
힙 영역은 프로그래머가 직접 할당할 수 있는 저장 공간이다. 힙 영역에 메모리 공간을 할당하고 반환하지 않으면 메모리 누수가 발생한다.
함수의 실행이 끝나면 사라지는 매개변수, 지역변수같은 일시적인 데이터를 저장하는 공간
프로세스에는 저마다의 상태가 있다. 이런 프로세스의 상태는 PCB에 기록된다. 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.
이제 막 메모리에 적재되어 PCB를 할당받고 cpu의 할당을 기다리는 상태
당장이라도 cpu를 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니기에 기다리고 있는 상태
cpu를 할당받아 실행 중인 상태
프로세스는 실행도중 입출력장치를 사용하는 경우가 있다. 입출력 작업은 cpu에 비해 처리 속도가 느리기에 입출력 작업을 요청한 프로세스는 입출력 장치가 입출력을 끝날떄까지 기다려야하는데 이렇게 기다리는 상태를 대기 상태라 한다.
프로세스가 종료된 상태이다. 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스는 실행 도중 system call을 통해 다른 프로세스를 생성할 수 있다.
프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 한다.자식 프로세스는 또다른 자식을 생성할 수 있다. 이렇게 운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리한다.
스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
하나의 프로세스는 한 번에 하나의 일만을 처리했다. 하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 한번에 여러 일을 동시에 처리할 수 있게 되었다.
스레드는 프로세스 내에서 각기 다른 스레드 id, 프로그램 카운터 값, 레지스터 값, 스택으로 구성 되기 때문에 각기 다른 코드를 실행할 수 있다. 이렇게 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스의 자원을 공유하며 실행된다.
여러 프로세스를 동시에 실행하는 것을 멀티 프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드 라고한다. 하나의 프로그램을 세 번 실행하는 것과 하나의 프로그램에 스레드를 세 개 만들어 실행하는 것은 뭐가 다를까?
여기에는 큰 차이가 있다. 프로세스 끼리는 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점이다. 프로세스를 세 번 실행한다면 동일 한 프로세스 두개가 메모리에 적재된다. 이건 메모리의 낭비를 초래한다. 이에 반해 스레드 들은 프로세스가 가지고 있는 자원을 공유하기 때문에 여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다. 또한 서로 협력과 통신에도 유리하다.