정말 무슨말이지 ? 읽어도 대체 뭔소린지 이해하기가 어려웠다. 정말 와우띵이다.
GPT와 함께 학습해보았다.
가장 중요 포인트는
✅ CPU는 한 번에 처리할 수 있는 쓰레드 수는 제한되어 있지만,
✅ 운영체제가 “아주 빠르게 왔다 갔다” 하면서 수백 개를 “동시에 실행되는 것처럼” 보이게 해준다.
→ 이게 바로 “문맥 전환(context switch)” + “동시성(concurrency)”
- 프로세스 - 독자적인 메모리를 가지고 있는 메모리 할당이된 CPU가 처리하는 1개의 프로그램
- 인스트럭션 - CPU가 수행하는 명령의 집합
- 쓰레드 : 프로세스 내부의 작업 흐름 (코드 실행 단위)
예시)
• 프로세스: 식당 (독립된 공간=메모리 를 가진 프로그램)
• 쓰레드: 요리사 (일을 처리해내는 주체)
• 인스트럭션: 칼질, 설거지, 서빙.. (실제 처리하는 업무)
👉 운영체제(OS)가 요리사(쓰레드)에게
“이 식당에서 0.001초만 일해보고”,
“이제 저기 가서 또 0.001초만 일해줘”
이렇게 계속 명령을 내려서 빠르게 식당(프로세스)를 옮기게 한다.
🧑🍳 요리사(CPU 쓰레드)가 식당 A에 잠깐 들어감
OS가 말해: “너한테 10m/s 줄게. 그 시간 안에 할 수 있는 만큼 해봐!”
직원은 그 시간 동안 요리를 여러 동작(인스트럭션)으로 막 처리한다.
시간이 끝나면 “땡! 다음 식당 가!” → 문맥 전환!
✔ 그러니까 명령어 한 개가 아니라, 짧은 시간 동안 처리 가능한 만큼을 실행하고 나온다.
❓ 프로세스마다 쓰레드가 꼭 있어야 해?
➡ 맞아! 프로세스는 최소 1개의 쓰레드를 반드시 가짐
• 그 1개의 기본 쓰레드를 “메인 쓰레드(main thread)“라고 해
• 프로세스가 실행된다는 건 곧 → 쓰레드가 명령을 실행하고 있다는 뜻
동시성 Concurrency - 하나 이상의 작업이 모두 다 조금씩 진행 (싱글코어,멀티코어 가능)
병렬성 Parallelism - 완전히 동시에 실행 (멀티코어에서 가능)
동시성은 코어 1개여도 쪼금씩 나눠서 약간 쫌쫌따리로 일이 진행되고,
병렬성은 시간적으로 정말 동시에 실행되는 것이다.
그러니까 병렬성이면 무조건 동시성을 갖춘거고, 동시성이 있다고 해서 병렬성이 있는건 아니다.
1. 인스트럭션 수준 병렬성 (ILP: Instruction-Level Parallelism)
• 하나의 인스트럭션안에서, 실행 조건들을 동시에 실행할 수 있다는 뜻.
• 프로세서가 2.4개 인스트럭션 실행할 수 있는데, 여러가지 교묘한 기법을 사용해서 한번에 백번의 인스트럭션까지 수행할 수 있는데, 파이프라이닝을 통해 가능하다.
2. 싱글 인스트럭션 다중 데이터 (SIMD: Single Instruction Multiple Data)
• 하나의 명령어가 여러 데이터에 대해 동시에 같은 연산을 수행한다는 뜻.
• 예를 들어, 벡터(배열) 형태의 데이터에 같은 연산(더하기, 곱하기 등)을 한꺼번에 적용.
예시)
• 주스 가게에서 100개의 오렌지를 한 번에 즙을 낼 수 있는 기계가 있다.
• “오렌지를 짜는” 동작(명령어)은 하나이지만, 100개의 오렌지를 동시에(데이터가 많음) 처리.
추상화(abstraction) : 복잡한 내부 구조나 동작 원리를 숨기고, 겉으로 드러나는 인터페이스만 간단하게 정의하는 것.
우리가 전자레인지의 내부 회로를 전혀 몰라도, 버튼만 누르면 음식이 데워지는 기능을 사용할 수 있는 것처럼!
1) 파일은 입출력 장치의 추상화다.
“파일은 입출력장치의 추상화” 라는 말은,
운영체제가 다양한 I/O 장치를 “파일”이라는 단일한 인터페이스로 다루도록 설계했기 때문에,
우리는 파일을 다루는 방식(read/write/open/close) 그대로 장치를 다룰 수 있다는 뜻.
• 유닉스(리눅스, macOS 등)에서는 키보드, 모니터, 네트워크 소켓, 심지어 특정 프로세스와의 파이프 조차도 파일로 취급한다.
• 예: /dev/tty (터미널 장치), /dev/sda (디스크), /dev/null (가상장치) …
이 모두가 “파일” 형태의 경로와 핸들을 가지며, read(), write() 같은 함수로 입출력을 할 수 있다.
2) 가상메모리는 메인메모리와 디스크의 추상화다.
가상 메모리(Virtual Memory)란?
• 가상 메모리는, 운영체제가 물리 메모리(주 메모리)와 디스크를 조합해 프로세스마다 커다란 주소 공간을 제공하는 기술.
• 프로세스(프로그램)가 보기에, 마치 굉장히 큰 메인 메모리를 쓰는 것처럼 느껴지게 해준다.
어떻게 추상화가 이뤄지나?
1. 하드웨어(물리 메모리)의 제한
• 실제 메모리(RAM)는 용량이 한정돼 있고, 여러 프로그램이 동시에 메모리를 나눠써야 함
2. 디스크를 ‘확장’으로 사용
• 운영체제는 잘 사용하지 않는 메모리 영역을 디스크로 옮겨두거나, 필요한 순간에 다시 RAM으로 가져오는 방식을 씀 (페이지 교체 알고리즘 등)
3. 프로세스 입장
• 자기가 쓰는 메모리가 디스크에 있는지, 실제 RAM에 올라와 있는지 전혀 알 필요 없음
• 운영체제가 “필요한 페이지를 적절히 RAM에 올려 주는” 작업을 해주기 때문
즉,
“가상 메모리는 (한정된) 메인 메모리와 (상대적으로 큰) 디스크를 통합해서,
프로그램이 (거의) 무제한의 메모리를 가진 것처럼 보이게 만들어주는 추상화”
이렇게 추상화 덕분에,
개발자는 “내 프로그램이 어디까지 RAM에 올라왔을까?” 라는 걱정을 할 필요 없이,
메모리를 넉넉하게 쓰는 것처럼 코드를 작성할 수 있는 것.
3) 프로세스는 프로세서, 메인 메모리, 입출력 장치의 추상화다.
1. 프로세스(Process)는 프로그램의 ‘실행 단위’
• 프로그램(코드) 그 자체는 단순한 파일=정적 상태이고,
• 프로세스는 프로그램이 실행되고 있는 동적 상태를 말한다.
실제 CPU를 할당받아 코드가 돌아가고, 메모리를 점유하고, I/O를 하는 주체가 바로 프로세스인 것.
예시)
우리가 웹 브라우저와 텍스트 에디터, 음악 플레이어를 동시에 실행한다면
• 실제 하드웨어는 CPU 한두 개, RAM도 제한된 몇 GB, 오디오 출력, 디스크가 전부다.
• 그런데 각 프로그램은 “나 혼자 CPU 쓰는 것처럼, 내가 원하는 메모리를 다 쓰는 것처럼, 원하는 I/O(사운드·파일 등)를 막 쓰는 것처럼” 보임.
• 내부적으로는 운영체제가, 아래처럼 할당해주는 것.
CPU 스케줄링: 웹 브라우저 10ms → 텍스트 에디터 10ms → 음악 플레이어 10ms …
• 메모리 관리: 잘 사용하지 않는 페이지를 디스크로 옮겨두고, 필요한 순간에 다시 로드.
• I/O 관리: 오디오 장치도 다중 접근이 가능하도록 버퍼를 관리하거나, 파일 핸들을 분배.
컴퓨터시스템 관점에서,
운영체제(Operating System) 는 이런 “추상화” 계층을 제공함으로써
개발자나 프로그램이 하드웨어 세부 사항을 신경 쓰지 않고 편하게 코딩할 수 있게 해주는 것이다 !
추가 궁금증!
✅ 1. CPU에 “쓰레드 수”가 정해져 있을까?
➔ “물리적인 쓰레드 수”는 정해져 있다.
• CPU = 코어들의 집합
• 각 코어마다 1개 또는 2개 쓰레드를 처리할 수 있음.
✅ 2. OS는 “전체 쓰레드 풀”이 있는 게 아니다.
❌ 프로세스가 공통 쓰레드 풀에서 가져다 쓰는 구조는 아님!
• 프로세스가 실행되면 → 프로세스가 쓰레드를 스스로 생성하여
• 이 쓰레드들은 운영체제(OS)에 의해 CPU에 배정됨.
• OS는 “스케줄러”를 통해 CPU가 처리할 수 있도록 쓰레드들을 큐에 넣고 번갈아 실행시킴
여기서 이 큐를 Ready Queue 라고 함.
✅ 3. 코어 1개당 멀티 쓰레드가 가능한 이유?
➔ 하이퍼쓰레딩 덕분에 코어 하나가 두 개의 쓰레드를 처리할 수 있다.
'개발 공부 > 컴퓨터시스템 (CSAPP)' 카테고리의 다른 글
7주차_키워드 정리 (가상메모리, 페이징, 단편화, DMA, malloc) (0) | 2025.05.01 |
---|---|
8장 예외적인 제어흐름 (Exceptional Control Flow) (0) | 2025.04.23 |
7장 링커 (0) | 2025.04.22 |
1. 컴퓨터 시스템으로의 여행 [1.4~1.7] (0) | 2025.03.15 |
1. 컴퓨터 시스템으로의 여행 [1.1~1.3] (0) | 2025.03.14 |