Search
🙊

운영체제 기본

Intro::

기본적인 운영체제 정리본입니다.

운영체제란?

시스템의 자원과 동작을 관리하는 소프트웨어
프로세스, 저장장치(RAM, HDD), 네트워킹, 사용자, 하드웨어를 관리

메모리 구조

Code
실행할 프로그램의 코드
Data
전역 변수, 정적 변수
Heap
사용자의 동적 할당
런타임에 크기가 결정됨
Stack
지역 변수, 매개 변수
컴파일 타임에 크기가 결정됨

프로세스

실행중인 프로그램
프로세스는 각각 독립된 메모리 영역을 할당받는다.

스레드

프로세스 안 실행 단위
Code, Data, Heap 은 공통으로 사용
Stack은 독립으로 사용
프로세스가 할당받은 ‘스택’은 주 스레드(Main Thread)용이며, 멀티스레드 환경에서는 운영체제가 스레드마다 개별 스택을 따로 할당한다.
따라서 “프로세스의 스택을 여러 스레드가 잘게 쪼개서 공유”하는 것이 아니라, 각 스레드는 독립적인 스택을 별도로 가상 메모리 상에 확보하여 사용한다.
스택을 공유한다면 로컬 변수가 서로 덮어씌워지는 등 치명적 문제가 발생하므로, 기본적으로 스레드끼리 스택은 공유되지 않는다.

CPU 스케줄러

준비큐에 있는 프로세스에 대해 CPU를 할당하는 방법
크게 선점/비선점, 우선순위/스케줄링 기준 등을 바탕으로 알고리즘이 구분된다.
비선점 스케줄링 (FCFS)
먼저 CPU를 요청하는 프로세스를 먼저 처리하는 방식
선점 (Preemptive scheduling)
높은 우선순위를 가진 프로세스를 우선적으로 처리하는 방식
SJF (Shortest Job First)
평균 wait time을 줄이기 위한 방법
버스트 시간이 짧은 프로세스 부터 CPU를 할당한다.
SRT (Shortest Remaining TIme)
최단 잔여시간을 우선으로 하는 스케줄링
라운드 로빈
모든 프로세스가 같은 우선순위를 가지고, time slice를 기반으로 스케줄링한다.
time slice가 심하게 크다면 FCFS와 다를바 없다.
time slice가 너무 작다면 context switch가 많이 일어난다.
우선 순위 스케줄링 (priority scheduling)
프로세스 선택 시 우선순위 값을 기준으로 나열하고 가장 높은 우선순위 프로세스를 먼저 실행하는 방식

컨텍스트 스위칭

프로세스 간 컨텍스트 스위칭
저장·복원 범위: 프로세스는 서로 독립된 가상 메모리 공간을 가지므로, 실행 중인 프로세스의 레지스터 값뿐 아니라 페이지 테이블 정보와 메모리 관리 구조(TLB 등)도 함께 교체해야 합니다.
레지스터란 현재 실행 중인 명령어(또는 다음 실행될 명령어)의 메모리 주소를 가리키는 포인터 역할을 한다
오버헤드: 페이지 테이블 전환과 TLB 플러시, 캐시 미스가 발생하므로 비용이 크고, 문맥 교환(Context Switch) 자체에도 시간이 많이 소요됩니다.
안전성: 서로 다른 주소 공간을 사용하기 때문에 메모리 접근 충돌 위험이 적으며, 한 프로세스가 비정상 종료되어도 다른 프로세스에 미치는 영향이 제한적입니다.
스레드 간 컨텍스트 스위칭
저장·복원 범위: 같은 프로세스 내에서 실행되므로 주소 공간(페이지 테이블)은 공유됩니다. 따라서 레지스터 값과 스택 포인터 정도만 백업·복원하면 됩니다.
오버헤드: 페이지 테이블 전환 과정이 없어서 프로세스 스위칭보다 훨씬 가볍고 빠릅니다. 레지스터 저장·복원과 스케줄러 진입 비용만 발생합니다.
주의점: 코드, 데이터, 힙은 공유하되, 각 스레드는 독립된 스택을 사용해야 하므로 스택 충돌은 발생하지 않습니다. 그러나 공유되는 힙과 전역 데이터를 동기화하지 않으면 경쟁 상태(Race Condition)가 생길 수 있습니다.

가상 메모리

모든 프로세스를 메모리에 할당하기에는 메모리의 크기가 제한적이기 때문에, 실제 사용하는 부분만 메모리에 올리고 나머지는 디스크에 보관하는 방법.

데드락

프로세스가 자원을 얻지 못해 다음 작업을 하지 못하는 상태
네 가지 조건을 동시에 성립할때 발생한다.
상호 배제
특정 자원(Resource)은 동시에 오직 하나의 프로세스(Process)만이 사용할 수 있어야 한다.
점유 대기
프로세스가 이미 최소 하나의 자원을 점유(소유)하고 있는 상태에서, 추가적인 자원을 요청(request)하여 획득하기 위해 기다리는(wait) 상태에 있어야 한다.
비선점
다른 프로세스에 할당된 자원을 강제로 빼앗을 수 없다.
순환 대기
0 → 1 → … → n → 0 처럼 자원을 요구하는 구조여야한다.

가상머신과 도커

References::