함께 배우는 수업 · 컴퓨터/정보

운영체제 - 프로세스와 스레드

실행 중인 프로그램인 프로세스와 실행 흐름의 최소 단위인 스레드의 메모리 구조(Code/Data/Heap/Stack), 문맥 교환(Context Switching), 동기화와 교착상태(Deadlock)를 학습합니다.

이 수업에서 해 볼 일

  • 프로세스의 격리와 스레드의 공유 자원을 구별한다

먼저 알면 좋은 것: CPU 레지스터(PC, SP)와 명령어 실행 사이클 · 주기억장치(RAM)와 가상 메모리 주소 공간 개념 · 동시성(Concurrency)과 병렬성(Parallelism)의 기초

오늘의 목표

가입 없이 시작할 수 있어요. 설명을 읽고, 함께 연습한 뒤, 처음 보는 문제에서 직접 확인합니다.

판단 과정과 비교 사례

프로세스는 자원과 주소 공간의 경계이고, 스레드는 그 안에서 실행되는 흐름이다. 같은 프로세스의 스레드는 힙과 전역 데이터를 공유하지만 각자의 스택과 실행 위치를 가진다.공유 변수 증가를 읽기→더하기→쓰기로 나누면 두 스레드가 같은 옛 값을 읽어 갱신을 덮어쓸 수 있음을 알 수 있다. 원자 연산이나 잠금이 필요한 이유다.경쟁 상태, 교착상태, 문맥 교환을 구별하자. 잘못된 동시 접근, 서로 기다리는 고리, 실행 주체 전환은 각각 다른 현상이므로 해결책도 다르다.

1. 프로세스(Process)와 스레드(Thread)의 메모리 구조 비교

- 프로세스 (Process): 보조기억장치에 저장된 정적인 프로그램(실행 파일)이 메모리에 적재되어 운영체제(OS)로부터 시스템 자원을 할당받아 실행 중인 상태입니다. 각 프로세스는 독립된 4개의 가상 메모리 영역을 가집니다: 1. Code (Text) 영역: 실행할 프로그램의 기계어 코드가 저장되는 읽기 전용 영역. 2. Data 영역: 전역 변수(Global)와 정적 변수(Static)가 저장되며 프로그램 시작 시 할당되어 종료 시 소멸. 3. Heap 영역: 프로그래머가 런타임에 동적으로 할당(malloc, new, 객체 생성)하는 영역. 4. Stack 영역: 함수 호출 시 생성되는 지역 변수, 매개변수, 복귀 주소가 저장되는 영역. - 스레드 (Thread): 프로세스 내부에서 CPU 스케줄링의 기본 단위가 되는 실행 흐름입니다. - 같은 프로세스 내의 스레드들은 Code, Data, Heap 영역을 서로 공유하고, 함수 호출 흐름이 각자 다르므로 오직 Stack 영역과 PC(Program Counter)를 포함한 레지스터 집합만 독립적으로 소유합니다.기술 면접 1순위 질문: '스레드끼리 공유하는 자원과 독립적으로 가지는 자원은?' -> Code, Data, Heap 영역은 공유하고, 각 스레드의 함수 호출 기록인 Stack 영역과 PC 레지스터는 독립적으로 가집니다!

2. 문맥 교환(Context Switching)과 교착상태(Deadlock) 4대 조건

- PCB (Process Control Block)와 문맥 교환: - 운영체제는 각 프로세스를 관리하기 위해 프로세스 ID(PID), 상태(Ready, Running, Waiting), PC 및 레지스터 값, 메모리 관리 정보를 담은 PCB를 커널 영역에 유지합니다. - 문맥 교환(Context Switching): 인터럽트나 타임 슬라이스 만료로 CPU를 다른 프로세스에 넘길 때, 기존 프로세스의 레지스터 상태를 PCB에 저장하고 새 프로세스의 PCB를 CPU에 복원하는 과정입니다. 스레드 간 문맥 교환은 공유 메모리(Code/Data/Heap)와 TLB 캐시를 비울 필요가 없어 프로세스 간 문맥 교환보다 훨씬 빠릅니다. - 교착상태 (Deadlock, 데드락): 두 개 이상의 프로세스나 스레드가 서로 상대방이 점유한 자원을 무한정 기다리며 멈춰버리는 현상입니다. 아래 4가지 조건이 동시에 모두 성립할 때만 발생합니다: 1. 상호 배제 (Mutual Exclusion): 한 번에 하나의 프로세스만 해당 자원을 사용할 수 있음. 2. 점유와 대기 (Hold and Wait): 최소 하나의 자원을 보유한 채로 다른 프로세스의 자원을 추가로 기다림. 3. 비선점 (No Preemption): 다른 프로세스가 사용 중인 자원을 강제로 빼앗을 수 없음. 4. 순환 대기 (Circular Wait): 자원 대기 관계가 P1→P2→⋯→P1P_1 \rightarrow P_2 \rightarrow \dots \rightarrow P_1 형태의 닫힌 원형 고리를 이룸.

예제로 살펴보기

두 스레드 T1과 T2가 공유 변수 count(초기값 0)에 대해 동시에 count = count + 1을 각각 10,000번씩 실행했을 때 결과가 20,000보다 작게 나오는 이유(경쟁 상태)와 해결 방법을 설명하시오.
  1. 1) 원인 (경쟁 상태, Race Condition): count = count + 1은 고급 언어에서는 한 줄이지만, 실제 CPU 기계어로는 ① 메모리에서 count 값을 레지스터로 읽기(LOAD) ② 레지스터 값에 1 더하기(ADD) ③ 결과를 메모리에 쓰기(STORE)의 3단계로 나뉩니다. 만약 T1이 0을 읽어 1을 만든 직후 아직 메모리에 쓰기 전에 문맥 교환이 일어나 T2도 메모리에서 여전히 0을 읽어가면, 두 스레드 모두 1을 덮어쓰게 되어 덧셈 한 번이 증발합니다. 2) 해결 방법 (동기화, Synchronization): 공유 자원에 접근하는 코드 구간을 임계 구역(Critical Section)으로 지정하고, 뮤텍스(Mutex Lock), 세마포어(Semaphore), 또는 원자적 연산(Atomic CAS)을 적용해 한 번에 하나의 스레드만 진입하도록 상호 배제를 보장해야 합니다.
확인: 프로세스는 독립된 메모리 공간(Code, Data, Heap, Stack)을 가지며, 스레드는 Stack과 PC만 독립적으로 갖고 나머지를 공유한다.

3. CPU 스케줄링 알고리즘과 멀티스레드 동기화 실무

- 주요 CPU 스케줄링 알고리즘: - 비선점형: FCFS(먼저 온 순서대로 처리, 긴 작업 뒤에 짧은 작업이 밀리는 호위 효과 Convoy Effect 발생), SJF(실행 시간이 가장 짧은 작업 우선, 평균 대기 시간은 최소이나 긴 작업의 기아 현상 Starvation 발생). - 선점형: Round Robin (RR)(모든 프로세스에 동일한 시간 할당량 Time Quantum을 부여하고 순환, 시분할 시스템의 표준), 다단계 피드백 큐(MLFQ). - 뮤텍스(Mutex) vs 세마포어(Semaphore): - 뮤텍스: Key(Lock)를 가진 오직 1개의 스레드만 임계 구역에 들어갈 수 있으며, 락을 건 당사자만 락을 해제할 수 있습니다. - 세마포어: 정수형 카운터 변수(SS)를 두어 최대 SS개의 스레드가 동시에 공유 자원에 접근하는 것을 허용합니다 (예: DB 커넥션 풀 최대 10개 제한).실무에서 데드락(Deadlock)을 가장 효과적으로 예방하는 방법은 4대 조건 중 '순환 대기(Circular Wait)'를 깨뜨리는 것입니다. 모든 자원에 고유 번호를 매기고 항상 오름차순으로만 Lock을 획득하도록 강제하면 데드락이 절대 발생하지 않습니다.

참고 근거와 확인 범위

설명·예제·문제 구성 및 오류 수정 책임: 프리런. 위 자료는 표시한 주제를 확인하거나 더 읽기 위한 근거이며, 외부 기관의 공식 수업이나 감수본을 뜻하지 않습니다.

참고 자료 연결 점검: 2026-11-02. 제작 방식·검수 범위와 수정 기록에서 확인 범위를 볼 수 있습니다. 오류는 상단의 의견 보내기 또는 contact@freelearn.io로 알려 주세요.

이 단원의 개념서 읽기 →