Search

운영체제

운영체제

하드웨어 위에 설치되어 하드웨어 계층다른 소프트웨어 계층 을 연결하는 소프트웨어 계층
컴퓨터 시스템의 자원을 관리하고, 사용자가 컴퓨터를 사용할 수 있는 환경을 제공하는 역할
CPU, 메모리 같은 컴퓨터 자원은 제한적 → 자원을 관리하는 일은 매우 중요
사용자와 컴퓨터 간 인터페이스를 제공해서 컴퓨터를 편리하게 사용할 수 있는 환경을 제공
윈도우, 맥OS, 리눅스, 유닉스

CPU와 메모리 구조

CPU

컴퓨터의 뇌
프로그램을 실행하는 필요한 연산을 처리하고 수행
프로세서 라고도 불림

메모리

데이터를 저장하기 위한 기억장치
휘발성 메모리인 주 기억장치
RAM
비휘발성 메모리인 보조 기억장치
SSD, HDD
레지스터
CPU가 사용자 요청을 처리하는 데 필요한 데이터를 임시로 저장하는 기억장치
캐시 메모리
CPU 와 RAM 사이의 속도 차이를 해결하기 위한 기억장치
RAM
프로그램을 실행할 때 필요한 정보를 저장
휘발성 기억장치
하드 디스크
사용자가 필요한 데이터와 프로그램을 저장
비휘발성 기억장치
프로그램을 실행하면 OS가 디스크에 있는 프로그램을 메모리에 로드
로드된 프로그램을 프로세스 라 하고 CPU가 처리
CPU는 하나의 프로세스만 처리할 수 있어서 멀티 프로세스 환경에서는 OS가 스케줄링을 통해 CPU에 프로세스를 할당

커널과 시스템 콜

커널

컴퓨터 하드웨어와 프로세스의 보안, 자원 관리, 하드웨어 추상화 같은 중요한 역할
CPU 스케줄링
메모리 관리
입출력 관리
파일 시스템 관리
OS는 커널에서 관리하는 중요 자원에 사용자가 쉽게 접근하지 못하도록 커널모드, 사용자 모드 로 나눔
커널 모드는 하드웨어에 직접 접근해 메모리, CPU와 같은 자원을 사용
사용자 모드에서는 커널 모드의 자원에 접근할 수 없게 제한
사용자 모드에서 실행된 프로세스가 자원에 접근하려면 시스템 콜을 호출해 커널에 요청

시스템 콜

사용자 모드에서 커널 모드에 접근해 필요한 기능을 수행할 수 있게 하는 시스템 함수
프로세스를 생성하는 fork()
부모 프로세스가 자식 프로세스의 수행을 기다리는 wait()

프로세스

프로세스

컴퓨터에서 실행 중인 하나의 프로그램
OS는 프로그램을 실행하면서 디스크에 저장된 데이터를 메모리로 로드.
프로세스는 OS로부터 독립된 메모리 영역(코드, 데이터, 스택, 힙) 을 할당 받으며, 다른 프로세스의 메모리 영역에 접근할 수 없다.
PCB는 프로세스 제어 블록
스택
지역 변수
함수의 매개변수
반환되는 주소 값
영역 크기는 컴파일 때 결정
LIFO(후입선출) 방식
사용자에 의해 동적 메모리 할당이 일어나는 영역
영역 크기는 런타임 때 결정
FIFO(선입선출) 방식
데이터
전역 변수
정적 변수
배열
구조체
데이터 영역은 세부적으로 BBS 영역데이터 영역으로 나뉨
BBS 영역은 초기화하지 않은 변수
데이터 영역은 초기화된 변수
코드
실행할 코드가 기계어로 컴파일되어 저장되는 영역
텍스트 영역이라고 함
스택 영역 & 힙 영역은 동적으로 메모리 할당 가능
두 영역 사이에 빈 메모리 공간이 존재
메모리 영역을 공유해서 서로의 영역을 침범하는 문제
스택 영역이 힙 영역을 침범하면 스택 오버플로
힙 영역이 스택 영역을 침범하는 경우는 힙 오버플로

스레드

프로세스에 실제로 실행되는 흐름의 단위
프로세스 안에 존재
프로세스의 메모리 공간을 이용
지역 변수를 저장하는 스택 영역을 할당
전역 변수를 저장하는 힙 영역은 다른 스레드와 공유

PCB

OS는 프로세스를 제어하기 위해 프로세스 정보를 저장 → PCB
프로세스의 현재 상태
프로세스를 나타내는 고유 PID
부모 프로세스의 PID
자식 프로세스 PID
다음 실행할 명령어의 주소 PC
프로세스 우선순위
메모리 제한
등을 저장

프로세스의 생성

기존 프로세스에서 fork() 함수를 호출해 생성
fork() 함수에는 함수를 호출한 프로세스를 복사하는 기능이 있다.
기존 프로세스를 부모 프로세스
복사된 프로세스를 자식 프로세스
부모 프로세스에서 fork() 호출하면 부모 프로세스는 자식 프로세스의 PID 값을, 자식 프로세스는 0을 반환
OS가 프로세스 종료하는 경우 1) 프로세스가 OS의 종료 서비스(exit())를 호출해 정상 종료 2) 프로세스의 실행 시간 또는 특정 이벤트 발생을 기다리는 시간이 제한된 시간을 초과한 경우 3) 프로세스가 파일 검색 또는 입출력에 실패하는 경우 4) 오류가 발생하거나 메모리 부족 등이 발생

프로세스 상태도

프로세스는 CPU에 의해 성성 및 소멸하는 과정이 있음

생성

프로세스가 PCB를 가지고 있고 OS로부터 승인 받기 전

준비

OS로부터 승인받은 후 준비 큐에서 CPU 할당을 기다림

실행

프로세스가 CPU를 할당받아 실행

대기

프로세스가 입출력이나 이벤트 발생을 기다려야 해서 CPU 사용을 멈추고 기다림

종료

프로세스 실행을 종료함

생성 → 준비

생성된 프로세스가 OS로 부터 승인
준비 상태의 프로세스가 모여있는 자료구조인 준비 큐에 추가

준비 → 실행

준비 큐에 있는 프로세스 중 우선순위가 높은 프로세스가 디스패치 되어 실행

실행 → 준비

CPU 독점을 방지하기 위해 타임아웃 되어 준비 상태로 변경

실행 → 대기

입출력 또는 이벤트 때문에 대기 상태로 변경

대기 → 준비

입출력 또는 이벤트가 완료되어 준비 상태로 변경

실행 → 종료

실행 중인 프로세스가 정상적으로 끝나서 종료 상태로 변경

멀티 프로세스와 멀티 스레드

동시성

하나의 코어(싱글 코어)에서 여러 작업을 번갈아 가면서 처리하는 방식
CPU는 한 번에 하나의 작업만 처리할 수 있어서 여러 작업을 조금씩 돌아가면서 처리
CPU에서 여러 작업을 번갈아 가면서 처리하기 위해 처리 중인 작업을 교체하는 것을 콘텍스트 스위칭

병렬성

CPU가 여러 개(멀티 코어) 있어서 각 CPU에서 각 작업을 동시에 처리하는 방식
동시에 여러 작업이 처리

멀티 프로세스

응용 프로그램 하나를 여러 프로세스로 구성하는 것
시간과 메모리 공간을 많이 사용하는 단점
CPU는 하나의 작업만 처리해서 여러 프로세스를 처리하려면 CPU에서 처리 중인 프로세스를 교체하는 콘텍스트 스위칭 작업 이루어짐. 그러면 CPU에서 기존에 처리하던 프로세스가 할당받은 메모리 영역을 다른 프로세스에서 사용할 수 있게 교체하면서 시간과 메모리가 필요한데, 이를 오버헤드 라고 함.
프로세스는 독립적인 메모리를 할당받음
프로세스 간에 공유할 자원이 있으면 IPC를 통해 프로세스 간에 자원을 공유해야 함.
그래서 공유할 메모리를 직접 참조하는 것보다 비효율적

멀티 스레드

스레드를 여러 개 생성해 스레드들이 각자 다른 작업을 처리하는 것
스레드 간에 힙, 데이터, 코드 영역을 공유
콘텍스트 스위칭할 때 오버헤드가 적게 발생
IPC를 사용하지 않아도 되서 멀티 프로세스의 단점을 보완
여러 프로세스를 생성하는 것보단 스레드를 여러 개 생성하는 게 자원에 효율적
스레드 간 자원 공유가 프로세스 간 자원 공유보다 시스템 처리 비용이 적고 프로그램 응답 시간도 단축
스택 영역을 다른 스레드와 함께 사용해서 공유 자원에 대한 동기화가 필수
스레드에 문제가 생기면 프로세스 내 다른 스레드에 영향을 미침

콘텍스트 스위칭

인터럽트

방해하다. 중단시키다 라는 뜻
CPU에서 프로세스를 처리하다가 입출력 관련 이벤트가 발생하거나 예외 상황이 발생할 때 이에 대응할 수 있게 CPU에 처리를 요청

인터럽트가 발생하는 경우

입출력이 발생할 때
CPU 사용 시간이 만료
자식 프로세스를 생성
CPU는 하나의 프로세스만 처리할 수 있으므로 멀티 프로세스를 처리하려면 CPU 스케줄러에 의해 인터럽트가 발생하면서 콘텍스트 스위칭이 이뤄짐.

콘텍스트

CPU가 처리하는 프로세스의 정보

콘텍스트 스위칭

멀티 프로세스 환경에서 CPU가 처리 중인 프로세스의 정보를 바꾸는 것
멀티 스레드를 처리할 때도 사용하긴 함. 멀티 프로세스의 콘텍스트 스위칭 보단 시간과 메모리 자원을 적게 사용
멀티 스레드는 스택을 제외한 힙,데이터, 코드 영역을 공유하므로 레지스터에 저장하고 로드해야 하는 데이터가 상대적으로 적기 때문
CPU가 처리하는 중에 프로세스가 중간에 변경되도 이전에 실행하던 코드를 이어서 실행할 수 있는 이유 PCB에 프로그램 카운터스택 포인터 값이 저장되어 있기 때문 프로그램 카운터 : 프로세스가 이어서 처리해야 하는 명령어의 주소 값 스택 포인터 : 스택 영역에서 데이터가 채워진 가장 높은 주소 값

프로세스 동기화

경쟁 상태

여러 프로세스 또는 스레드에서 하나의 공유 자원에 접근하는 경우
자원에 접근하는 순서에 따라 값이 달라짐.
이러한 현상을 공유 자원에 동시에 접근해 경쟁하는 상태 → 경쟁 상태
경쟁 상태를 우유 문제로 예시로 듦
우유 없어서 엄마가 우유사러 슈퍼간 사이에 아빠도 우유가 없네 하고 슈퍼에 사라감.. 그렇게 우유가 2개가 됨..
이러한 문제를 해결하기 위해 프로세스 동기화가 필요

임계 영역

공유 자원에 접근할 수 있고 접근 순서에 따라 결과가 달라지는 코드 영역 → 임계 영역
위에 우유 유무를 판단하고 추가하는 부분이 임계 영역에 해당
임계 영역에서 경쟁 상태가 발생하는 것을 방지하려면 여러 프로세스가 공유 자원에 접근해도 데이터의 일관성이 유지되도록 프로세스 동기화

경쟁 상태 방지 조건

상호배제 기법
어떤 프로세스가 임계 영역 실행 중일때 다른 프로세스는 임계 영역에 접근 못함.
뮤텍스
세마포어
진행
임계 영역을 실행 중인 프로세스가 없을 때 다른 프로세스가 임계 영역을 실행.
한정된 대기
임계 영역에 접근을 요청했을 때 무한한 시간을 기다리지 않는다.

뮤텍스

락을 가진 프로세스만이 공유 자원에 접근 할 수 있게 하는 방법
한 가게에 하나의 키와 하나의 화장실. 한명씩 대기해서 키하나로 들어가야 한다.
화장실은 공유 자원을 포함한 임계 영역
열쇠는 락
A와 B는 공유 자원에 접근하려는 프로세스
임계 영역에 접근한 프로세스가 임계 영역에 락을 건다고 해서 럭킹 매커니즘
임계 영역에 접근하지 못한 프로세스는 락을 얻기 위해 기다리는 동안 락이 풀렸는지 반복문을 돌면서 확인함.
바쁜 대기 의 한 종류인 스핀락
스핀락은 락을 얻기 위해 프로세스가 반복문을 돌면서 기다리는 것을 의미
대기 상태가 되지 않고 반복문을 돌면서 자원의 사용 가능 여부를 확인해서 프로세스가 빠르게 교체될 수 있음.
바쁜 대기 프로세스가 공유 자원에 접근할 수 있는 권한을 얻을 때까지 확인하는 과정

세마포어

공유 자원에 접근할 수 있는 프로세스의 수를 정해 접근을 제어하는 방법
화장실은 공유 자원을 포함한 임계 영역
A,B,C,D는 공유 자원에 접근하려는 프로세스
화장실의 갯수(열쇠 갯수)는 공유 자원에 접근할 수 있는 프로세스의 수를 제어하기 위한 정수 변수
공유 자원에 접근한 프로세스가 접근을 해제하면 다른 프로세스가 접근할 수 있도록 신호를 보낸다고 해서 시그널링 매커니즘 이라고 한다.
동기 : 여러 작업을 처리할 때 작업 순서를 보장 비동기 : 여러 작업을 처리할 때 작업 순서를 보장하지 않음 블로킹 : 작업을 수행할 때 대기할 수 있따는 것을 의미. 작업 순서를 보장하지 않음 논블로킹: 작업을 시작하면 대기 없이 수행한다

교착 상태

2개 이상의 프로세스가 각각 자원을 가지고 있으면서 서로 자원을 요구하며 기다리는 상태

교착 상태 발생 4가지 필요 충분 조건(외우지 말고 이해하기)

상호배제
하나의 공유 자원에 하나의 프로세스만 접근
점유와 대기
프로세스가 최소 하나의 자원을 점유하고 있는 상태에서 추가로 다른 프로세스에서 사용 중인 자원을 점유하기 위해 대기
비선점
다른 프로세스에 할당된 자원을 뺏을 수 없다
환형 대기
프로세스가 자신의 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구한다.

스레드 안전

멀티 스레드 환경에서 하나의 변수, 함수, 객체에 스레드 여러 개가 동시에 접근해도 문제가 없음을 의미.
스레드가 안전하지 않는 경우
var++;
Java
복사
스레드 2개가 접근 잘못하면
var = 1이 아니라 var = 2 가 나올 수 있음..

IPC

프로세스는 고유한 메모리 영역을 갖기 때문에 프로세스 간 자원을 공유해야 할 때 IPC
프로세스 간에 자원을 공유하는 방식
1.
공유 메모리
프로세스 간에 공유 가능한 메모리를 구성해 자원을 공유하는 방식
2.
소켓
네트워크 소켓을 이용하는 프로세스 간 통신
클라이언트와 서버 구조로 자원을 주고받는다
3.
세마포어
접근하는 프로세스를 제어해 공유 자원을 관리
4.
파이프
FIFO 형태의 메모리인 파이프를 이용해 프로세스 간 자원을 공유하는 방식
단방향 통신만 지원
읽기 또는 쓰기 중 하나만 가능
둘다 할려면 읽기 파이프와 쓰기 파이프를 각각 생성
5.
메세지 큐
FIFO 형태의 큐 자료구조를 사용해 프로세스 간 메시지를 주고 받는 방식

좀비 프로세스와 고아 프로세스

좀비 프로세스

자식 프로세스가 종료됐지만, 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에 남겨진 자식 프로세스

고아 프로세스

부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우에 자식 프로세스

스케줄링

스케줄링의 목적

멀티 프로세스 환경에서 모든 프로세스를 공평하게 실행

스케줄링의 단게

장기 스케줄링(잡 스케줄링, 승인 스케줄링)
준비 큐에 어떤 프로세스를 넣을지 결정해 메모리에 올라가는 프로세스 수를 조절
현대 OS에서는 시분할 시스템을 사용하기 때문에 대부분 사용하지 않음
중기 스케줄링
메모리에 로드된 프로세스 수를 동적으로 조절
메모리에 프로세스가 많이 로드되면 스왑 아웃 해서 일부 프로세스를 통째로 저장
스왑 아웃된 프로세스는 중단 상태
중단 상태는 준비 상태에서 스왑 아웃된 중단된 준비 상태 와 대기 상태에서 스왑 아웃된 중단된 대기 상태 로 구분
단기 스케줄링(CPU 스케줄링)
준비 큐에 있는 대기 상태 프로세스 중 어떤 프로세스를 다음으로 실행할지 스케줄링 알고리즘을 결정
어떤 프로세스를 디스패치할지 결정하는데 CPU 스케줄링
스왑 아웃 : 프로세스가 실행되려면 메모리에 로드. 그런데 메모리 공간보다 많은 프로세스가 로드되는 경우. 중기 스케줄러가 이벤트 발생을 기다리고 있는 프로세스를 통째로 저장 공간(SSD같은)으로 옮겨 저장하는 것 스왑 인 : 스왑 아웃한 프로세스에서 이벤트 요청이 오면 해당 프로세스를 통째로 다시 메모리에 로드 스와핑 : 스왑 아웃과 스왑 인 처럼 프로세스를 통째로 메모리 영역과 저장 공간으로 옮기는 것 스와핑 하면 메모리 공간보다 많은 프로세스를 실행 할 수 있다는 장점

스케줄링 알고리즘

CPU 스케줄러(단기 스케줄러)가 준비 큐에 있는 프로세스 중 어떤 프로세스를 실행시킬지 결정하는 데 사용

스케줄링 목적을 달성시키는 기준

CPU 사용률
처리량
응답 시간
반환 시간
대기 시간

비선점형 스케줄링

실행 중인 프로세스가 종료될 때까지 다른 프로세스를 실행할 수 없음
FCFS 스케줄링
준비 큐에 먼저 들어온 프로세스가 우선순위를 갖는 알고리즘
SJF 스케줄링(SJN 스케줄링)
실행 시간이 짧은 프로세스가 우선순위를 갖는 알고리즘
HRRN 스케줄링

선점형 스케줄링

스케줄러가 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행할 수 있음
RR 스케줄링
프로세스 간 우선순위 X
모든 프로세스가 일정 시간 동안 실행, 초과하면 다른 프로세스를 실행
SRTF 스케줄링
준비 큐에서 대기 시간이 가장 짧게 남은 프로세스를 우선 수행 하는 알고리즘
멀티 레벨 스케줄링
준비 큐를 목적에 따라 여러 개로 분리해 사용하는 알고리즘

메모리 관리 전략

논리 메모리와 물리 메모리

CPU가 프로세스를 처리할 때 보는 주소 값과 실제 메모리의 주소 값은 다르다
프로세스가 보는 메모리 영역을 논리 메모리 영역 또는 가상 메모리 영역
실제로 사용되는 메모리 영역을 물리 메모리 영역
CPU가 프로세스를 실행하며 보는 주소 값을 논리 주소 또는 가상 주소
실제 메모리에서 사용되는 주소는 물리 주소
CPU가 프로세스를 실행할 때 사용하는 주소 값과 실제 주소 값이 다르므로 논리 주소를 물리 주소로 변환
이런 동작을 하는 하드웨어 장치를 메모리 관리 장치(MMU)
CPU에 위치
CPU에서 메모리에 접근하기 전에 MMU를 거쳐 논리 주소에 해당하는 물리 주소를 얻음
MMU는 보호해야 하는 메모리 영역에 대한 접근을 제한해 메모리를 보호하는 역할

연속 메모리 할당

멀티 프로세스 환경에서 여러 프로세스를 메모리에 연속적으로 로드하는 방법

고정 분할 방식

메모리 영역을 분할한 뒤 각 영역에 프로세스를 할당
분할된 영역의 크기는 서로 다를 수 있으며, 분할된 크기는 고정된다.
메모리에 올릴 수 있는 프로세스 수와 각 프로세스 크기가 제한되는 단점
단편화 문제
외부 단편화
내부 단편화

가변 분할 방식

할당할 프로세스의 크기에 따라 메모리 공간을 분할
최초 적합(first-fit)
가용 메모리 공간에 프로세스 크기만큼 비어 있는 메모리 공간을 찾아 차례대로 프로세스를 로드하는 방식
최적 적합(best-fit)
할당하려는 프로세스 크기 이상인 가용 메모리 공간 중에서 가장 작은 공간에 프로세스를 할당하는 방식
최악 적합(worst-fit)
할당하려는 프로세스 크기보다 큰 가용 메모리 공간 중에서 가장 큰 공간에 프로세스를 할당하는 방식

비연속 메모리 할당

프로세스의 메모리 영역을 나눠서 메모리 공간에 저장하는 방법

페이징

프로세스의 논리 메모리 영역과 물리 메모리 영역을 각각 일정한 크기의 페이지프레임으로 나눔
페이지와 프레임에는 각각 번호를 할당해 프로세스의 페이지와 메모리의 프레임을 매핑
매핑할 때 페이지 테이블 를 사용
페이지 테이블은 프로세스의 페이지 정보와 페이지에 매핑하는 프레임의 주소 값을 저장
각 프로세스의 PCB에 페이지 테이블이 저장

세그먼테이션

프로세스의 메모리 영역을 논리적 단위인 세그먼트로 분할해 메모리를 할당
세그먼테이션 테이블을 사용해 세그먼트의 논리 주소를 물리 주소로 매핑
프로세스의 메모리 영역을 논리적 단위로 나눠 저장하므로 단위별로 데이터를 보호하기 쉽다
세그먼트의 크기가 균등하지 않음..
프로세스의 할당/해제를 반복하는 과정에서 외부 단편화 발생
메모리에 로드된 스택 세그먼트 영역에서 오버플로가 발생하면 다른 프로세스와 메모리 영역이 겹침
다른 프로세스의 세그먼트나 스택 오버플로가 발생한 세그먼트를 디스크로 스왑 아웃해야함..

가상 메모리

가상 메모리

프로세스 전체가 메모리에 올라오지 않아도 프로세스를 실행하는 데 문제가 없다는 점에서 착안
실제로는 전체가 로드된 것이 아니어서 가상메모리

가상메모리 장점

프로그램이 메모리 크기에 대한 제약을 덜 받음
동시에 많은 프로그램을 실행하므로 CPU 이용률과 처리율을 높일 수 있음
필요한 영역만 메모리에 로드해 스와핑 횟수를 줄여서 프로그램 실행 속도를 높임

요구 페이징

프로세스에서 필요한 페이지만 메모리에 로드하는 방식
페이지를 모두 메모리에 로드하지 않고 초기에 필요한 영역만 로드한 후 다른 영역은 요청이 올 때 메모리에 로드
프로그램을 실행하다가 물리 메모리에 필요한 페이지가 없을 때 이를 페이지 폴트
페이지 폴트가 발생하면 디스크에서 필요한 페이지를 스왑 인
페이지에 해당하는 메모리 영역이 물리 메모리에 있는지는 페이지 테이블로 파악.
존재하면 v값 . 프레임이 존재하지 않으면 i 값을 반환

스레싱

동시에 일정 수 이상의 프로그램을 실행했을 때 오히려 CPU 이용률이 떨어지는 상황
다중 프로그래밍 정도가 일정 수준 이상 높아지면 페이징이 빈번. 실질적으로 CPU 이용률이 떨어지는 스레싱이 발생
스레싱을 예방하려면 워킹 세트 를 설정하는 방법이 있다
워킹 세트는 지역성을 기반으로 자주 사용하는 페이지를 저장해 두는 것.

캐시 메모리

CPU는 메모리 접근해 많은 데이터를 처리.
시간을 줄이기 위해 자주 사용하는 데이터를 임시로 캐시 메모리에 저장

캐시 메모리와 지역성

캐시 메모리

CPU와 메인 메모리 간에 데이터 접근 시 속도 차이를 줄이기 위해 사용
CPU에서 메인 메모리에 있는 데이터를 가져올 때 자주 사용하는 데이터는 캐시 메모리에 따로 저장.
해당 데이터가 필요하면 캐시 메모리에 접근
캐시 메모리에 어떤 데이터를 저장할지는 지역성을 바탕으로 결정
지역성은 CPU가 자주 참조하는 데이터가 고르게 분포되지 않고 특정 부분에 몰려 있는 것.
시간 지역성 : 최근 참조한 내용을 다시 참조할 가능성이 높다
공간 지역성 : 실제 참조한 주소 근처의 내용을 참조할 가능성이 높다

캐시 메모리의 매핑 방식

캐시 메모리와 메인 메모리를 매핑하는 방식

직접 매핑
연관 매핑
집합 연관 매핑

참고