오늘은 프로세스와 스레드에 대해서 알아보겠습니다.
각각 무엇을 의미하는지 어떤 차이점을 가지고 있고 어떤 개념인지 살펴보겠습니다.
➡️ 프로세스는 현재 수행 중인 프로그램(Program in Execution)을 뜻합니다.
프로세스가 만들어 지면 시스템에서는 프로세스 제어 블록(PCB)의 형태로 존재하게 됩니다. (테이블 모양의 자료구조)
즉 프로세스가 만들어지면 이 프로세스의 정보를 표현하는 PCB가 생성되는 것입니다.
이 PCB에 대한 작업은 매우 빈번하게 이뤄지기 때문에 메모리에 저장을 시킵니다.
✅ PCB는 다음과 같은 정보를 저장하고 있습니다.
프로세스 번호(Process Indentification Number, PID) : 프로세스의 고유한 정수 번호, 다른 프로세스와의 구별을 위해 사용
프로세스의 상태 : 준비(Ready), 실행(Running), 대기(Blocked), 보류(Suspended) 등의 상태를 나타냄.
프로세스 우선순위 : 스케줄링 할 떄 사용되는 우선순위
프로그램 카운터 값(PC) : 다음 실행될 명령어의 주소 값
메모리 포인터 : 프로그램과 데이터가 저장되어 있는 메모리 블록 위치와 공유되는 메모리 블록들에 대한 포인터 포함
문맥 데이터 : 문맥교환 시에 CPU 레지스터 값들을 저장하는 영역
할당받은 자원들에 대한 목록 : 개방한 파일 등 할당 받은 자원들의 정보
계정 정보 : CPU를 사용한 시간 등의 정보
입출력 정보 : 진행 중인 입출력 요구 등의 정보
➡️ 프로세스가 생성되면 여러가지 상태 변화를 거치게 됩니다.
상태들은 다음과 같습니다.
여기서 준비, 실행, 대기 상태는 메모리에 올라와 있는 상태로서 활성 상태(Activation State)라고 합니다.
각 상태별로 살펴보도록 하겠습니다.
-> 사용자가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로세스가 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태입니다.
-> 여기서 운영체제는 메모리 공간이 충분하게 있으면 메모리를 프로세스에 할당해 준비상태로 바꾸어주고, 그렇지 않으면 보류 준비 상태로 만듭니다.
-> CPU를 할당받기 위해 기다리고 있는 상태입니다. 이때 CPU를 할당 받으면 실행 상태가 됩니다.
-> CPU 할당 순서를 정하는 것이 CPU 스케줄링이라고 합니다.
-> CPU를 할당받아 실행 중인 상태입니다. 여기서 CPU를 할당하는 것을 디스패치(Dispatch)라고 합니다.
-> 프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료되기를 기다리면서 대기하는 상태입니다.
-> 프로세스가 할당되었던 모든 자원들이 회수되고 PCB만 커널에 남아 있는 상태이빈다.
-> 프로세스가 메모리 공간을 뺏기고 디스크로 나가는 상태입니다. 메모리를 회수해도 문제되지 않을 프로세스를 보류 상태로 보내게 됩니다.
-> 이때 디스크로 나가는 것을 Swapped Out, 다시 메모리로 들어오는 것을 Swapped In 이라고 합니다. 이 두가지를 합쳐서 Swapping이라고 합니다.
-> 생성된 프로세스가 바로 메모리를 받지 못하거나 준비 또는 실행 상태에서 메모리를 잃게 되는 상태입니다.
-> 대기 상태일 때 메모리 공간을 잃은 상태입니다.
➡️ 스레드는 프로세스 내에서 실행되는 여러 흐름의 단위입니다. 프로세스는 할당된 자원의 소유자로서, 스레드는 스케줄링의 단위로서 존재하게 됩니다.
프로세스와 스레드는 아래 사진과 같은 관계를 가지고 있습니다.
➡️ 다중 스레딩은 하나의 프로세스를 다수의 스레드로 만들어 실행하는 것을 의미합니다.
다중 스레딩을 하게 되면 하나의 프로세스 내에 다수의 실행 단위들이 존재하여 작업의 수행에 필요한 자원들을 공유하기 때문에 자원의 생성과 관리가 중복되는 것을 줄일 수 있습니다.
‼️ 따라서 스레드의 장점은 성능 측면에서 확인할 수 있습니다.
=> 스레드를 만들고, 없애고, 이들 간의 스위칭에 소요되는 시간과 비용이 프로세스 단위로 이루어질 때 보다 빠르고 저렴합니다.
=> 또한 프로세스 간의 통신은 커널의 개입이 필요로 하지만, 한 프로세스 내의 스레드 간의 통신은 메모리와 파일을 공유하기 때문에 커널의 개입이 필요 없게 됩니다.
➡️ 앞서 말했듯이 멀티 스레딩에서 한 프로세스 내에서 존재하는 스레드들은 주소 공간과 자원을 공유합니다. 이는 즉 특정 스레드가 변경시킨 내용이 다른 스레드에 바로 영향을 미칠 수 있다는 것입니다.
➡️ 따라서 오류를 야기할 수 있는 상호 간의 간섭이나 데이터의 판괴 등을 방지하기 위해 스레드의 실행 동기화가 필요합니다.
오늘은 프로세스와 스레드에 대해서 살펴보았습니다. 🧐
다음 시간에는 프로세스의 자원을 어떻게 사용할 수 있도록 결정하는 CPU 스케줄링에 대해서 알아보겠습니다.
오늘도 잘 보고 가요~ 새해 복 많이 받으세요🙏🏻