💡 프로그램은 저장장치에 저장되어 있는 정적인 상태를 의미하고, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태를 의미한다.
표현차이: 프로그램을 "작성한다", 프로세스를 "실행한다"
프로그램이 프로세스가 되기 위해서 프로세스 제어 블록(Process Control Block)이 필요하다.
프로세스 제어 블록에 담긴 정보
1) 프로세스 구분자: 프로세스를 구분하는 구분자
2) 메모리 관련 정보: 프로세스의 메모리 위치 정보
3) 각종 중간값: 프로세스가 사용했던 중간값, 이전에 실행할 때 사용했던 레지스터의 값
(ex.어떤 단품 요리까지 손님에게 제공되었는지 주문서에 표시하는 것과 유사)
어떤 프로그램이 프로세스가 되었다는 것은 운영체제로부터 프로세스 제어 블록을 받았다는 의미이다.
프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 한다.
프로그래머가 작성한 프로그램은 코드영역에 탑재된다.
운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다.
ex. 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아 올 위치를 스택영역에 저장한다.
스택영역은 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이기 때문에 사용자에게는 보이지 않는다.
개념: 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
목적: 빠른 자식 프로세스 실행
프로세스를 복사할 때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 된다. 두 프로세스는 부모-자식 관계로 연결된다.
프로세스 구분자(PID)가 바뀐다. 주민번호의 개념과 같다.
부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)가 바뀐다. 그림에서 fork()된 자식 프로세스에서 PPID는 부모 프로세스의 PID인 326이고, CPID는 -1이다.
기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속할 수 있다. 즉, 추가 작업 없이 자원을 상속할 수 있다.
부모 프로세스와 자식 프로세스가 자식 프로세스 구분자(CPID)와 부모 프로세스 구분자(PPID)로 연결되어 있다. 따라서 자식 프로세스를 종료하면 프로세스가 사용하던 메모리 영역, 파일, 하드웨어를 부모 프로세스가 정리 할 수 있다.
개념: 기존의 프로세스를 새로운 프로세스로 전환하는 함수이다. 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출이고, 호출시 현재의 프로세스가 완전히 다른 프로세스로 전환된다.
목적: 프로세스의 구조체를 재활용하기 위함이다.
코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꾼다.
데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋된다.
각종 프로세스 구분자(PID,PPID,CPID)를 제외하고 프로세스의 내용을 새로운 것으로 바꾼다.
이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 활용할 수 있어서 편리하다.
새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월하다.
💡 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위이다.
- CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 쓰레드이다. 운영체제 입장에서의 작업 단위는 프로세스이고 CPU입장에서의 작업 단위는 쓰레드인 것이다.
CPU를 여러 개 사용하여 여러 개의 쓰레드를 동시에 처리하는 작업 환경을 말한다.멀티프로세싱은 하나의 컴퓨터에 여러 개의 CPU 혹은 CPU 내 여러 개의 코어에 쓰레드를 배정하여 동시에 작동하는 것이다.
네트워크로 연결된 여러 컴퓨터에 쓰레드를 나누어 협업하는 분산 시스템도 멀티프로세싱이라고 한다.
fork() 호출로 여러개의 프로세스를 만들면 필요 없는 정적 영역이 여러 개가 된다.
하나의 프로세스 내에 여러 개의 쓰레드를 생성하는 멀티쓰레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.
응답성 향상: 사용자의 작업 요구에 빨리 응답 가능하다.
자원 공유: 한 프로세스 내에서 독립적인 쓰레드를 생성하면 프로세스가 가진 자원을 모든 쓰레드가 공유하게 되어 작업을 원활하게 진행할 수 있다.
효율성 향상: 여러 개의 프로세스를 생성하는 것과 달리 불필요한 자원의 중복을 막음으로써 작업을 원활하게 진행할 수 있다.
다중 CPU 지원: 2개 이상의 CPU를 가진 컴퓨터에서 멀티쓰레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.
프로세스는 코드 영역, 데이터 영역, 스택 영역 그리고 힙 영역을 가지고 있다.
코드 영역과 데이터 영역은 프로세스가 실행되기 직전에 위치와 크기가 결정되고 실행되는 동안 변하지 않으므로 정적 할당 영역이라고 부른다.
스택 영영과 힙 영역은 프로세스가 실행되는 동안 만들어지는 영역으로 크키가 늘어났다 줄어들기도 하는 동적 할당 영역이다.