•
포그라운드 프로세스 : 사용자가 보는 공간에서 사용자와 상호작용하며 실행
•
백그라운드 프로세스 : 사용자가 보지 못하는 곳에서 실행
◦
데몬(daemon) : 별다른 상호작용 없이 주어진 작업만 수행하는 특별한 백그라운드 프로세스 → 윈도우에서는 서비스 라고 부름
프로세스 주소 공간
코드 영역과 데이터 영역은 프로그램 실행 도중 크기가 변하지 않기에, 컴파일 시점에 정적으로 할당되어 정적 할당 영역이라고 부른다.
반면, 크기가 변할 수 있는 힙 영역과 스택 영역은 런타임 시점에 동적으로 할당되어 동적 할당 영역이라고 부른다.
코드 영역
실행 가능한 명령어가 저장되는 공간으로, 텍스트 영역이다. CPU가 읽고 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있는 읽기 전용 공간이다.
데이터 영역
프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간. 정적 변수나 전역 변수가 대표적이다.
BSS 영역
데이터 영역에서 프로그램을 사용하는 동안 유지할 데이터 중 초깃값이 있는 데이터는 데이터 영역에 저장되고, 초깃값이 없는 데이터는 BSS 영역에 저장된다.
힙 영역
프로그램을 만드는 사용자가 직접 할당 가능한 저장 공간. 언젠가는 해당 공간을 반환해야 하며, 그렇지 않으면 할당한 공간이 메모리에 남아 메모리 누수 문제를 초래할 수 있다.
자바의 경우, 이런 문제를 해결하기 위해 자체적으로 가비지 컬렉션을 제공
스택 영역
데이터 영역에 담기는 값과는 달리 일시적으로 사용할 값들이 저장되는 공간
함수의 실행이 끝나면 사라지는 매개변수, 지역 변수, 함수 복귀 주소 등이 저장
스택 영역에는 스택 트레이스 형태의 함수 호출 정보가 저장될 수 있다. 스택 트레이스란, 특정 시점에 스택 영역에 저장된 함수 호출 정보를 말한다.
PCB
운영체제가 프로세스를 식별하려면 커널 영역 내의 정보가 필요하다. 이 정보가 바로 프로세스 제어 블록(PCB)이다.
•
프로세스 ID(PID)
•
레지스터 값
•
프로세스 상태
•
CPU 스케줄링 정보
•
메모리 관련 정보
•
파일 및 입출력장치 관련 정보
PCB들은 커널 내에 프로세스 테이블의 형태로 관리되는 경우가 많다. 프로세스 테이블은 실행 중인 PCB의 모음을 의미한다.
좀비 프로세스 : 프로세스가 비정상 종료되어 사용한 자원이 회수되었음에도, PCB가 남아 있는 경우
Context Switching
프로세스가 타이머 인터럽트나 다른 인터럽트에 의해 종료되면, 해당 프로세스는 프로그램 카운터를 포함 여러 레지스터 값, 메모리 정보, 파일, 입출력장치 등 중간 정보를 백업해야한다. 이렇게 백업해야할 정보를 문맥(context)이라고 한다.
이런식으로 OS가 기존 프로세스의 문맥을 PCB에 백업하고, PCB에서 문맥을 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환(context switching)이라고 한다.
프로세스 간 문맥 교환이 자주 발생하는 것은 좋은 것일까?
→ 많은 프로세스를 동시에 실행할 수 있어 좋다고 생각할 수 있지만, 캐시 미스의 발생 가능성이 높아져서, 메모리에서 실행할 프로세스의 내용을 가져오는 작업이 빈번해지고, 이게 오버헤드로 이어질 수 있다.
프로세스의 상태
•
생성 상태(new)
프로세스를 생성 중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태.
•
준비 상태(ready)
당장 CPU를 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니기 때문에 기다리는 상태. CPU를 할당받으면 실행 상태가 되며, 이렇게 실행 상태로 전환되는 것을 디스패치(dispatch)라고 한다.
•
실행 상태(running)
CPU를 할당받아 실행 중인 상태, 타이머 인터럽트 전까지 CPU를 사용할 수 있다. 중간에 I/O 인터럽트 등이 발생하면 대기 상태로 전환된다.
•
대기 상태(blocked)
인터럽트가 발생하거나, 바로 확보할 수 없는 자원을 요청하는 등 곧장 실행이 불가능한 조건에 놓이는 경우 대기 상태가 된다. 보통 I/O 인터럽트로 인해 대기로 전환된다.
•
종료 상태(terminated)
프로세스가 종료된 상태. OS는 PCB와 프로세스가 사용한 메모리를 정리한다.
멀티프로세스, 멀티스레드
멀티프로세스와 멀티스레드의 가장 큰 차이점은 자원의 공유 여부에 있다.
→ 멀티프로세스 환경에서는 한 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 없거나 적지만, 멀티스레드 환경에서는 한 스레드에 생긴 문제가 프로세스 전체의 문제가 될 수 있다.
스레드 조인
join은 스레드를 생성한 주체가 ‘생성/실행된 스레드가 종료될 때까지 대기’해야 함을 의미한다.
IPC
프로세스 간 통신은 공유 메모리와 메시지 전달 방식 2가지로 나뉜다.
공유 메모리
공유 메모리는 프로세스 간에 공유하는 메모리 영역을 토대로 데이터를 주고받는 통신 방식.
공유 메모리 기반 IPC의 가장 중요한 특징은 통신을 주고받는 각 프로세스가 마치 자신의 메모리 영역을 읽고 쓰는 것처럼 통신한다는 점이다. 다시 말해, 프로세스가 주고받는 데이터는 커널 영역을 거치지 않는 경우가 많다.
공유 메모리 기반 IPC는 각 프로세스가 각자의 메모리 영역을 읽고 쓰는 것 뿐이므로 메시지 전달 방식보다 통신 속도가 빠르다. but, 각각의 프로세스가 서로의 공유 메모리 영역을 동시에 읽고 쓸 경우, 데이터의 일관성이 훼손될 수 있다. 이를 레이스 컨디션이라고 한다.
메시지 전달
프로세스 간에 주고받을 데이터가 커널을 거쳐 송수신되는 통신 방식.
메시지 전달 기반 IPC는 메시지를 보내는 수단과 받는 수단이 명확히 구분되어 있다. 예시로, 메시지를 보내는 시스템 콜인 send() 와 메시지를 받는 시스템 콜인 recv() 가 정해져 있다.
메시지 전달 기반 IPC는 주고 받는 데이터가 커널을 통해 송수신되므로 공유 메모리 방식보다 통신 속도는 느리다. but, 커널의 도움을 적극적으로 받을 수 있으므로 레이스 컨디션, 동기화 등의 문제를 고려하는 일이 상대적으로 적다.
메시지 전달 IPC를 위한 대표적 수단 : 파이프, 시그널, 소켓, 원격 프로시저 호출(RPC) 등
프로세스는 시그널이 발생하면 하던 일을 잠시 중단하고, 시그널 핸들러를 실행한 뒤 실행을 재개한다.