컴퓨터 & 코딩/CS

[혼공학습단 10기][혼공컴운] 프로세스와 스레드

구로그 2023. 7. 13. 14:10
728x90

✓ 프로세스 개요 

✏️ 프로세스: 보조기억장치에 저장되어있는 프로그램을 메모리에 적재하고 실행하는 과정

 

포그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스 

백그라운드 프로세스: 사용자가 보지 못하는 뒤편에서 실행되는 프로세스

  • 사용자와 직접 상호작용하는 백그라운드 프로세스
  • 사용자와 상호작용하지 않는 백그라운드 프로세스: (유닉스) 데몬 daemon, (윈도우) 서비스 

 

프로세스 제어 블록 PCB 

- 프로세스와 관련된 정보를 저장하는 자료 구조. 

- 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리. 프로세스에 CPU를 비롯한 자원을 배분 

- 커널 영역에 생성됨. 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다. 

- PCB에 담기는 정보

  1. 프로세스 ID (PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 
  2. 레지스터 값: 이전까지 사용했던 레지스터의 중간값들(프로그램 카운터 등) 
  3. 프로세스 상태
  4. CPU 스케줄링 정보: 프로세스가 언제 어떤 순서로 CPU를 할당받을지 
  5. 메모리 관리 정보: 어느 주소에 저장되어 있는지. (베이스 레지스터, 한계 레지스터 값, 페이지 테이블 등)
  6. 사용한 파일입출력장치 목록

 

 

문맥 교환

✏️ 문맥 context: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보 → PCB에 기록되는 정보

- 프로세스가 실행되다가 인터럽트가 발생하면 운영체제가 해당 프로세스의 PCB에 문맥을 백업한다

- 문맥 교환: 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것

 

 

프로세스의 메모리 영역 - 사용자 영역에서의 프로세스

1️⃣ 정적 할당 영역 : 크기가 고정된 영역 (read-only)

- 코드 영역 code(text) segment: 실행할 수 있는 코드가 저장

- 데이터 영역 data segment: 프로그램이 실행되는 동안 유지할 데이터. (ex. 전역 변수) 

2️⃣ 동적 할당 영역 : 크기가 변할 수 있는 영역

- 힙 영역 heap segment: 프로그래머가 직접 할당할 수 있는 저장 공간.

- 스택 영역 stack segment: 데이터를 일시적으로 저장하는 공간. (ex. 매개 변수, 지역 변수) 

❗️ 메모리 누수 memory leak: 메모리 공간을 할당했다면 언젠가는 꼭 해당 공간을 반환해야 하는데, 반환하지 않아 메모리가 낭비되는 것 
💡 메모리에서 힙 영역과 스택 영역이 겹치지 않게, 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고 스택 영역은 반대로 할당된다.  

 

 

 


 

 

 

✓ 프로세스 상태와 계층 구조 

프로세스 상태 

- 생성 상태 new: 이제 막 메모리에 적재되어 PCB를 할당받은 상태 

- 준비 상태 ready: 아직 CPU를 할당 받지 못한, 차례를 받지 못한 상태

- 실행 상태 running: CPU를 할당받아 실행 중인 상태 

✏️ 디스패치 dispatch: 준비상태 → 실행상태로
타이머 인터럽트: 실행상태 → 준비상태 

- 대기 상태 blocked: 입출력장치의 작업을 기다리는 상태. 입출력작업이 완료되면 다시 준비 상태가 됨. 

- 종료 상태 terminated: 프로세스가 종료된 상태 (PCB와 프로세스가 사용한 메모리가 정리됨)  

 

 

 

프로세스 계층 구조 

- 부모 프로세스: 새 프로세스를 생성한 프로세스

- 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스

- 최초의 프로세스: 모든 프로세스 최상단에 있는 부모 프로세스. (유닉스) init, (리눅스) systemd, (macOS) launched 

- 부모 프로세스와 자식 프로세스는 각기 다른 고유의 PID를 가짐 (일부 운영체제에서는 자식 프로세스의 PCB에 PPID Parent PID가 기록되기도 함) 

 

 

 

 

프로세스 생성 기법

fork: 부모 프로세스가 자신의 복사본을 자식 프로세스로 생성하는 시스템 호출 

exec: 복사된 자식 프로세스가 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출 

 

 

 

 


 

 

 

✓ 스레드 

✏️ 스레드: 프로세스를 구성하는 실행의 흐름 단위 

- 구성 

  1.  각기 다른 스레드 ID
  2.  프로그램 카운터 값을 비롯한 레지스터 값
  3.  스택

 

 

- 단일 스레드 프로세스: 한 번에 하나의 일만을 처리하는 프로세스 

 

❗️ 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다. 
(공유하는 자원: 주소 공간의 코드, 데이터, 힙 영역, 열린 파일)

 

- 멀티프로세스: 여러 프로세스를 동시에 실행하는 것

- 멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것 

 

❗️프로세스끼리는 자원을 공유하지 않지만 스레드끼리는 프로세스 내 자원을 공유한다.
멀티프로세스의 경우 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재할 수 있다. 
이에 반해 스레드는 서로 자원을 공유하기 때문에 협력, 통신에 유리하고 메모리의 효율적인 사용이 가능하다.
그러나 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다는 단점이 있다. 

 

 

+ 프로세스 간 통신 IPC Inter Process Communication: 프로세스끼리 자원을 공유하고 데이터를 주고 받는 것 

+ 공유 메모리 shared memory: 프로세스들이 공유할 수 잇는 메모리 영역

반응형