질문
- 프로세스의 개념
- 실행중이라는 말에 대한 자세한 설명
- 프로세스 종류
- 프로세스 생명주기
- 프로세스 특징
- PCB의 개념
- 컨텍스트 스위칭 개념
- 프로그램과 프로세스의 차이
- 프로세스 메모리 구조
- 컨텍스트 스위칭이 발생되는 경우
- 스레드가 나오게 된 배경 (=프로세스의 문제점)
피드백(천욱님)
- 질문이 이해되지않을 때, 어떤 부분이 이해되지 않는지 구체적으로 추가질문해주면 좋을 거 같음
- 잘 모르겠으면 모르겠다고 솔직하게 말해주세요 : ) 빨리 다른 개념으로 넘어가서 만회하기 !
- 기본적인 개념에 대한 숙지를 조금 더 하시면 좋을 거 같아요 ! 🙂
프로그램 실행과정

process
- 컴퓨터에서 실행 중인 프로그램
Q. 실행 중 ?
A. 하드디스크에서 메모리(RAM)에 파일이 올라온 상태 CPU 점유한 거 ❌
개인적으론, 프로세스는 RAM에 올라온 프로그램
- PCB(process control block)
- 프로세스를 관리하는 구조체, 운영체제로부터 CPU를 할당받는 작업의 단위였음(현재는 스레드)
- 구성
- process id : 고유한 아이디
- process state : 프로세스의 상태 - running, waiting, ready, terminated (프로세스 생명주기 중 하나)
- Register
- Program Counter : 다음 실행할 명령어의 주소
- 이 외에도
- CPU 스케줄링 정보: 우선순위, 점유시간..
- 입출력 상태 정보: 프로세스에 할당된 입출력 장치목록, 열린파일 목록..
- 포인터: 부모프로세스, 자식 프로세스…

- 프로세스 생명주기 (프로세스 상태를 기준으로)
- new : RAM으로 올라와 PCB 생성 중인 상태
- ready : CPU 점유만 받으면 실행할 수 있는 상태(CPU 점유받지 못한 상태)
- ready queue로 관리함
- running : CPU가 실행하고 있는 상태
- waiting : I/O 같은 이벤트 발생 시(EX, 파일읽기), 이벤트가 끝날 때까지 기다리는 상태 - 끝난 후엔, 인터럽트를 통해 끝났다는 걸 알려주고, ready 상태로 돌아가 cpu를 기다림
- terminated : 프로세스 실행 끝난 상태

Q. ready 상태로 오는 방법이 뭐가 있는지

A. fork a child → 새로운 자식 프로세스 만듬 → new 상태 → ready
- 특징
- 다른 프로세스의 자원(변수, 함수 등)에 접근할 수 없음
- 접근하려면, 프로세스간의 통신을 사용해야함
독립된 메모리 공간을 할당받음
- 프로세스 통신
IPC
(inter-process commnunication) - 왜 필요할까? 서로 통신해야하는 경우가 있을 수 있음
- 방법
- 메시지 교환(message passing)
그림 왼쪽
- direct communication
- indirect commnunication
- 공유 메모리(shared memory)
그림 오른쪽
EX
채팅 - 상대방 메시지, 내가보낸 메시지 둘 다 보여줘야함
→ 상대방, 나의 메시지를 각각의 프로세스로 관리하면, 엄청난 프로세스 통신이 필요함
(메시지를 독립적인 메모리에 저장하니까)
→ 메모리를 공유하는 프로세스인 스레드 등장 ! 
운영체제 커널을 통해 메시지(데이터 등)를 주고받음
메시지 보낼 대상을 정함 → 다른 프로세스가 메시지를 받음
mailboxes에 메시지를 보냄 → 다른 프로세스가 mailboxes에 접근해 메시지를 받아옴
통신이 필요한 프로세스 모두 접근할 수 있는 공유 메모리를 할당해서, 통신하는 방법
- 문제점 : 동기화
- 컨텍스트 스위칭
- CPU에서 실행중인 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것 ← OS커널이 제어
- 현재 프로세스 상태를 보관
- 대기하고 있던 다음 순서의 프로세스 동작 & 그 프로세스의 이전 상태 복구
- 컨텍스트 스위칭이 필요한 이유?
- 언제 발생할까?
- 주어진 cpu 할당시간을 다 사용한 경우
- I/O 작업, 이용 중인 리소스 기다려야할 때.. 등등 → 지금 당장 실행할 수 없는 경우, 기다리는 시간동안 다른 프로세스를 돌린다 (CPU사용률 높임)
- 프로세스는 독립적인 메모리영역을 가짐 →
메모리 주소 처리가 추가로 필요함
- 간단한 개념 정의
- MMU: memory management unit, 메모리 관리장치 - 가상메모리 주소 → 물리주소
- TLB: MMU의 일부 - 가상메모리 주소와 물리주소 맵핑하는 페이지 테이블 중, 자주 쓰는 것 저장해두는 캐시
- 메모리 주소관련 처리를 추가로 수행
- MMU가 P1 → P2(프로세스)메모리를 바라보도록 변경
- TLB를 전체 비움 (P2로 컨텍스트 스위칭을 했으니 P1의 자주쓰는 페이지 물리주소 정보를 지워야함. 안그러면 P1에 접근할 수 있음. 왜냐면 CPU가 TLB → 페이지 테이블 → 하드디스크로 접근하니까)
- 컨텍스트 스위칭이 발생하면, CPU 캐시 오염(L1, L2)이 생길 수 있음 : 아예 다른 프로세스로 전환되면, 이전 프로세스의 캐시값들이 있음 → 메모리로 가는 상황 많아짐 → 전환 후, 초기엔 성능 안좋을 수 있음
- CPU 캐시: 자주쓰는 주소값, CPU 캐시에 보관 (RAM에서 들고오는 것보다 빠름)
(싱글코어를 기준으로) 여러 프로세스를 동시에 실행시키기 위해
(옛날엔, 1개의 프로세스가 끝난 후에 다른 프로세스 실행…😖)
Q
프로세스 컨텍스트 스위칭, 스레드 컨텍스트 스위칭(같은 프로세스의 스레드라 가정) 중에 누가 더 빠를까? 그 이유는 ? 
A
스레드 컨텍스트 스위칭이 더 빠르다.
그 이유는 메모리 주소 관련 처리를 하지 않기 때문에프로세스의 단점
- 프로세스 간 독립적인 메모리를 할당받기에, 데이터 공유 까다로움
- 동시에 여러작업 수행시키기위해, 컨텍스트 스위칭 작업 → 프로세스 컨텍스트 스위칭 무거운 작업
→ 스레드 등장 !
참고자료
- 인프런 공룡책 강의
- 유튜브 - 쉬운코드 https://www.youtube.com/@ez.