- 프로세스 : 컴퓨터에서 실행되고 있는 프로그램
- 스레드 : 프로세스 내 작업의 흐름
1. 프로세스와 컴파일 과정

전처리
- 소스 코드의 주석을 제거하고
#include
등 헤더 파일을 병합하여 매크로를 치환
컴파일러
- 오류처리, 코드 최적화 작업을 하며 어셈블리어로 변환
어셈블러
링커
- 프로그램 내의 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합해 실행파일을 만듦
정적 라이브러리
- 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
- 외부 의존도가 낮으며 메모리 효율성이 떨어짐
동적 라이브러리
- 프로그램 실행시 필요할 때만 DLL 이라는 함수 정보를 통해 참조하는 방식
- 외부 의존도가 높으나, 메모리 효율성이 높음
2. 프로세스의 상태
생성 상태 (CREATE)
- 프로세스가 생성된 상태 fork() 또는 exec() 함수
- PCB 가 할당됨
fork()
- 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수
- 주소 공간만 복사할 뿐, 부모 프로세스의 비동기 작업 등을 상속하지는 않음
exec()
대기상태 (READY)
- 메모리 공간이 충분하면 메모리를 할당받고, 아니면 아닌 상태로 대기
- CPU 스케줄러로부터 CPU 소유권이 넘어오길 기다림
대기 중단 상태 (READY SUSPENDED)
실행 상태 (RUNNING)
- CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태
- CPU burst
중단 상태 (BLOCKED)
- 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- I/O 디바이스에 의한 인터럽트
일시 중단 상태 (BLOCKED SUSPENDED)
- 중단된 상태에서 프로세스가 실행되려 했으나, 메모리 부족으로 일시 중단된 상태
종료 상태 (TERMINATED)
- 메모리와 CPU 소유권을 모두 놓고 가는 상태
3. 프로세스의 메모리 구조

스택
- 지역변수, 매개변수, 함수 저장
- 컴파일 시 크기 결정됨
- 동적으로 크기가 늘어날 수 있음
힙
- 동적 할당 시 사용됨
- 런타임 시 크기 결정됨
- 벡터 같은 동적 배열은 힙에 동적 할당
데이터 영역
- 전역변수, 정적변수 저장
- BSS 영역 : 초기화가 되지 않은 변수가 0으로 초기화되어 저장
- Data 영역 : 0이 아닌 다른 값으로 할당된 변수들이 저장
코드 영역
- 소스 코드가 저장
- 수정 불가능한 기계어로 저장되어 있음
4. PCB (Process Control Block)
- 운영체제에서 프로세스에 대한 메타데이터를 저장한
데이터
- 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리됨
PCB 의 구조
- 프로세스 스케줄링 상태 : '준비', '일시중단' 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
- 프로세스 ID : PID, 해당 프로세스의 자식 프로세스 ID
- 프로세스 권한 : 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
- 프로그램 카운터 : 프로세스에서 실행해야할 다음 명령어의 주소에 대한 포인터
- CPU 레지스터 : 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
- CPU 스케줄링 정보 : CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
- 계정 정보 : 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- I/O 상태 정보 : 프로세스에 할당된 I/O 디바이스 목록
컨텍스트 스위칭

캐시미스
- 컨텍스트 스위칭 발생 시 캐시클리어 과정 겪게됨
- 이로 인한 캐시 미스 발생
스레드에서의 컨텍스트 스위칭
- 스택 영역을 제외한 모든 메모리 공유
- 스레드 컨텍스트 스위칭의 경우 비용&시간이 더 적음
5. 멀티프로세싱
- 멀티프로세스를 통해 하나 이상의 일을 병렬로 처리 가능
웹 브라우저
- 브라우저 프로세스 : 주소 표시줄, 북마크 막대, 뒤로가기 버튼, 앞으로가기 버튼 등을 담당하며 네트워크 요청이나 파일 접근 같은 권한 담당
- 렌더러 프로세스 : 웹사이트가 '보이는' 부분의 모든 것 제어
- 플러그인 프로세스 : 웹 사이트에서 이용하는 플러그인 제어
- GPU 프로세스 : GPU 이용해 화면 그리는 부분 제어
IPC (Inter Process Communication)
- 프로세스끼리 데이터를 주고 받고 공유 데이터를 관리하는 메커니즘
공유 메모리
- 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한 부여
- 프로세스가 서로 통신할 수 있도록 공유 버퍼 생성
- 불필요한 데이터 복사의 오버헤드 발생하지 않아 가장 빠름
파일
소켓
- 네트워크 인터페이스를 통해 전송하는 데이터
- TCP, UDP 가 있음
익명 파이프
- 프로세스간 FIFO 방식의 임시 공간인 파이프를 기반으로 데이터를 주고 받음
- 부모-자식 프로세스 간에만 사용 가능
명명된 파이프

- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 이중 파이프
- 클라이언트/서버 통신을 위한 별도의 파이프 제공
- 여러 파이프 동시 사용 가능
메시지 큐
- 메시지를 큐 데이터 구조 형태로 관리
- 커널에서 전역적으로 관리
6. 스레드와 멀티스레딩
스레드
멀티스레딩
- 프로세스 내 작업을 여러 개의 멀티스레드로 처리
- 스레드 간 자원을 공유하므로 효율성이 높음
ex). 웹 브라우저의 렌더러 프로세스
에는 메인 스레드
, 워커 스레드
, 컴포지터 스레드
, 레스터 스레드
가 존재
7. 공유 자원과 임계 영역
공유 자원 (Shared Resource)
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 데이터 등의 자원이나 변수
- 경쟁 상태 발생 가능
임계 영역 (Critical Section)
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
- 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
- 한정 대기 : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.
- 융통성 : 한 프로세스가 다른 프로세스의 일을 방해하면 안 된다.
뮤텍스 (Mutex)
- 프로세스나 스레드가 공유 자원을
lock()
을 통해 잠금 설정하고 사용한 후에는 unlock()
을 통해 잠금 해제하는 객체
- 뮤텍스는
잠금
or 잠금 해제
라는 상태만 가짐
- 잠금 메커니즘
세마포어 (Semaphore)
- 일반화된 뮤텍스
- 간단한 정수 값과
wait
, signal
함수로 공유 자원에 대한 접근 처리
- wait : 자신의 차례가 올때까지 기다림
- signal : 다음 프로세스로 순서를 넘겨줌
- 신호 메커니즘
바이너리 세마포어
- 0과 1의 두가지 값만 가질 수 있는 세마포어
카운팅 세마포어
- 여러 개의 값을 가질 수 있으며, 여러 자원에 대한 접근을 제어
모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
8. 교착 상태 (Deadlock)
- 두 개 이상의 프로세스들이 서로 가진 자원을 기다리며 중단된 상태
교착 상태의 원인
- 상호 배제
- 점유 대기
- 비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없음
- 환형 대기 : 서로의 자원을 요구하는 상황
교착 상태의 해결 방법
- 자원을 할당 시 애초에 조건이 성립되지 않도록 설계
- 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스 당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는
은행원 알고리즘
사용
- 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지움
- 교착 상태 발생 시 작업 종료
- 은행원 알고리즘 : 총 자원의 양과 현재 할당한 자원의 양을 기준으로
안정
or 불안정
상태로 나누고 안정
상태로 가도록 자원을 할당