인프런의 운영체제 공룡책 강의를 듣고 정리한 포스팅입니다.
프로세스 (Process)
메모리에 할당된 실행 중인 프로그램
- 프로세스는 운영체제에서 작업의 단위
- 프로세스가 필요한 자원
- CPU time
- memory
- files
- I/O device
메모리 구조
프로세스의 메모리 레이아웃은 여러 개의 섹션으로 나누어짐

- text : 명령어들이 있는 영역
- data : 전역 변수와 static 변수가 있는 영역
- heap : 동적으로 할당되는 영역
- stack : 함수 호출시 쌓이는 영역 (매개 변수, 지역 변수, return 주소값)
프로세스의 생명 주기
프로세스의 생명 주기를 통해 상태가 나누어지는데, 이를 이용해 운영체제가 프로세스들을 관리함

- New : 프로세스가 생성된 상태
- Running : CPU를 점유해 프로세스의 명령어를 실행하는 상태
- Wating : 일이 안끝난 상태에서 CPU의 점유를 기다리는 것
- I/O를 통해 시간이 많이 걸려 CPU를 양보하거나, I/O가 끝날 때까지(I/O completion) 대기
- Ready : CPU 점유할 준비를 마친 상태
- I/O가 다 끝났을 때
- Terminated : 프로세스가 종료한 상태
PCB (Process Control Block)
프로세스가 가져야 하는 모든 정보를 저장하는 PCB 구조체를 통해 운영체제가 프로세스를 관리함
PCB (Process Control Block) / TCB (Thread Control Block)
- 구조체 하나에 프로세스가 가져야 하는 모든 정보를 저장 → 프로세스 핸들링
- PCB가 가지고 있는 정보
- Process state
- Program counter (PC) : 프로세스의 명령어가 위치한 메모리 주소
- CPU registers : IR, DR, ...
- CPU-scheduling information
- Memory-management information
- Accounting information
- I/O status information
스레드 (Thread)
기본적인 프로세스는 single thread of excution 한다.
⇒ 실행이 한 줄로 이루어진다. (동시에 안됨)
프로그램 한 개 내에서도 여러 개의 스레드가 동시에 실행되어야 할 필요가 있음
→ 스레드가 프로세스보다 가볍기 때문
멀티 프로세스보다 멀티 스레드가 가벼움
⇒ 병렬 처리시, 멀티 스레드를 사용
멀티 프로그래밍과 타임 쉐어링
멀티프로그래밍의 목적
- 동시에 여러 개의 프로세스를 실행시키자
- CPU의 사용효율을 늘리자 → CPU가 노는 꼴을 못봄
타임 쉐어링의 목적
- CPU의 처리속도가 빠름
- 프로세스 간에 자주 변경을 해서 사용자 입장에서 각 프로그램이 동시에 실행하는 것처럼 보이게 하자
Sceduling Queues

멀티 프로그래밍과 타임 쉐어링을 위한 CPU 스케줄링
- 프로세스들은 대기열에서 대기 (ready queue)
- I/O가 필요한 프로세스들은 wating queue에서 대기 → 대기가 끝나면 ready queue로
- 실제 구현은 PCB의 연결 리스트로
- wating queue는 I/O 장치에 따라 여러 개가 있을 수 있음
문맥 교환 (Context Switch)
문맥
프로세스 입장에서 프로세스가 사용되고 있는 상태
→ 이 상태는 PCB에 저장
문맥 교환의 문맥은 PCB 정보를 말함
문맥 교환
문맥 교환은 다른 프로세스로 CPU를 넘겨줄 때 발생
실행 중인 프로세스와 실행 할 프로세스의 PCB를 교환함
- interrupt가 일어났을 때
- 실행 중인 프로세스는 현재 문맥을 저장해두고 (PC를 통해 어디까지 실행했는지)
- 재개됐을 때(CPU를 다시 획득했을 때) 저장된 문맥을 restore
- 문맥 교환이란
- 다른 프로세스로 CPU를 넘겨줄 때
- 현재 프로세스의 문맥을 저장
- 새로운 프로세스의 문맥을 복원
⇒ OS 스케줄링(문맥 교환)을 통해 타임 쉐어링, 멀티 프로세싱이 이루어짐
Fork()
Fork()를 통해 프로세스가 새로운 프로세스를 생성할 수 있음
⇒ 새로운 프로세스를 만드는 프로세스를 부모 프로세스, 만들어진 프로세스는 자식 프로세스
⇒ 프로세스의 트리 관계 성립

실행에 있어 두 개의 가능성
- 부모와 자식 프로세스가 동시에 실행
- 자식 프로세스가 끝날 때까지 대기
주소 공간에 있어 두 개의 가능성
- 부모 프로세스를 복제하는 경우 → 실행하는 코드는 똑같으니 굳이 두 개를 만들 필요 없이 PCB만 다르게
- 새로운 프로그램을 로딩하는 경우
프로세스의 종료
- 마지막 문장을 실행 : 주로 return
- exit() 시스템 콜 호출
- OS 입장에서는 메모리를 회수하고 해제 : 할당된 memories, open files, I/O buffers ... 해제
좀비 프로세스
부모가 wait()를 호출하지 않고 부모의 일을 계속 함
고아 프로세스
부모 프로세스가 wait() 호출을 하지 않아 자식 프로세스가 끝나길 기다리질 않고 끝나버렸을 때
인프런의 운영체제 공룡책 강의를 듣고 정리한 포스팅입니다.
프로세스 (Process)
메모리에 할당된 실행 중인 프로그램
- 프로세스는 운영체제에서 작업의 단위
- 프로세스가 필요한 자원
- CPU time
- memory
- files
- I/O device
메모리 구조
프로세스의 메모리 레이아웃은 여러 개의 섹션으로 나누어짐

- text : 명령어들이 있는 영역
- data : 전역 변수와 static 변수가 있는 영역
- heap : 동적으로 할당되는 영역
- stack : 함수 호출시 쌓이는 영역 (매개 변수, 지역 변수, return 주소값)
프로세스의 생명 주기
프로세스의 생명 주기를 통해 상태가 나누어지는데, 이를 이용해 운영체제가 프로세스들을 관리함

- New : 프로세스가 생성된 상태
- Running : CPU를 점유해 프로세스의 명령어를 실행하는 상태
- Wating : 일이 안끝난 상태에서 CPU의 점유를 기다리는 것
- I/O를 통해 시간이 많이 걸려 CPU를 양보하거나, I/O가 끝날 때까지(I/O completion) 대기
- Ready : CPU 점유할 준비를 마친 상태
- I/O가 다 끝났을 때
- Terminated : 프로세스가 종료한 상태
PCB (Process Control Block)
프로세스가 가져야 하는 모든 정보를 저장하는 PCB 구조체를 통해 운영체제가 프로세스를 관리함
PCB (Process Control Block) / TCB (Thread Control Block)
- 구조체 하나에 프로세스가 가져야 하는 모든 정보를 저장 → 프로세스 핸들링
- PCB가 가지고 있는 정보
- Process state
- Program counter (PC) : 프로세스의 명령어가 위치한 메모리 주소
- CPU registers : IR, DR, ...
- CPU-scheduling information
- Memory-management information
- Accounting information
- I/O status information
스레드 (Thread)
기본적인 프로세스는 single thread of excution 한다.
⇒ 실행이 한 줄로 이루어진다. (동시에 안됨)
프로그램 한 개 내에서도 여러 개의 스레드가 동시에 실행되어야 할 필요가 있음
→ 스레드가 프로세스보다 가볍기 때문
멀티 프로세스보다 멀티 스레드가 가벼움
⇒ 병렬 처리시, 멀티 스레드를 사용
멀티 프로그래밍과 타임 쉐어링
멀티프로그래밍의 목적
- 동시에 여러 개의 프로세스를 실행시키자
- CPU의 사용효율을 늘리자 → CPU가 노는 꼴을 못봄
타임 쉐어링의 목적
- CPU의 처리속도가 빠름
- 프로세스 간에 자주 변경을 해서 사용자 입장에서 각 프로그램이 동시에 실행하는 것처럼 보이게 하자
Sceduling Queues

멀티 프로그래밍과 타임 쉐어링을 위한 CPU 스케줄링
- 프로세스들은 대기열에서 대기 (ready queue)
- I/O가 필요한 프로세스들은 wating queue에서 대기 → 대기가 끝나면 ready queue로
- 실제 구현은 PCB의 연결 리스트로
- wating queue는 I/O 장치에 따라 여러 개가 있을 수 있음
문맥 교환 (Context Switch)
문맥
프로세스 입장에서 프로세스가 사용되고 있는 상태
→ 이 상태는 PCB에 저장
문맥 교환의 문맥은 PCB 정보를 말함
문맥 교환
문맥 교환은 다른 프로세스로 CPU를 넘겨줄 때 발생
실행 중인 프로세스와 실행 할 프로세스의 PCB를 교환함
- interrupt가 일어났을 때
- 실행 중인 프로세스는 현재 문맥을 저장해두고 (PC를 통해 어디까지 실행했는지)
- 재개됐을 때(CPU를 다시 획득했을 때) 저장된 문맥을 restore
- 문맥 교환이란
- 다른 프로세스로 CPU를 넘겨줄 때
- 현재 프로세스의 문맥을 저장
- 새로운 프로세스의 문맥을 복원
⇒ OS 스케줄링(문맥 교환)을 통해 타임 쉐어링, 멀티 프로세싱이 이루어짐
Fork()
Fork()를 통해 프로세스가 새로운 프로세스를 생성할 수 있음
⇒ 새로운 프로세스를 만드는 프로세스를 부모 프로세스, 만들어진 프로세스는 자식 프로세스
⇒ 프로세스의 트리 관계 성립

실행에 있어 두 개의 가능성
- 부모와 자식 프로세스가 동시에 실행
- 자식 프로세스가 끝날 때까지 대기
주소 공간에 있어 두 개의 가능성
- 부모 프로세스를 복제하는 경우 → 실행하는 코드는 똑같으니 굳이 두 개를 만들 필요 없이 PCB만 다르게
- 새로운 프로그램을 로딩하는 경우
프로세스의 종료
- 마지막 문장을 실행 : 주로 return
- exit() 시스템 콜 호출
- OS 입장에서는 메모리를 회수하고 해제 : 할당된 memories, open files, I/O buffers ... 해제
좀비 프로세스
부모가 wait()를 호출하지 않고 부모의 일을 계속 함
고아 프로세스
부모 프로세스가 wait() 호출을 하지 않아 자식 프로세스가 끝나길 기다리질 않고 끝나버렸을 때