인프런 - 널널한 개발자님의 [넓고 얕게 외워서 컴공 전공자 되기] 강의를 수강하며 구글링과 함께 정리한 내용입니다😀
별도로 결제하지 않더라도 유튜브에 비~슷~한 내용으로 올라와 있으니 참고하세요!
IT 기술 용어 중에는 개념어들이 정말 많다!
이런 개념어를 간단하지만 정확하게 알고가자
동시성과 병렬성
1) 동시성(Concurrency)
여러 가지 일이 동시에 진행되는 것
- 굉장히 빠른 작업 전환(Context Switching)을 통해 여러 작업이 동시에 실행되는 것처럼 보이도록 하는 것
2) 병렬성(Parallelism)
같은 일을 여러 주체가 함께 동시에 진행하는 것
- 멀티코어 CPU 또는 여러 대의 서버를 활용하여 동시에 연산을 수행하는 것
조금 더 깊게 들어가자면?
(참고 : https://yozm.wishket.com/magazine/detail/2996/ )
1) 동시성
- 실제로 CPU는 한 시점에 하나의 작업만 처리하지만, 작업 전환 덕분에 여러 작업이 동시에 실행되는 것처럼 보인다.
- I/O 작업(파일 다운로드, 네트워크 요청 등)이 많은 환경에서 효과적이다.
- 관련개념
- 👉 스레드(Thread)
- 한 프로세스 안에 여러 실행 흐름을 만들 수 있고, 번갈아 실행되지만 동시에 돌아가는 것처럼 동작한다.
- 스레드가 많아질수록 공유 자원 이용 시 충돌이 일어날수 있으므로 적절한 조율 (ex; 데이터 접근 순서 정하기 등) 이 필요하다.
- 👉 Async I/O
- 오래 걸리는 I/O 작업을 미리 요청해둔 뒤에, 그 대기 시간 동안 CPU가 다른 일을 처리하도록 하는 방식
- 싱글 스레드 환경에서도 비동기 I/O를 통해 동시성을 높일 수 있어 대규모 시스템에서 효과적이다
- 👉 스레드(Thread)
2) 병렬성
- 여러 개의 CPU 코어나 여러 대의 서버가 실제로 동시에 연산을 수행한다.
→ - 처리속도가 크게 향상되는 것이기 때문에, 연산량이 클수록 병렬 처리의 효과가 크다.
- 관련 개념
- 👉 멀티 프로세싱(Multi-Processing)
- 하나의 컴퓨터에서 여러 프로세스를 동시에 실행하는 방식이다.
- 프로세스마다 독립된 메모리를 사용하기 때문에 충돌 위험 적고 관리가 단순하다.
- 다만, 프로세스 간 데이터를 주고받으려면 통신 비용(IPC)이 발생한다.
- 멀티코어 CPU에서는 운영체제가 각 프로세스를 코어별로 배치하여 실제 병렬 연산이 가능하다
(즉, OS가 밥 담당, 빨래 담당, 청소 담당, 설거지 담당 각각 따로 사람을 배치 해준다)
- 👉 분산 시스템
- 여러 서버를 네트워크로 연결해 작업을 나눠 처리하는 것이다.
- CPU 코어가 많을수록 대규모 연산 처리 속도가 증가한다.
- 다만 하드웨어 자원이 충분히 뒷받침되어야 하고, 병렬 처리를 위해서는 로직 수정이나 데이터 구조 재설계가 필요한 경우가 많다.
(통신 오버헤드, 데이터 분할/통합, 동기화 문제 등)
- 👉 멀티 프로세싱(Multi-Processing)
병렬성과 멀티스레드의 중요한 관계
▷ 멀티스레드 프로그래밍이더라도, OS 수준에서 멀티코어를 사용한다면 병렬성을 만족할 수도 있다.
- 병렬성의 핵심: 코어를 동시에 여러 개 돌릴 수 있느냐가 관건
- 멀티스레드 + 멀티코어: OS가 여러 스레드를 서로 다른 CPU 코어에 배정하면, 각 스레드가 물리적으로 동시에 실행되어 진정한 병렬 처리가 가능
- 멀티스레드 + 싱글코어: 하나의 코어에서 스레드들이 번갈아 실행되므로 동시성만 제공 (병렬성 X)
예시
4코어 CPU + 4개 스레드
→ OS가 각 스레드를 다른 코어에 배정
→ 4개 스레드가 물리적으로 동시 실행 (병렬성 ✓)
1코어 CPU + 4개 스레드
→ 하나의 코어에서 4개 스레드가 시분할로 실행
→ 동시에 보이지만 실제로는 순차 실행 (동시성만 ✓)
따라서 멀티스레드 프로그래밍을 할 때는 하드웨어 환경(코어 수)와 OS의 스케줄링을 함께 고려해야 진정한 병렬성의 이점을 얻을 수 있다.
원자성, 동기화 그리고 교착상태
1) 원자성
내가 쓰는 동안 아무도 끼어들 수 없게 하는 것
- 동시성을 얘기할 때 항상 따라오는 개념이다.
→ 동시성은 여러가지 일을 처리하되, 서로 간섭 없이 진행되는 것을 말한다. - 하지만 두 작업(A와 B)이 같은 리소스에 동시에 접근하고 먼저 선점하려고 노력한다면, 충돌이 발생할 수 있다.
- 원자성은 Lock을 건 순간부터 Unlock할 때까지 해당 자원을 다른 실행 흐름이 건드리지 못하게 보장하는 성질이다.
예시 (회의실 예약)
1) 회의를 하기 위해서 회의실이 필요하다.
2) 회의실로 간다.
3) 회의실을 사용 중인 사람이 있는지 확인한다.
4) 비어있으면 회의실에 들어간 후 문을 잠근다(Lock).
5) 회의를 한다.
6) 회의실을 나온다(Unlock).
여기서 가장 중요한 것은 3번과 4번 과정이다.
사용여부 확인 → 문 잠금 구간이 다른 사람이 사용할 수 없도록 보장되는 부분이며, 이 구간이 원자성이 보장되는 임계 구역이다.
2) 동기화
차례로 사용할 수 있도록 순서를 맞춰주는 것
※ 데이터 원본과 복제본의 데이터를 맞추는 동기화와는 다른 개념이다!
- 여러 실행 흐름이 공유 자원에 접근하는 순서 또는 타이밍 등을 제어한다.
(사거리나 교차로 같은 곳에서 신호등이 차들이 안전하게 지나가도록 통제하는 것을 생각하면 된다) - OS에서는 판별장치(잠금장치)를 제공하여, 동시에 접근하지 않도록 한다.
3) 교착상태(DeadLock)
필요한 자원이 풀리기를 기다리지만, 그 조건이 충족되지 않아 영원히 멈춰버린 상태
- 둘 이상의 실행 흐름들이 필요한 자원을 얻지 못해 무한 대기 상태에 빠지는 현상
- 자원 간 의존 관계가 있을 수도 있고, 단일 자원 고갈로 인해 발생할 수도 있다.
- 전형적인 발생 조건
- 상호 배제(Mutual Exclusion) : 자원은 동시에 하나만 사용할 수 있음
- 점유 대기(Hold and Wait) : 자원을 점유한 채 다른 자원을 기다림
- 비선점(Non-preemption) : 점유 중인 자원을 강제로 빼앗을 수 없음
- 순환 대기(Circular Wait) : 실행 흐름들이 원형으로 자원을 기다림
예시 1 (순환 대기)
1) 운전자 A는 주차 자리에 이미 차를 세웠는데, 출구 방향 도로가 필요하다.
2) 운전자 B는 출구 방향 도로에 이미 차를 대고 있는데, A의 주차 자리가 필요하다.
3) A와 B 모두 상대방이 자리를 비워주기를 기다린다.
4) 서로가 필요한 자원을 상대방이 점유한 상태라, 둘 다 움직이지 못한다.
예시 2 (순환 대기 없는 교착상태)
1) 회사에 회의실이 한 개뿐이다.
2) 여러 팀이 예약을 기다리지만, 첫 번째 팀이 회의를 계속 연장한다.
3) 다른 팀들은 계속 기다리지만, 회의실이 비지 않는다.
4) 회의실이 풀리지 않아 모든 팀이 대기 상태에 빠진다.
교착 상태는 주로 자원 할당 순서 문제나 논리 설계 오류에서 발생한다.
컴퓨터의 구성요소
Computer = H/W + S/W
👉 S/W = Application + System(OS)
즉, Computer = H/W + App + System
System의 프로그램, 프로세스, 스레드
1) 프로그램(Program)
- 컴퓨터에 설치된 실행 파일
- 아직 실행되지 않은 상태
- ex) Windows의 Excel.exe, Chrome.exe 등
2) 프로세스(Process)
- 설치된 프로그램을 실행하면 생성(프로그램을 실행하면 운영체제가 프로세스로 만들어준다.)
- 모든 프로세스는 고유한 ID(=PID)를 갖는다.
- 운영체제는 프로세스에게 메모리 등의 자원을 할당한다
3) 스레드(Thread)
- 프로세스 안에서 실제로 일하는 작업 단위
- 실제로 CPU를 사용해서 연산을 수행한다.
- 프로세스 안에 여러 개가 있을 수 있다.
- 같은 프로세스 내 스레드들끼리 프로세스에 할당된 자원(메모리)을 공유한다.
아파트로 이해하는 메모리 구조
프로세스를 아파트 한 채라고 생각해보자!
메모리 공간 구분
- Heap (거실): 아파트 전체가 공유하는 공간
- Stack (개인방): 각 스레드(가족구성원)가 개별로 사용하는 공간
예시 (4개의 스레드가 있는 프로세스라면?)
- 거실(Heap)은 프로세스 전체가 사용(모두가 공유)
- 개인방(Stack) 4개의 스레드가 각자 사용(총 4개의 Stack이 생성)
💡이렇게 공간을 나누는 이유는?
거실에서 샤워를 해도 되고 방에서 요리를 해도 되지만........ 적절한 곳에서 적절한 일을 하도록 구분하기 위함이다.
즉, 각 스레드가 독립적인 Stack을 가지면 함수 호출 시 데이터 충돌이 발생하지 않고, 공유가 필요한 데이터는 Heap에서 관리하여 효율적인 메모리 사용이 가능하다.
Shell
컴퓨터 세계의 내 캐릭터
- 컴퓨터에 접속하는 것은 게임세계에서 로그인하는 것과 같다.
- 로그인하면 생성되는 내 캐릭터 = Shell
- 게임에서 캐릭터를 통해 게임세계와 상호작용하듯, Shell을 통해 컴퓨터와 상호작용한다.
- 파일을 열고, 프로그램을 실행하고, 시스템을 조작하는 모든 작업이 "캐릭터"를 통해 수행된다.
참고) 개발자들이 자주 사용하는 터미널의 명령어 Shell(bash, PowerShell 등)은 별도로 실행하는 도구이다.
운영체제의 보안 관리
- 프로세스 간 메모리 침입 차단
- 프로세스가 다른 프로세스의 메모리 공간을 침입하려 하면 운영체제가 즉시 차단한다.
- 침입 시도 시 → OS가 해당 프로세스를 강제 종료
- 우리가 흔히 말하는 "프로그램이 죽었다" = 연산을 하지 못하도록 OS가 위험한 행위를 막은 것
- Debugger
- 일반적으로 하나의 프로세스는 다른 프로세스 메모리 접근 불가하지만, Debugger는 다른 프로세스의 메모리를 검사할 수 있다.
- 경찰이 영장을 받고 수색하는 것과 같은 개념이라고 보면 쉽다.
- Kernel
- 운영체제의 핵심
- 운영체제의 가장 중요한 부분으로, 접근 통제 역할을 담당한다.
User mode와 Kernel mode 그리고 가상화
운영체제의 핵심 Kernel
- 컴퓨터 시스템의 모든 기본적인 일들을 담당한다.
- Kernel 영역과 사용자 영역은 마치 정부 청사와 일반 시민 구역처럼 완전히 분리되어 있어서, 일반 프로그램들이 시스템을 함부로 건드릴 수 없게 보호한다.
Kernel의 주요 역할
- I/O 제어
- 자원 관리 : 어떤 프로세스가 언제 CPU를 사용할지, 메모리를 얼마나 쓰고 배분할지 등
- 접근 통제 : 중요한 시스템 파일이나 다른 프로그램의 메모리에 함부로 접근하지 못하도록 제어
하드웨어와 소프트웨어 그리고 Platform
하드웨어
- 물리적으로 만질 수 있는 부품들이며, 가장 핵심은 CPU이다.
소프트웨어
- 눈에 보이지 않는 논리적인 것들(프로그램, 데이터 등)이다.
- IT에서는 이런 논리적(Logical)이라는 표현을 "Virtual"이라는 말과 거의 동일하게 사용한다.
Platform
- 소프트웨어에서 Kernel Mode까지를 OS 영역이라고 부르며, 하드웨어에 OS는 의존적이어서 붙여진 용어가 Platform이다.
- 즉, 하드웨어도 Platform이고 Kernel Mode도 Platform이라고 볼 수 있다.
- 64bit 플랫폼이라고 하면 CPU도 64bit, 운영체제도 64bit를 의미한다.
→ 32bit 프로그램은 64bit 시스템에서 돌아가지만, 64bit 프로그램은 32bit 시스템에서 안 돌아가는 이유다.
User Mode vs Kernel Mode
컴퓨터는 두 가지 모드로 동작한다.
Kernel Mode (커널 모드)
- 운영체제가 실행되는 공간이다.(따라서 커널 영역에서 실행된다는 것은, 운영체제의 일부라고 볼 수 있다)
- 모든 권한을 가지고 있어서 하드웨어를 직접 제어할 수 있고 시스템의 모든 부분에 접근 가능하다.
- 예외적으로 백신 프로그램이나 인터넷뱅킹 보안 프로그램 같은 것들은 보안상 커널 모드에서 동작하기도 한다.
User Mode (사용자 모드)
- 우리가 평소에 쓰는 프로그램들(브라우저, 게임, 메모장 등)이 실행되는 공간이다.
- 제한된 권한만 가지고 있어서 시스템을 망가뜨릴 수 없고, 하드웨어에 직접 접근할 수 없다.
Device Driver와 File System
Device Driver
- 메인보드에 장착할 수 있는 하드웨어 장치가 있을 때, 어떤 OS든 이 장치를 움직이기 위한 전용 소프트웨어가 필요하다.
- 이것을 Device Driver라고 하며, 커널모드에서 작동하는 소프트웨어다.
- 이 장치가 뭘 하는 장치냐에 따라서 운영체제 커널의 구성요소가 달라진다.
커널 구성요소 예시
Hello World를 출력한다고 하면, 모니터 화면에 출력하기 위해 모니터를 제어하는 본체와 연결된 장치(보통 비디오 카드)를 제어해야 한다. 이때 커널의 구성요소인 커널 모드 요소에는 그래픽 엔진이라고 부르는 핵심적인 역할을 하는 SW가 있다.
※ SW에서 무슨 엔진이라고 하면 코어 역할을 하는 중요한 프로그램이라는 비유적인 표현이다.
1. 프로그램(User Mode 프로세스)이 시스템 호출을 통해 커널에게 요청한다
→ 프로그램이 Device File(디바이스 파일)에 "Hello World!" 문자열을 Write한다
→ 이때 화면 출력을 위한 특별한 디바이스 파일(예: /dev/stdout)에 접근한다
2. 커널이 요청을 받고 내부 처리를 한다
→ 커널의 그래픽 엔진(Kernel Mode의 핵심 구성요소)이 문자열 데이터를 처리한다
→ 문자를 화면에 표시하기 위한 그래픽 명령으로 변환한다
3. 커널이 그래픽 드라이버에게 지시한다
→ 그래픽 엔진이 비디오 카드용 Device Driver에게 구체적인 하드웨어 제어 명령을 전달한다
→ 드라이버는 해당 하드웨어(비디오 카드)가 이해할 수 있는 신호로 변환한다
4. 그래픽카드가 화면에 글자를 표시한다
→ 비디오 카드가 HDMI 케이블을 통해 모니터에 신호를 보낸다
→ 최종적으로 모니터 화면에 "Hello World!"가 출력된다
User Mode와 Kernel Mode 간의 통신
Device File을 통한 인터페이스
- 컴퓨터 시스템에서 사용자는 프로세스의 형태로 존재한다.
- User Mode에서 Kernel Mode로 메시지를 전달하려면 Kernel Mode에서 정해진 방식을 따라야 한다.
- Kernel Mode와 User Mode 영역을 연결하는 인터페이스는 파일의 형태로 제공된다.
- User Mode 프로세스가 Kernel Mode 영역에 접근하기 위해서는 커널에서 제공하는 인터페이스를 사용해야 하며, 이것이 Device File이다. (일반적으로 불리는 파일과는 다르다!)
- Device File은 커널 구성요소에 대한 추상화된 인터페이스를 User Mode에 파일 형태로 제공한 것이다
파일 입출력 동작
- 프로세스는 기본적으로 파일에 대한 입출력 작업을 수행한다.
- 입출력 작업은 읽기(Read), 쓰기(Write), 실행(Execute) 으로 구분된다.
- 사용자가 직접 하드웨어를 제어할 필요 없이, OS가 Device File 접근을 통해 모든 하드웨어 제어를 대신 처리한다.
- Hello World 출력 과정
1. 프로그램(User Mode 프로세스)이 시스템 호출을 통해 커널에게 요청한다
→ 프로그램이 Device File(디바이스 파일)에 "Hello World!" 문자열을 Write한다
→ 이때 화면 출력을 위한 특별한 디바이스 파일에 접근한다
2. 커널이 요청을 받고 내부 처리를 한다
→ 커널의 그래픽 엔진(Kernel Mode의 핵심 구성요소)이 문자열 데이터를 처리한다
→ 문자를 화면에 표시하기 위한 그래픽 명령으로 변환한다
3. 커널이 그래픽 드라이버에게 지시한다
→ 그래픽 엔진이 비디오 카드용 Device Driver에게 구체적인 하드웨어 제어 명령을 전달한다
→ 드라이버는 해당 하드웨어(비디오 카드)가 이해할 수 있는 신호로 변환한다
4. 그래픽카드가 화면에 글자를 표시한다
→ 비디오 카드가 HDMI 케이블을 통해 모니터에 신호를 보낸다
→ 최종적으로 모니터 화면에 "Hello World!"가 출력된다
접근 권한 관리
- 프로세스는 입출력 행위에 대한 주체가 되고 파일이 하나의 대상체가 된다.
- 프로세스는 인터페이스로부터 이 파일에 대한 접근권한을 획득해야 하는데 그 접근권한은 운영체제가 부여한다. 운영체제는 이러한 권한 관리를 통해 시스템 접근을 통제한다.
파일 시스템과 탐색기
파일 시스템
- 하드디스크와 같은 저장장치를 제어하기 위해 Device Driver가 커널모드에서 동작한다.
- 이 Device Driver 위에서 동작하는 커널 구성요소가 파일 시스템이다.
탐색기의 역할
- 파일 시스템의 추상화된 인터페이스를 제공하는 프로그램이 탐색기다.
- 파일 시스템이 관리하는 파일 구조를 시각화하여 GUI 형태로 표시한다.
보안 필터링과 실시간 감시
Filter 시스템
- Kernel mode에 driver와 file system 사이에 filter가 존재한다.
- User mode에 메세지를 보내면 입출력에 대한 행위를 모니터링하다가 바이러스같은 것을 감지하면 V3같은 백신 프로그램에 요청하고 그 파일을 차단한다.
- 이런 filter를 실시간 감시 엔진이라고 불린다.
가상 메모리 소개
범용적인 윈도우같은 OS를 이야기할 때는 가상 메모리에 대하여 이야기하게 된다.

윈도우에서 작업관리자를 키게 되면 페이징풀과 비페이징풀이라는 생소한 용어가 등장하게 된다.
( → 유추해보자면 페이지를 하는 것을 페이징, 안 하는것을 비페이징이라고 하는 것 같다! )
또한 여기서 공통적인 용어 페이지라는 용어도 생소할 것이다.
페이지(Page)란?
: OS에서 RAM처럼 사용하는 하드 디스크 영역이다.
예시로 이해하는 가상 메모리
8GB RAM으로 보통 10개 정도 프로그램을 실행할 수 있다.
→ 그런데 15개 프로그램을 실행하려면?
→ 메모리가 부족할 것 같지만, 실제로는 HDD의 일부 영역을 RAM처럼 활용해서 실행이 가능하다.
→ 속도는 당연히 느려지지만 동작은 한다.
→ 이때 페이지라는 단위로 데이터를 HDD와 RAM 사이에서 이동시키면서 마치 RAM이 더 많은 것처럼 동작시키는 방식이다.
가상 메모리의 동작 과정
크롬 실행 예시
: 크롬을 실행해서 웹 사이트에 접속했다고 보자.
- 크롬을 실행될때 프로세스가 생성되고 OS로부터 메모리를 할당받는다.
- 이때 이 메모리를 VMS(Virtual Memory Space)라고 불린다.
- 메모리 안에 페이지를 공간 조각 단위가 있는데 이 페이지를 따라가면 RAM이 나올 수도 있고 HDD가 나올 수가 있다.
MS Word 동시 실행 시나리오
: 만약 MS Word같은 프로그램이 동시에 실행되고 있다고 보자.
- 똑같이 프로세스가 생성되고 VMS를 할당받는다.
- 그 안에 페이지를 따라갈건데 만약 빠른 작업으로 RAM을 써야하는데 RAM용량이 부족하면
- OS가 기존에 쓰고 있던 RAM의 공간을 HDD로 이동하고 사용하게 된다.
페이지 인/아웃
- 페이지 아웃(Page Out) : 주기억장치에서 보조기억장치로 페이지가 쫓겨나는 것
- 페이지 인(Page In) : 보조기억장치에서 주기억장치로 페이지가 다시 들어오는 것
프로세스 격리와 회수
이렇게 되면 프로세스간에 서로 간섭을 할 필요가 없어지며 만약 프로세스가 어떠한 오류로 죽으면 페이지 조각 및 VMS를 회수하게 된다.
가상 메모리를 사용하는 이유
1) 프로세스 공간 분리 : 각 프로세스 공간을 완벽하게 분리하고 통제할 수 있다.
2) 시스템 안정성 : 프로세스 오류가 운영체제에 까지 영향을 주지 못하도록 차단할 수 있다.
3) 자원 효율성 : 메모리가 부족해도 여러 프로그램들이 작동하는 등 자원을 효율적으로 사용할 수 있다.