1. 운영체제의 큰 그림
- 운영체제 : 응용 프로그램이 하드웨어와 상호 작용할 수 있게 해주는 소프트웨어
- 커널 : 운영체제의 핵심구성요소를 이루는 소프트웨어의 집합
일반적으로 ‘운영체제’라는 용어는 ‘커널’을 지칭
운영체제 덕분에 응용프로그램은 CPU, 메모리, 입출력 장치 등의 하드웨어와 상호작용 가능

운영체제의 핵심 기능 2가지 ⇒ 1. 자원 할당 및 관리 2. 프로세스 및 스레드 관리
- CPU 스케줄링 : 한정된 자원인 CPU를 모든 프로그램에 공정하게 할당하는 순서와 사용시간을 결정하는 것
- 가상 메모리 : 운영체제의 메모리 관리 기법 중 하나로 실제 물리적인 메모리보다 더 큰 메모리를 이용하도록 함.
- 프로세스(process) - 실행 중인 프로그램을 말한다.
- 스레드(thread) - 프로세스를 이루는 실행의 단위. 스레드가 프로세스 내에서 둘 이상인 경우 동시작업 가능
- 메모리에는 여러 프로세스가 적재될 수 있음.
- 운영체제가 프로세스에 필요한 자원을 할당 (데이터나 하드웨어 부품, CPU같은 것)
- 스레드는 프로세스가 할당받은 자원을 이용해 프로세스의 작업을 수행
운영체제는 사용자 응용프로그램과 달리 커널 영역이라고 하는 메모리 공간에 적재되어 실행된다.
커널 영역 외에 응용 프로그램이 적재되는 공간은 사용자 영역이라고 한다.

⇒ 운영체제의 기능을 제공받기 위해서는 커널 영역에 적재된 운영체제 코드를 실행해야 하는데, 코드를 실행하기 위해서 시스템 콜 이라는 함수 형태의 인터페이스를 호출하게 된다.
시스템 콜의 종류

컴퓨터 내부에서의 시스템 콜 호출 예시 (프로세스 종료 함수 - kill)
스프링부트 애플리케이션을 실행 → 일반적으로 8080포트에서 실행 → lsof -i :8080 명령어를 터미널에 입력하여 실행중인 스프링 프로그램 및 pid를 확인 → kill -9 pid 로 스프링을 종료 → 인텔리제이 IDE에서 확인 가능


위처럼 시스템 콜이 호출될 때 수행되는 작업 순서
- 소프트웨어 인터럽트 발생 (자원에 접근하는 입출력 명령어, 즉 시스템 콜도 소프트웨어 인터럽트임)
- 사용자 영역에서 프로세스가 실행되던 중 시스템 콜이 호출되면 CPU는 현재 작업을 백업함.
- CPU의 커널 모드 전환 & 운영체제 코드 실행
- 발생한 인터럽트를 처리하기 위한 운영체제 코드(시스템 콜)를 실행
- 사용자 모드로 재전환
- 사용자 영역의 코드 실행을 재개
이렇게 사용자 모드와 커널 모드로 구분하여 실행하는 것을 이중 모드라고 한다.
2. 프로세스와 스레드
사용자 영역에는 실행 중인 프로세스가 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장된다.
- 코드 영역
- 실행 가능한 명령어가 저장되는 공간으로, 텍스트 영역으로도 불린다. - 데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 정적 변수, 전역 변수 (Ex. static으로 선언된 변수나 메소드) - 힙 영역
- (프로그래머)사용자가 직접 할당 가능한 저장 공간으로, 힙 영역에 공간을 할당했다면 언젠가는 해당 공간을 꼭 반환해야 함.
- 가비지 컬렉션 → 사용되지 않는 힙 메모리를 해제하는 기능도 있다. (프로그래밍 언어에서 자체적으로 제공) - 스택 영역
- 데이터 영역에 담기는 값과는 달리 일시적으로 사용할 값들이 저장되는 공간.
- 매개변수, 지역변수, 함수 복귀 주소 등 (Ex. 메소드 내부에서 선언된 int 형 변수)
- 스택 트레이스 - 특정 시점에 스택 영역에 저장된 함수 호출 정보로 문제의 발생 지점을 추적할 수 있다.

- 프로세스 제어 블록(PCB) : 운영체제가 메모리에 적재된 프로세스들을 식별할 수 있는 정보. 이 정보는 운영체제가 접근 가능한 커널 영역 내에 존재하는데, 이것이 PCB이다.
- 프로세스와 관련된 다양한 정보를 내포하며 새로운 프로세스가 생성(메모리에 적재)되었을 때 커널 영역에 만들어지고 프로세스 실행이 끝나면 폐기된다.
- PCB는 일종의 ‘구조체’ 인데, 구조체란 서로 다른 자료형을 묶어서 활용하는 또 다른 복합 자료형이다.
- 프로세스 테이블 : 여러 PCB들을 커널 내에서 테이블 형태로 관리함.
- 프로세스가 새롭게 실행됨
- 해당 프로세스의 PCB가 생성됨
- PCB를 프로세스 테이블에 추가하고, 필요한 자원을 할당
- 종료되는 프로세스가 있다면 자원을 해제하고 PCB도 테이블에서 삭제
- 타이머 인터럽트 : 프로세스들이 CPU를 할당 받아 사용할 수 있는 시간을 제한해야 하는데, 이 때 사용되는 인터럽트. 타임아웃 인터럽트 라고도 부른다.
- 문맥 : 각 프로세스는 타이머 인터럽트가 발생하여 CPU할당을 서로 양보하게 된다. 이 때 대기하고 있던 프로세스의 수행을 재개하기 위해 기억해야 할 정보
- 문맥 교환 : 프로세스의 A의 문맥을 PCB에 백업하고, 프로세스 B의 PCB에서 문맥을 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다. (운영체제는 문맥 교환에 드는 시간을 최소화 해야 함)
프로세스의 상태

- 생성 상태 : 메모리에 적재되어 PCB를 할당받은 상태. 이 단계를 거쳐 준비가 완료되면 CPU 할당을 기다림
- 준비 상태 : CPU 할당을 받아 실행 가능한 상태이지만, 아직은 순서를 기다리고 있는 상태. 이 때 CPU를 할당 받게되어 실행 상태로 전환되는 것을 디스패치(dispatch)라고 함
- 실행 상태 : CPU를 할당받아 실행 중인 상태로, 일정 시간 동안만 CPU를 사용. 타이머 인터럽트가 발생하면 다시 준비 상태가 되고, 만약 입출력장치 event가 발생하면 대기 상태가됨
- 대기 상태 : 프로세스가 입출력 작업을 요청하거나 바로 확보될 수 없는 자원을 요청하여 실행이 불가능한 상태 일반적으로 입출력 작업을 요청하는 경우인데, 요청이 완료되면 다시 준비 상태가 된다.
- 종료 상태 : 프로세스가 종료된 상태 (운영체제는 PCB와 프로세스가 사용한 메모리를 정리)
- 멀티 프로세스 : 동시에 여러 프로세스가 실행되는 것. 자원을 공유하지 않는 독립적인 실행이다.
- 멀티 스레드 : 각 프로세스 내부에서 여러 스레드가 작업을 나누어 처리하는 것. 같은 프로세스의 메모리를 공유한다.
크롬 브라우저의 각 탭이나 확장은 독립된 여러개의 프로세스임 ⇒ 멀티 프로세스
한 탭 내부에서 음악 재생, 스크롤, 페이지 로딩 등의 여러 작업을 처리하는 경우 ⇒ 멀티 스레드 - 프로세스 간 통신(IPC) : 프로세스는 기본적으로 자원을 공유하지 않지만, 자원을 공유하고 데이터를 주고 받을 수 있는 방법
- 공유 메모리 - 데이터를 주고받는 프로세스가 공통적으로 사용할 메모리 영역을 두는 방식
- 메시지 전달 - 프로세스 간 주고받을 데이터를 메시지 형태로 주고받는 방식
- 시그널(signal) : 프로세스에게 특정 이벤트가 발생했음을 알리는 비동기적인 신호 (대부분 인터럽트와 관련한 이벤트)
3. 동기화와 교착 상태
- 공유 자원 : 프로세스 혹은 스레드가 공유하는 자원
- 임계 구역(critical section) : 다수의 프로세스 혹은 스레드가 동시에 공유 자원에 접근할 때 문제가 발생할 수 있는 코드 (다수의 프로세스가 임계 구역에 동시 진입하는 경우 문제가 발생함. 이것을 레이스 컨디션 이라고 함)
- 동기화(synchronization) : 레이스 컨디션을 방지하기 위해 프로세스 혹은 스레드가 2가지 조건을 준수하며 실행하는 것
- 실행 순서 제어 - 프로세스 및 스레드를 올바른 순서로 실행하기
- 상호 배제 - 자원에 하나의 프로세스 및 스레드만 접근하기
- 뮤텍스 락(mutex lock) : 동시에 접근해서는 안 되는 자원에 동시 접근이 불가능하도록 상호 배제를 보장하는 도구
임계 구역에 접근하고자 한다면 반드시 락(lock)을 획득해야하고, 임계 구역에서의 작업이 끝났다면 락을 해제해야 한다.
일반적으로 뮤텍스 락은 공유하는 변수(lock)와 2개의 함수(acquire, release)로 구현
뮤텍스 락을 사용했을 때 프로세스의 실행 예시
- 프로세스 A가 acquire()를 호출하여 락을 얻고 임계 구역 진입
- 동시에 프로세스 B도 acquire()를 호출하지만 락을 얻지 못하여 접근 불가
- 프로세스 A의 임계 구역 작업이 종료되어 release() 호출 및 락 해제
- 프로세스 B가 임계 구역 진입
세마포어(semaphore) : 한 번에 하나가 아닌 3개, 4개의 프로세스 및 스레드까지 특정 자원을 이용할 수 있는 상황일 때 뮤텍스 락대신 세마포어를 사용. 마찬가지로 동기화 도구이다.
뮤텍스 락과 비슷하게 공유 자원의 개수를 나타내는 변수 S, 임계 구역 진입 전 호출하는 wait() 함수, 임계 구역 진입 후에 호출하는 signal() 함수로 구성된다.
세마포어를 사용했을 때 프로세스 실행 예시
- A 프로세스 실행 -> wait() 호출 -> S = 0
- B 프로세스 대기 -> wait() 호출 (대기 중)
- C 프로세스 대기 -> wait() 호출 (대기 중)
- A 종료 -> signal() 호출 -> S = 1
- B 프로세스 실행 -> wait() 호출 -> S = 0
- C 프로세스 대기 (대기 중)
- B 종료 -> signal() 호출 -> S = 1
- C 프로세스 실행 -> wait() 호출 -> S = 0
- C 종료 -> signal() 호출 -> S = 1
- 교착 상태(deadlock) : 2개 이상의 프로세스가 각자 가지고 있는 자원을 서로 무작정 기다릴 때 발생

교착 상태가 발생할 수 있는 조건들
- 상호 배제
한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상호 배제 상황에서 발생할 수 있음 - 점유와 대기
프로세스가 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다릴 때 발생할 수 있음. - 비선점
비선점이라는 것은 자원을 점유하는 프로세스가 끝나야만 해제된다는 것이기 때문에 교착이 발생할 수 있음 - 원형 대기 (순환 대기)
프로세스와 프로세스가 요청한 자원이 순환고리 형태를 이루는 경우 교착이 발생할 수 있음.
교착 상태를 해결하는 방법
- 교착 상태 예방
교착 상태를 발생시키는 4가지 조건 중 하나를 충족하지 못하게 하는 방법. 이렇게 하면 교착 상태는 발생하지 않는다. (모든 자원에 번호를 매겨 오름차순으로 할당하면 원형 대기 조건을 충족하지 못하여 교착이 발생하지 않음) - 교착 상태 회피
교착 상태가 발생하지 않을 정도로만 조심하면서 자원을 할당하는 방법 (은행원 알고리즘) - 교착 상태 검출 후 회복
교착 상태가 발생했음을 인정하고 처리하는 사후 조치로 교착이 검출되면 자원 선점을 통해 회복시키거나, 강제 종료하여 회복시킴
'Computer Science' 카테고리의 다른 글
| [CHAPTER - 04] 자료구조 - 1 (0) | 2025.12.07 |
|---|---|
| [CHAPTER - 03] 운영체제 - 2 (0) | 2025.11.15 |
| [CHAPTER - 02] 컴퓨터구조 - 2 (0) | 2025.11.12 |
| [CHAPTER - 02] 컴퓨터 구조 - 1 (0) | 2025.11.10 |