
깜짝 Quiz!
프로세스와 쓰레드의 차이를 설명하시오.
[정의]
🔹 프로세스: 독립적으로 실행되는 프로그램의 인스턴스로, 자체적인 주소 공간, 메모리, 데이터 스택 및 다른 시스템 자원을 가진다.
🔹 쓰레드: 프로세스 내부의 실행 흐름 단위로, 프로세스의 자원과 주소 공간을 공유하며 실행된다.
[자원 공유]
🔸 프로세스: 각 프로세스는 독립적인 메모리 공간과 시스템 자원을 가지므로, 프로세스 간 자원 공유는 IPC(Inter-Process Communication) 메커니즘을 통해 이루어진다.
🔸 쓰레드: 같은 프로세스 내의 쓰레드들은 코드, 데이터 및 시스템 자원을 공유한다.
1.5 캐시가 중요하다
캐시가 중요한 이유는 오버헤드1 때문이다.
- hello 프로그램의 기계어 인스트럭션들은 본래 하드디스크에 저장되어 있다.
- 프로그램이 로딩될 때 이들은 메인 메모리로 복사된다.
- 기술이 발전함에 따라 프로세서와 메모리 간의 속도 격차가 커지고 있다.
- 이 작업이 시간이 너무 오래 걸려서 단기간에 필요로 할 가능성이 높은 정보를 임시로 저장하는 캐시 메모리가 설계 되었다.
- 캐시 시스템의 이면에 깔려 있는 아이디어는 프로그램이 지엽적인 영역의 코드와 데이터를 액세스하는 경향인 지역성을 활용하였다.
캐시란 지역성을 활용하여 데이터 이동시간을 줄이기 위해 만든 장치다.
- 지역성 : 프로그램이 데이터를 참조할 때 공간적·시간적 특성에 따라 가까운 데이터를 참조하는 경향
- 시간적 지역성: 한번 참조한 데이터는 이후에 다시 참조하는 경향
- 공간적 지역성: 한번 참조한 데이터의 메모리상 주변 데이터를 다시 참조하는 경향
- 캐시 메모리는 최근에 사용된 데이터나 곧 사용될 가능성이 높은 데이터를 저장함으로써 메모리 접근 시간을 줄인다. 이로 인해 CPU는 필요한 데이터를 캐시에서 빠르게 찾을 수 있다.
CPU 병목현상은 CPU가 데이터를 처리하는 속도보다 메모리에서 데이터를 가져오는 속도가 느릴 때 발생한다.
- CPU는 작업을 수행하기 위해 필요한 데이터가 메모리에서 로드될 때까지 기다려야 하므로 전체 시스템 성능이 저하된다.
- 특히 대량의 데이터를 처리할 때 병목현상이 두드러지며, CPU가 처리할 수 있는 작업의 양이 제한된다. 이로 인해 프로그램의 실행 속도가 느려지고, 시스템의 전반적인 성능에 악영향을 미친다.
- 병목현상을 해결하기 위해 캐시 메모리와 같은 기술이 필요하다. 캐시는 CPU와 메모리 사이에 위치하여 자주 사용되는 데이터나 명령어를 저장함으로써 CPU가 데이터를 더 빠르게 접근할 수 있도록 돕는다.
L1, L2 캐시는 CPU의 성능을 향상시키기 위해 설계된 다단계 캐시 메모리 구조의 일부다. 각 캐시는 크기와 속도에서 차이를 보이며, 이로 인해 CPU가 데이터를 더 빠르게 접근할 수 있도록 돕는다.
- L1 캐시 : 가장 빠르고 작은 캐시로, 일반적으로 몇 킬로바이트(KB) 크기를 가지며, CPU 코어에 직접 내장되어 있다.
데이터 접근 시간이 매우 짧아, CPU가 자주 사용하는 명령어와 데이터를 저장한다. L1 캐시에서 데이터를 찾으면 CPU는 메인 메모리보다 훨씬 빠르게 작업을 수행할 수 있다. - L2 캐시 : L1 캐시보다 크기가 크고 속도는 약간 느리다. 보통 수십 KB에서 몇 메가바이트(MB)까지 다양하다.
L1 캐시에서 찾지 못한 데이터는 L2 캐시에서 검색된다. L2 캐시는 CPU와 메모리 간의 중간 역할을 하며, L1 캐시보다 더 많은 데이터를 저장할 수 있다. - L3 캐시 : L2 캐시보다 더 크고 느린 캐시로, 여러 CPU 코어가 공유하는 구조다. 수 메가바이트에서 수십 메가바이트까지 크기가 커질 수 있다. L3 캐시는 CPU 코어들이 필요한 데이터를 공유하여, 여러 코어 간의 데이터 접근 시간을 줄여준다.
이러한 다단계 캐시 구조는 CPU가 메모리에서 데이터를 읽어오는 시간을 최소화하고, CPU가 실제로 처리할 수 있는 작업의 양을 극대화하는 데 기여한다. 캐시의 사용은 CPU 성능을 크게 향상시키며, 병목현상을 줄이는 데 중요한 역할을 한다.
1.6 저장장치들은 계층구조를 이룬다

| 계층 | 명칭 | 설명 |
| L0 | 레지스터 (Regs) | CPU 레지스터가 캐시 메모리에서 가져온 words를 저장 |
| L1 | L1 캐시 (SRAM) | L1 캐시는 L2 캐시에서 가져온 캐시 라인(cache lines)을 저장 |
| L2 | L2 캐시 (SRAM) | L2 캐시는 L3 캐시에서 가져온 캐시 라인을 저장 |
| L3 | L3 캐시 (SRAM) | L3 캐시는 메모리에서 가져온 캐시 라인을 저장 |
| L4 | 메인 메모리 (DRAM) | 메인 메모리는 로컬 디스크에서 가져온 디스크 블록을 저장 |
| L5 | 로컬 보조 저장소 (Local Disks) | 로컬 디스크는 원격 네트워크 서버의 디스크에서 가져온 파일을 저장 |
| L6 | 원격 보조 저장소 (Remote Storage) | 분산 파일 시스템, 웹 서버 등의 원격 저장소 |
레지스터 → 캐시메모리 → 메인메모리 → 로컬디스크
- 하나의 저장장치는 다음 하위레벨 저장장치의 캐시 역할을 한다.


1.7 운영체제는 하드웨어를 관리한다
운영체제(Operating System, OS)는 HW와 SW 사이에 위치한 소프트웨어 계층이다. 응용 프로그램이 HW를 제어하려면 언제나 운영체제를 통해서 해야 한다.


운영체제(이하 OS)의 목표는 다음과 같다.
- 제멋대로 동작하는 응용프로그램들이 HW를 잘못 사용하는 것을 막음
- 응용프로그램들이 단순하고 균일한 메커니즘을 사용해 복잡하고 매우 다른 저수준 HW 장치들을 조작할 수 있도록 함
OS는 위 두가지 목적을 추상화2를 통해 달성한다.
OS의 추상화는 사용자에게 세부적인 내용은 숨기고 반드시 필요한 내용만 제공하는 것이다.
- 파일: 입출력 장치의 추상화
- 가상메모리: 메인 메모리와 디스크 입출력 장치의 추상화
- 프로세스: 프로세서, 메인 메모리, 입출력 장치 모두의 추상화 결과
1.7.1 프로세스
hello 프로그램이 실행될 때 프로세서, 메인 메모리, 입출력장치 등을 모두 독차지하는 것처럼, 또는 프로세서가 hello 프로그램 내의 인스트럭션들을 다른 방해 없이 순차적으로 실행하는 것처럼 보인다. 하지만 실상은 다르다! 실제로는 프로세스가 여러 개의 프로그램들을 작은 단위로 나누어서 매우 빠른 속도로 실행 하는 프로그램들을 바꾸어가면서 인스트럭션들을 실행하는 것이다.
프로세스(Process)는 실행 중인 프로그램에 대한 OS의 추상화이다.
- 다수의 프로세스들은 동일한 시스템에서 동시에 실행될 수 있고, 각 프로세스는 HW를 배타적으로 사용하는 것처럼 느낀다.
- 동시에(concurrently)라는 말은, 한 프로세스의 인스트럭션들이 다른 프로세스의 인스트럭션들과 섞인다는 것을 의미한다.
- 대부분의 시스템에서 프로세스를 실행할 CPU의 숫자보다 더 많은 프로세스들이 존재한다.
- 프로세서가 프로세스들을 바꿔주는 방식으로 한 개의 CPU가 다수의 프로세스를 동시에 실행하는 것처럼 보이게 해준다.
OS는 컨텍스트 스위칭(Context swiching, 문맥 전환)을 사용해 교차실행을 수행한다.
- OS는 프로세스가 실행하는 데 필요한 모든 상태정보(컨텍스트)의 변화를 추적한다.
- 어느 한순간에 단일 프로세서 시스템은 한 개의 프로세스의 코드만을 실행할 수 있다.
- 운영체제는 현재 프로세스에서 다른 새로운 프로세스로 제어를 옮기려고 할 때,
- 현재 프로세스의 컨텍스트를 저장
- 새 프로세스의 컨텍스트를 복원시키는 문맥전환을 실행
- 제어권을 새 프로세스로 넘겨줌
- 새 프로세스는 이전에 중단했던 바로 그 위치부터 다시 실행됨

하나의 프로세스에서 다른 프로세스로의 전환은 OS 커널(kernel)에 의해 관리된다.
- 커널은 OS 코드의 일부분으로, 메모리에 상주한다.
- 응용프로그램이 OS에 의한 어떤 작업을 요청하면
- 컴퓨터는 파일 읽기나 쓰기와 같은 특정 시스템 콜(System call)을 실행해서 커널에 제어를 넘겨준다.
- 커널은 요청된 작업을 수행하고 응용프로그램으로 리턴한다.
- 커널은 별도의 프로세스가 아니라, 모든 프로세스를 관리하기 위해 시스템이 이용하는 코드와 자료구조의 집합이다.
1.7.2 스레드
프로세스는 실제로는 스레드(Thread)라고 하는 다수의 실행 유닛으로 구성되어 있다.
- 각각의 스레드는 해당 프로세스의 컨텍스트에서 실행되며 동일한 코드와 전역 데이터를 공유한다.
- 스레드는 프로그래밍 모델로서의 중요성이 더욱 커지고 있다.
- 다수의 프로세스들에서보다 데이터의 공유가 더 쉽다.
- 스레드가 프로세스보다 더 효율적이다.
- 다중 스레딩도 다중 프로세서를 활용할 수 있다면 프로그램의 실행 속도를 빠르게 하는 한 가지 방법이다.
1.7.3 가상메모리

가상메모리는 각 프로세스들이 메인 메모리 전체를 독점적으로 사용하고 있는 것 같은 환상을 제공하는 추상화이다.
- 프로그램 코드와 데이터
- 코드는 모든 프로세스들이 같은 고정 주소에서 시작하며 다음에 C 전역변수에 대응되는 데이터 위치들이 따라온다.
- 코드와 데이터 영역은 실행 가능 목적파일인 hello로부터 직접 초기화된다.
- 힙 (Heap)
- 코드와 데이터 영역 다음으로 런타임 힙이 따라온다.
- 크기가 고정되어 있는 코드, 데이터 영역과 달리, 힙은 프로세스가 실행되면서 C 표준함수인 malloc이나 free를 호출하면서 런타임에 동적으로 그 크기가 늘었다 줄었다 한다.
- 공유 라이브러리
- 주소공간의 중간 부근에 C 표준 라이브러리나 수학 라이브러리와 같은 공유 라이브러리의 코드와 데이터를 저장하는 영역이 있다.
- 스택 (Stack)
- 사용자 가상메모리 공간의 맨 위에 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택이 위치한다.
- 힙과 마찬가지로 사용자 스택은 프로그램이 실행되는 동안에 동적으로 늘어났다 줄어들었다 한다.
- 함수를 호출할 때마다 스택이 커지며, 함수에서 리턴될 때는 줄어든다.
- 커널 가상메모리
- 주소공간의 맨 윗부분은 커널을 위해 예약되어 있다.
- 응용프로그램들은 이 영역의 내용을 읽거나 쓰는 것이 금지되어 있다.
- 커널 코드 내에 정의된 함수를 직접 호출하는 것도 금지되어 있다.
- 이런 작업을 수행하기 위해서는 커널을 호출해야 한다.

- 가상메모리가 작동하기 위해서는 프로세서가 만들어내는 모든 주소를 하드웨어로 번역하는 등의 하드웨어와 운영체제 소프트웨어 간의 복잡한 상호작용이 필요하다.
- 기본적인 아이디어는 프로세스의 가상메모리의 내용을 디스크에 저장하고, 메인 메모리를 디스크의 캐시로 사용하는 것이다.
1.7.4 파일
파일은 그저 연속된 바이트들이다.
- 모든 입출력장치는 파일로 모델링한다.
- 시스템의 모든 입출력은 UNIX I/O라는 시스템 콜들을 이용하여 파일을 읽고 쓰는 형태로 이루어진다.
- 응용프로그램에 시스템에 들어 있는 다양한 입출력장치들의 통일된 관점을 제공한다.
'Krafton Jungle > 4. CSAPP' 카테고리의 다른 글
| [Computer System] ③ 프로그램의 기계수준 표현 (3) (0) | 2025.04.06 |
|---|---|
| [Computer System] ③ 프로그램의 기계수준 표현 (2) (0) | 2025.04.05 |
| [Computer System] ③ 프로그램의 기계수준 표현 (1) (0) | 2025.04.04 |
| [Computer System] ① 컴퓨터 시스템으로의 여행 (3) (0) | 2025.03.31 |
| [Computer System] ① 컴퓨터 시스템으로의 여행 (1) (0) | 2025.03.14 |