Process란?
프로세스란 컴퓨터에서 실행 중인 프로그램이며, 하드 디스크에 있는 프로그램이 메모리에 로드되면 프로세스가 된다. 프로세스는 CPU의 스케줄링 대상이 되는 작업과 거의 같은 의미로 쓰인다.(정확하게는 스레드 단위로 스케줄링 된다)
일반적으로 하드 디스크(HDD/SDD)에 있는 프로그램(.exe)을 실행하면 실행을 위해 메모리 할당이 이루어지고, 프로그램이 메모리에 로드되면 프로세스가 되는 인스턴스화가 일어나고, 이후 운영체제의 CPU 스케줄러에 따라 실행한다. 인스턴스화란 말이 어렵다면 간단하게 실행시키는 것이라고 이해하면 된다. 이해를 돕기 위해 예를 들면 게임(프로그램)을 다운로드하고 게임 실행파일을 더블클릭하여 실행시키면 프로세스가 되는 것이다. 또한 하나의 프로그램이 여러 프로세스가 될 수 있다.
프로세스는 스택(stack), 힙(heap), 데이터(data), 코드(code)로 나뉜다.
스택은 지연변수, 매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역이다. 힙은 동적으로 할당되는 변수들을 담는다. malloc(), free() 함수를 통해 관리할 수 있으며 동적으로 관리되는 자료구조의 경우 힙 영역을 사용한다. 스택과 힙 영역은 모두 동적 할당되는데 동적 할당이란 런타임 단계에서 메모리를 할당받는 것을 의미한다.
데이터 영역은 전역 변수 또는 정적 변수 등 프로그램이 사용하는 데이터를 저장하는 공간이며, 전역 변수가 변경될 수도 있어 Read-Write로 되어있다. 코드 영역은 사용자가 작성한 프로그램 함수들의 코드가 기계어로 변환되어 저장되는 공간이며, 중간에 코드를 바꾸지 못하게 Read-Only로 되어있다. 데이터와 코드 영역은 모두 정적 할당되는데 정적 할당이란 컴파일 단계에서 메모리를 할당하는 것을 말한다.
그동안 멈춘 프로그램의 강제 종료를 위해 사용하던 작업 관리자 창을 켜보면 (ctrl+alt+del 또는 ctrl+shift+esc) 실제로 "프로세스"라고 적혀있는걸 확인할 수 있다.
Thread란?
스레드는 프로세스 내 실행되는 여러 흐름의 단위이며, 프로세스는 최소 하나의 스레드를 가지고 있다. CPU 입장에서는 최소 작업 단위이다. 하지만 운영체제 관점에서는 프로세스가 최소 작업 단위이다.
스레드는 프로세스 내에서 각각 stack만 따로 할당받고 code, data, heap 영역은 공유한다.
참고로 프로세스가 여러개면 멀티 태스킹, 스레드가 여러개면 멀티 스레딩이라고 한다.
💡 OS 중 프로세스 기준으로 CPU 자원을 할당하는건 리눅스, 스레드 기준으로 할당하는건 윈도우이다.
프로세스와 컴파일 과정
프로그램에서 프로세스가 되는 과정에 대해 알아보자. 프로그램을 만드는 과정은 언어마다 다를수 있다.
≫ 전처리
컴파일하기 전에 컴파일할 영역을 명시하고 처리할 작업들을 준비하는 단계이다. 외부에 선언된 다양한 소스코드 라이브러리를 포함하고 프로그래밍의 편의를 위해 작성된 매크로로 변환하기도 한다. (주석 제거도 한다)
≫ 컴파일러
전처리가 완료되어도 여전히 소스코드인 상태이다. 전처리 완료된 소스코드를 어셈블리 언어(저급언어)로 변환하며 오류 처리, 코드 최적화 작업을 한다.
≫ 어셈블러
어셈블리어를 0과1로 이루어진 기계어로 변환하여 목적 코드(object code)를 포함하는 목적 파일이 된다.
≫ 링커
각기 다른 목적 코드를 하나로 묶어 실행 파일을 만드는 것을 링킹이라고 한다. 실행 파일의 확장자는 .exe(window) 또는 .out(Unix)이다.
프로세스의 상태
프로세스의 상태가 바뀌는걸 보통 상태가 전이된다고 말한다. 상태관리에는 Queue(선입선출 자료구조)가 사용된다.
- New(create) : 프로세스가 생성된 상태. 이때 PCB가 할당된다.
- Ready : 프로세스가 CPU에 할당되기를 기다리는 상태. 메모리 공간이 충분하면 메모리를 할당 받고 아니면 대기상태.
- Running : 프로세스가 CPU 소유권과 메모리를 할당받고 명령을 수행중인 상태
- Waiting : 지정한 프로세스가 다른 프로세스의 종료를 기다리는 상태. CPU를 할당해도 당장 명령을 수행할 수 없다.
- Terminated : 프로세스가 자발적으로 실행을 마치고 메모리와 CPU 소유권을 모두 놓고 가는 상태.
- Abort : 부모 프로세스가 자식 프로세스를 강제로 종료시키는 비자발적 종료 상태.
- Sleep : 자발적 휴식 상태. 프로세스를 정해준 시간만큼 잠시 멈추는 것이다.
- Suspended Ready : 메모리 부족으로 일시 중단된 상태.
- Suspended Blocked : 중단된 상태에서 프로세스가 실행되려했지만 메모리 부족으로 일시 중단된 상태
프로세스 생성(UNIX 예)
대부분의 시스템에서 프로세스는 동시에 실행될 수 있고, 동적으로 생성되거나 삭제될 수 있다. 프로세스는 PCB에 저장된 pid값을 통해 식별되고 관리된다.
1) fork()
: fork()는 부모 프로세스의 주소 공간을 그대로 복사하여 현재 프로세스와 pid만 다른 프로세스를 생성하는 것이다. 즉 같은 동작을 하는 프로세스가 두개 존재하게 되며 자식 프로세스는 부모 프로세스의 주소 공간의 복사본을 포함한다. 하지만 주소 공간만 복사할 뿐 부모 프로세스의 비동기 작업 등은 상속하지 않는다. *copy-on-write 기술을 사용한다.
copy-on-write
부모나 자식이 쓰기 작업을 하기 전 내용을 복사하는 것으로 프로세스 생성 시 모든 자원을 복사하는 것이 아니라 변경사항이 생길 경우에만 복사하는 기술.
2) exec()
: fork()처럼 새로운 프로세스를 위한 메모리를 할당하지 않고 exec()에 의해 호출된 프로세스만 메모리에 남게 된다. 즉 부모의 주소 공간을 전혀 다른 새로운 프로세스가 사용하는 것이다.
간단히 정리하면 fork()는 프로세스가 하나 더 생기는 것이고, exec()은 생성되는 프로세스 없이 exec()을 호출한 프로세스가 새로운 프로세스에 의해 덮여 쓰기 되는 것이다.
PCB란?
PCB(Process Control Block)는 운영체제가 각 프로세스를 관리하기 위해 프로세스별로 보유하고 있는 메타 데이터를 저장한 데이터다.
1. 운영체제가 관리상 사용하는 정보
- Process state
- Process ID (pid)
- Scheduling information : 프로세스의 중요도, 스케줄링 큐 포인터 등 스케줄링 파라미터 정보
- Priority : 프로세스의 우선순위
2. CPU 수행 관련 하드웨어 값
- Program counter : 해당 프로세스가 이어서 실행해야 할 명령의 주소를 가리키는 포인터
- Register : 프로세스가 인터럽트 이후 올바르게 작업을 이어가기 위해 참조하는 CPU 레지스터 값
3,4. 메모리, 파일 관련
- Code, Data, Stack의 위치 정보, base/limit 레지스터 값
- open file descriptors : 열린 파일 목록
Context Switch(문맥 교환)
프로세스가 실행되다가 인터럽트가 발생해 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다. 운영체제는 CPU를 내어주는 프로세스의 상태를 PCB에 저장하고 CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다. 즉, CPU 입장에서 Context는 PCB이기 때문에 PCB 정보가 바뀌는 것이 Context Switch다.
다만 시스템 콜이나 인터럽트가 발생한다고 반드시 Context Switch이 일어나진 않고 실제 프로세서가 넘어가야 Context Switch가 일어났다고 한다. 또한 현대 컴퓨터는 멀티 코어의 CPU를 가지기 때문에 보통 Context Switch을 설명할 때는 싱글코어를 기준으로 설명한다.
참고로 스레드에서도 Context Switch가 일어난다. 하지만 스레드는 스택 영역을 제외한 모든 메모리를 공유하기 때문에 프로세스 Context Switch보다 비용이 적고 시간도 적게 걸린다.
참고
https://www.youtube.com/watch?v=RzN18na94Wc
https://www.youtube.com/watch?v=a2GDsaReFEA
https://www.youtube.com/watch?v=2i3dInwVeUM
[OS] 프로세스 메모리 구조 (코드, 데이터, 스텍, 힙)
[운영체제(OS)] 3. 프로세스(Process)
프로세스와 스레드의 차이
면접을 위한 CS 전공지식 노트
'CS' 카테고리의 다른 글
[네트워크] 주소창에 'www.google.com'을 입력하면 어떤 일이 일어날까? (0) | 2023.07.01 |
---|