프로세스(process)란,
현재 실행 중인 프로그램(program in executing)을 뜻한다. 일반적으로 잡(job)이라는 용어와 혼용해 사용하기도 한다.
프로세스의 주소 영역은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack)영역으로 구분된다.
코드 영역은 실행할 프로그램 코드가 저장되는 부분이다.
데이터 영역은 전역 변수(global variable)나 static 변수 등 프로그램이 사용하는 데이터가 저장되는 부분이다.
힙 영역은 동적 메모리 할당을 위한 부분이다.
스택 영역은 지역변수(local variable)나 함수의 매개변수(parameter) 등이 저장되는 부분이다.
*이미지 출처: https://slideplayer.com/slide/7981189/
프로세스의 상태는 실행(running), 준비(ready), 봉쇄(blocked, wait, sleep)로 구분할 수 있다.
실행 상태는 프로세스가 CPU를 보유하고, 기계어 명령을 실행하고 있는 상태를 가리킨다.
준비 상태는 프로세스가 CPU만 보유하면 당장 명령을 실행할 수 있지만 CPU를 할당받지 못해 기다리고 있는 상태를 가리킨다.
봉쇄 상태는 CPU를 할당받더라도 당장 명령을 실행할 수 없는 프로세스의 상태를 말한다.
ex.) 프로세스가 요청한 입출력 작업이 진행 중인 경우
*이미지 출처: https://eunhyejung.github.io/os/2018/07/08/operatingsystem-study06.html
💡 CPU:
Central Processing Unit; 컴퓨터의 심장💛 같은 존재; 프로그램의 기계어 명령을 실제로 수행하는 컴퓨터 내의 중앙처리장치이다.+ PLUS:
이 밖에도 프로세스가 생성 중이거나 종료 중인 일시적 상태를 각각 시작(new)상태, 완료(terminated)상태라고 부르기도 한다.
시작 상태는 프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태를 말한다.
완료 상태는 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태를 말한다.
운영체제는 준비 상태에 있는 프로세스들을 줄 세우기 위해 준비 큐(ready queue)를 두고 준비 큐의 제일 앞에 줄 서 있는 프로세스에 제일 먼저 CPU를 할당한다.
준비 큐에 프로세스를 줄 세우는 방법은 CPU 스케줄링 방법에 따라 달라진다.
쓰레드(Thread)란,
하나의 프로세스 내에서도 여러가지 작업들이 병렬적으로 실행될 수 있도록 작업을 나눈 실행단위이다.
B라는 작업과 C라는 작업이 A라는 하나의 프로세스 안에서 동시에 실행된다고 가정했을 때(혹은 눈치채지 못할만큼 빠른 속도로 번갈아가며 실행된다고 가정했을 때), 하나의 주소 영역을 공유하는 것보다 각각의 작업이 자신만의 주소영역을 갖게하면(특히 Stack을!!) 꼬임을 방지할 수 있고, 관리하기가 훨씬 쉬워진다.
프로세스는 각자 자신만의 독립적인 주소 공간을 가지고 수행 되며, 프로세스가 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않는다.
다른 프로세스와 정보를 주고받을 수 있는 방법이 없기 때문에, 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미칠 수 없다.
이러한 이유로 자식 프로세스는 부모 프로세스의 주소 영역에 접근할 수 없지만(사실상 부모 프로세스와 자식 프로세스는 자원을 서로 획득하기 위해 경쟁적인 관계에 놓이게 된다), 각각의 쓰레드는 자신이 속한 프로세스와 타 쓰레드의 주소 영역(스택을 제외한 나머지 - 코드,데이터, 힙 영역)에 접근/공유하는 것이 가능하기 때문이다.
*이미지 출처: https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
위 설명 때문에 부모-자식 프로세스를 만드는 것보다 쓰레드를 여러 개 만들어서 필요한 메모리 공간을 공유하게 하는 것이 더 좋다고 생각될 수 있다.
하지만 실제로는 쓰레드를 여러 개 생성해서만 가능한 작업이 있고, 쓰레드 여러 개로도 가능한 작업이 있기 때문에 둘은 담당하는 영역이 다르다라고 생각하는 것이 맞다.
문맥교환(Context Switch)이란,
하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU의 제어권이 이양되는 과정을 뜻한다.
문맥교환에 소요되는 시간은 시스템 입장에서 볼 때 일종의 오버헤드(overhead)라고 할 수 있다. 왜냐하면 문맥교환 중에 일어나는 작업이 실제 시스템에게 유용한 작업이 아니기 때문이다.
💡 오버헤드(overhead):
특정한 기능을 수행하기 위해 추가로 사용되는 컴퓨터 자원을 치칭하는 것이다.
CPU 할당시간을 아주 작게 세팅해 프로세스 간 문맥교환이 빈번하게 발생하도록 하면 이에 드는 오버헤드가 상당히 커진다.
또 그 반대로 CPU 할당시간을 너무 크게 설정하면 시분할 시스템의 의미가 퇴색하게 되므로 적절한 CPU할당시간을 정하는 것이 중요하다.
*본 포스팅은 아래 서적/사이트들을 참고 및 인용하여 작성되었습니다.
학습단계로 잘못된 정보가 있을 수 있습니다. 잘못된 부분에 대해 알려주시면 곧바로 정정하도록 하겠습니다 😊
terms.co.kr
프로세스 vs. 쓰레드(1): https://www.youtube.com/watch?v=PXN8gpZ5OEg
프로세스 vs. 쓰레드(2): https://www.youtube.com/watch?v=ELl_DYmQpsc
반효경, 『운영체제와 정보기술의 원리』, 이화여자대학교출판문화원(2020)