✔ 프로세스와 스레드
프로세스란?
- 메모리 상에서 실행중인 작업(프로그램)
- 디스크로부터 메모리에 적재되어 CPU의 할당을 받은 작업의 단위
- 운영체제로부터 주소, 공간, 파일, 메모리 등의 시스템 자원을 할당받게 됨
프로세스 주소 공간이란?
- 프로세스는 각각 별도의 주소공간을 할당받음
- 프로세스 주소 공간에는 최대한 데이터를 공유하여 메모리 사용량을 줄이기 위해 코드, 데이터, 스택으로 이루어짐
- Code : 코드 자체를 구성하는 메모리 영역
- Data : 전역변수, 정적변수, 배열 등을 구성하는 메모리 영역
- Heap : 동적 할당 시 사용하는 메모리 영역
- Stack : 지역변수, 매개변수, 리턴 값 등을 구성하는 임시 메모리 영역
멀티 프로세스란?
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
- 메모리 침범 문제를 OS 차원에서 해결하며 자식 프로세스 중 하나에 문제가 발생하면 그 프로세스만 죽게 되어 안전하지만,
프로세스마다 각각 독립된 메모리 영역을 가지게 되어 작업량이 많을수록 오버헤드가 발생하며
캐시 메모리를 비워야만 하는 Context Switching으로 인해 성능이 저하됨
또한 각 독립된 메모리 영역을 할당받으므로 프로세스들 사이에서 IPC를 통해 변수나 자료구조를 통신해야 함
PCB와 Context Switching
- 프로세스가 여러 개일 때 CPU는 CPU 스케줄링을 통해 프로세스를 관리해야 하며
이때 CPU는 각 프로세스들이 누군지 알아야 관리가 가능하므로 프로세스는 Process Metadata 특징을 가지게 됨 - 메타 데이터에는 프로세스 식별자(PID), 프로세스 상태, 프로그램 카운터(PC), CPU 레지스터, CPU 스케줄링 정보,
메모리 관리 정보, 입출력 상태 정보, 어카운팅 정보가 존재함 - 이러한 메타 데이터는 프로세스가 생성되면 PCB(Process Control Block)에 저장됨
- 프로그램 실행
- 프로세스 생성
- 프로세스 주소 공간에 (코드, 데이터, 스택) 생성
- 이 프로세스의 메타 데이터들을 PCB에 저장
- Context Switching은 CPU가 이전의 프로세스 상태를 PCB에 보관하고,
또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정으로 프로세스의 상태 정보를 저장하고 복원
(동작 중인 프로세스가 대기하게 되면서 해당 프로세스의 상태를 보관하고,
대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구) - Context Switching은 캐시 초기화, 메모리 매핑 초기화, 커널 항상 실행으로 인해 많은 비용이 소모되며
스레드는 Stack 영역을 제외한 모든 메모리를 공유하기 때문에
Context Switching 발생 시 Stack 영역만 변경하면 되므로 프로세스에 비하여 훨씬 적은 시간과 비용이 들게 됨 - 보통 인터럽트가 발생하거나, 실행 중인 CPU 사용 허가시간을 모두 소모하거나, 입출력을 위해 대기해야 하는 경우에 발생하며
CPU에서 계속 프로세스를 수행히키도록 하여 CPU가 놀지 않도록 하고 사용자에게 빠르게 일처리를 제공해주기 위해 발생함
시스템 콜이란?
- 프로세스 생성과 제어를 위해 OS가 제공하는 인터페이스
- fork는 새로운 프로세스를 생성할 때 사용하며
이때 생긴 프로세스(child)는 fork값(PID)은 다르지만 fork를 만든 프로세스(parent)와 fork() 동일한 복사본을 갖게 되므로
동일한 프로세스의 내용을 여러 번 동작하게 됨 - wait는 child 프로세스가 종료될 때까지 기다리는 작업으로
만약 parent가 먼저 실행되더라도 wait을 사용하면 child가 끝나기 전에는 반환하지 않으므로 반드시 child가 먼저 실행됨 - exec는 fork와 달리 child에서 parent와 다른 동작을 하고 싶을 때 사용함
- 시스템 콜에는 운영체제의 코드를 수행하는 커널 모드와 사용자 프로그램의 코드를 수행하는 사용자 모드가 존재하며
프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신 5가지 범주로 유형이 나누어짐
스레드란?
- 프로세스 안에서 실행되는 여러 흐름 단위로 하나의 프로세스가 생성될 때 기본적으로 하나의 스레드를 같이 생성하게 됨
- 기본적으로 프로세스마다 최소 1개의 스레드를 소유함 (메인 스레드 포함)
- 스레드는 Stack만 할당 받으며 나머지 영역(Code, Data, Heap)은 서로 공유하게 됨
멀티 스레드란?
- 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것
- 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 Stack과 PC 레지스터 값을 가지게 되지만
그 외의 Code, Data, Heap 영역은 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해줌 - 공유 메모리를 사용하므로 시간, 자원 손실이 감소하지만,
하나의 스레드가 데이터 공간을 망가뜨리면 모든 스레드가 작동 불가 상태가 되는 안전성 문제가 존재 - 멀티 스레드는 안전성 문제를 위해 동기화 작업이 필요하며 임계 구역(Critical Section) 기법을 통해 대비함
멀티 스레드와 멀티 프로세스
- 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용
- 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용
'Tech Interview > Operating System' 카테고리의 다른 글
[Operating System] 프로세스 동기화 (0) | 2023.12.15 |
---|---|
[Operating System] CPU 스케줄링 (0) | 2023.12.14 |
[Operating System] IPC (0) | 2023.12.13 |
[Operating System] 운영체제 (0) | 2023.12.04 |
[Operating System] 컴퓨터 시스템의 동작 원리 (0) | 2023.12.04 |