Q1. 프로세스와 스레드에 대해 설명해 주세요.
1. 프로세스란
프로세스는 간단하게 말하면, 실행 중인 프로그램입니다.
컴퓨터에서 프로그램을 실행한다는 것은 운영체제가 프로그램을 메인 메모리(RAM; Random Access Memory)에 로드하고 실행한다는 것을 의미하는데, 프로세스는 프로그램이 실행되면 생성됩니다.
각각의 프로세스는 독립적인 메모리 공간을 가지는데, 각 영역은 다음과 같습니다.
- Code: 컴파일을 통해 변환된 기계어가 저장되는 공간
- Data: 전역 변수나 static 변수 등의 데이터가 저장되는 공간
- Heap: malloc 등으로 동적 할당된 메모리가 저장되는 공간
- Stack: 함수 호출, 지역 변수, 리턴값 등의 데이터가 저장되는 공간
각 프로세스는 할당받은 메모리를 따로 쓰는데, 프로세스 간 통신(IPC; Inter-Process Communication)을 위해 공유 메모리(스레드), 파이프, 메시지 큐 등의 방법을 사용합니다.
2. 스레드란
스레드는 프로세스 안에서 실행되는 작은 실행 단위입니다.
하나의 프로세스 안에는 최소 한 개의 스레드가 존재하며, 두 개 이상의 스레드가 한 프로세스 안에 있을 수도 있습니다.
두 개 이상의 스레드가 존재하는 경우 스레드들은 프로세스의 Code, Data, Heap 메모리 영역을 공유하지만, Stack 영역은 스레드별로 각각 가집니다.
같은 메모리 공간을 공유하는 만큼 스레드들은 본인이 속한 프로세스의 데이터를 서로 빠르게 주고받을 수 있지만, 동시에 하나의 자원에 접근하려고 하면 문제가 생길 수 있습니다. 이를 경쟁 상태(race condition)라고 합니다.
Q2. 프레임워크와 라이브러리의 차이에 대해 설명해 주세요.
1. 라이브러리
라이브러리는 특정 기능 및 역할을 하면서, 필요할 때 가져다 사용할 수 있는 코드의 모음이라고 할 수 있습니다.
즉, 프로그래머가 프로그램의 흐름을 직접 제어하기 위해 사용하는 도구 모음 같은 느낌인데, 정리하면 다음과 같습니다.
- 필요할 때 프로그래머가 불러와서 쓰는 도구 모음
- 프로그램의 흐름을 직접 제어하기 위해 사용
- 라이브러리는 단순히 기능을 제공
2. 프레임워크
프레임워크는 프로그램의 기본 구조와 흐름을 제공하며, 그 규칙과 틀 안에서 프로그래머가 코드를 작성하는 방식입니다.
즉, 프로그램의 전반적인 제어권이 프레임워크에 있고, 프로그래머는 그 구조에 맞춰 필요한 부분만 구현하는 느낌인데, 정리하면 다음과 같습니다.
- 정해진 구조와 흐름 안에서 코드를 작성
- 프로그램의 흐름 제어권이 프레임워크에 있음
- 프레임워크가 필요한 시점에 프로그래머의 코드를 호출