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 처럼 자원을 요구하는 구조여야한다.