> For the complete documentation index, see [llms.txt](https://leehyokyun.gitbook.io/openbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leehyokyun.gitbook.io/openbook/1-3..md).

# 1-3. 프로세스와 스레드

시스템 프로세스와 이를 실행하는 스레드, 여기서 나아가 메모리 공유에 대하여

### 1. 프로세스와 스레드에 대하여 #1 (정의 및 매핑 구조)

* 프로세스는 운영체제로부터 자원을 할당받아 독립적으로 실행되는 단위이며, 핵심은 자원 할당이다.
* 스레드는 프로세스 내부에서 실행되는 작업 흐름의 단위이며, 핵심은 프로세스 내부에서 다중 요청에 대한 처리다.
* 인프라 매핑 구조: 1개의 WAS(Web Application Server)는 1개의 JVM(Java Virtual Machine) 위에 올려져 1개의 애플리케이션 서버를 실행하기 위한 인스턴스로 작동하므로, 다음 등식이 성립한다.
  * 1 WAS = 1 JVM = 1 OS 프로세스
* 작동 메커니즘: 운영체제로부터 자원을 할당받아 1개의 애플리케이션(프로세스)이 실행되면, 내부적으로 다중 스레드(Thread-1, Thread-2, Thread-3, GC 스레드 등)에 의해 다수의 요청을 독립적으로 실행하거나 자원 공유로 인한 동기화 문제를 제어한다. 만약 독립된 다른 WAS2가 구동되면 이는 별도의 JVM2 프로세스로 격리된다.

### 2. 프로세스와 스레드에 대하여 #2 (메모리 공간 구조 및 공유 특성)

* 프로세스의 메모리 구조: 각각 독립된 메모리 공간인 Stack, Heap, Code, Data 영역을 가지며, 기본적으로 다른 프로세스와 메모리 공유를 하지 않는다.
  * 격리 특성: 서로 다른 프로세스 간에는 싱글톤 객체를 공유하는 일이 절대 발생하지 않으며, 공유하는 공간이 없으므로 별도 통신(Socket, IPC 등) 체계를 통과해야만 통신이 가능하다.
* 스레드의 메모리 구조: 스레드는 자신만의 독립된 변수 공간인 Stack 영역만을 개별적으로 할당받는다.
  * 공유 특성: Stack 영역을 제외한 나머지 Heap, Code, Data 영역은 자신이 속한 부모 프로세스의 자원을 그대로 공유하고 참조한다.
  * 동시성 동기화: 동일 프로세스 내부의 스레드들은 Heap 영역에 존재하는 싱글톤 객체나 Data 영역의 정적(static) 변수를 자유롭게 공유하고 참조할 수 있기 때문에, 자원을 동시에 수정할 때 발생하는 동동성 상태에 대응하기 위한 동기화(synchronized) 문제가 필연적으로 동반된다.

### 3. 컨텍스트 스위칭(Context Switching)의 연산 비용과 본질

* 컨텍스트 스위칭 정의: CPU가 현재 실행 중인 프로세스 또는 스레드의 상태(Context)를 보존하고, 스케줄러에 의해 선택된 다음 타깃 프로세스 또는 스레드의 상태를 복원하여 실행을 교체하는 연산 과정이다.
* 프로세스 간 컨텍스트 스위칭: 프로세스는 완전히 독립된 메모리 주소 공간을 소유하므로 가상 메모리 주소 공간(Virtual Address Space)의 전환 비용이 매우 크게 발생한다.
  * 캐시 미스 오버헤드: 특히 CPU 측에서 이전 프로세스의 가상 메모리 주소 매핑 정보에 대한 하드웨어 캐시(TLB)를 통째로 버리는 비용인 TLB Flush 비용이 가중된다.
  * 이로 인해 새로운 프로세스가 기동할 때 가상 메모리 매핑 캐시가 전무하므로, 메모리 주소 테이블을 다시 탐색하여 캐시를 갱신하는 비용인 Page Walk 연산 및 물리 메모리 재접근 부하가 매우 크게 발생한다. 이것이 프로세스 스위칭 오버헤드의 핵심적인 본질이다.
* 스레드 간 컨텍스트 스위칭: 스레드는 Stack 영역을 제외한 Heap, Code, Data 영역의 주소 공간을 완벽하게 공유한다.
  * 비용 절감 원리: CPU 입장에서는 프로세스 자원 자체를 바꿀 필요가 없으므로 가상 메모리 주소 공간의 전환 비용 및 이에 따른 Page Table 변경 연산이 발생하지 않는다.
  * 따라서 하드웨어 캐시인 TLB를 강제로 비워내는 TLB Flush 과정이나 캐시 재구축을 위한 Page Walk 비용이 프로세스에 비해 압도적으로 적으며, CPU는 오직 교체되는 스레드의 Stack 포인터 변경 및 레지스터 값 보존/복원 비용 정도만 가볍게 소모하므로 신속하게 완료된다.

### 4. 프로세스와 시스템 콜의 실행 모드 및 생성 메커니즘

* 실행 권한의 분리: 일반적인 프로세스는 안전성을 위해 제한된 권한만 가진 유저 모드(User Mode)에서 실행된다. 반면 실제 물리적인 하드웨어나 핵심 자원은 운영체제 자체인 커널 모드(Kernel Mode)에서 관리된다. 두 영역을 넘나드는 유일한 법적 통로가 바로 시스템 콜이다.
* 생성 제어 검증: 프로세스를 실행할 때 그 프로세스를 읽어, 프로세스에 쓰라는 시스템 콜이 필요한가에 대한 대답은 아니다(X)다. 프로세스의 생성 자체가 커널의 개입(시스템 콜)으로 이루어지며, 커널의 개입으로 자원 이동이 발생하는 것이다.
* 운영체제별 프로세스 생성 시스템 콜의 대표적인 예시
  * Linux 기준: fork(), execve()
  * Windows 기준: CreateProcess()
* 커널 동작 내부: 사용자가 프로그램을 실행하여 위 시스템 콜을 호출하는 순간, 커널이 PCB(Process Control Block)를 생성 및 등록하고 가상 메모리 공간을 확보하여 Code, Heap, Stack 공간을 할당하는 일련의 무거운 작업들이 이뤄진다. 이후 파일 디스크립터를 제어하는 read(fd, buf, 100), write(fd, buf, 100) 등의 세부 시스템 콜 연산으로 연결된다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://leehyokyun.gitbook.io/openbook/1-3..md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
