운영체제
운영체제 구조 (4가지)
- GUI / CUI
- GUI - 사용자가 전자 장치와 상호 작용하기 위한 사용자 인터페이스의 형태
- CUI - 그래픽이 아닌 명령어로 처리하는 인터페이스(리눅스)
- 커널
- 운영체제의 핵심 부분이자 시스템콜 인터페이스를 제공하며 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O 요청 관리 등 운영체제의 중추 역할
- 드라이버 - 하드웨어를 제어하기 위한 소프트웨어
- 시스템 콜 ( 추상화 계층)운영체제가 커널에 접근하기 위한 인터페이스
- 운영체제가 커널에 접근하기 위한 인터페이스
- 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할때 사용
- 프로세스나 스레드에서 운영체제로 요청을 할 때 시스템 콜로 인터페이스와 커널을 거쳐 운영체제에 전달 함
컴퓨터의 요소
- CPU
- 산술 논리 장치, 제어장치, 레지스터로 구성
- 운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 CPU가 처리
- 제어장치 (CU, Control Unit)
- 프로세스 조작을 지시하는 CPU의 부품
- 입출력장치간 통신을 제어
- 레지스터
- CPU 안에 잇는 매우 빠른 임시기억장치
- 처리 속도가 메모리보다 훨씬 빠름
- 산술논리연산장치 (ALU, Arithmetic Logic Unit)
- CPU의 연산처리
- 제어장치가 메모리에 계산할 값 로드 및 레지스터에 로드
- 제어장치가 레지스터에 있는 값을 계산하라고 산술논리연산장치에 명령
- 제어장치가 계산된 값을 다시 '레지스터에서 메모리로' 계산한 값을 저장
- 인터럽트
- 어떤 신호가 들어왔을때 CPU를 잠깐 정지 시키는 것
- I/O 디바이스 인터럽트
- 0으로 숫자를 나누는 산술 연산 인터럽트
- 프로세스 오류 등
- DMA 컨트롤러
- I/O 디바이스가 메모리에 직접 접근 할 수 있도록 하는 하드웨어 장치
- CPU의 보조 일꾼
- 메모리 (RAM, Random Access Memory)
- 전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치
- 타이머
- 디바이스 컨트롤러
- 컴퓨터에 연결되어 있는 IO 디바이스들의 작은 CPU를 말함
메모리
메모리 계층
- 레지스터
- CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억용량이 가장 적음
- 캐시 (L1, L2 캐시)
- 데이터를 미리 복사해 놓는 임지 저장소이자 속도가 빠른곳과 느린곳의 차이를 줄여 병목현상을 줄이기 위한 메모리
- 지역성의 원리
- 시간 지역성 - 최근 사용한 데이터에 다시 접근하려는 특성
- 공간 지역성 - 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
- 캐시히트 / 캐시미스
- 캐시 히트 - 캐시에서 원하는 데이터를 찾는 것
- 캐시 미스 - 찾으려는 데이터가 캐시에 없어 메모리에서 데이터를 찾아오는 경우
- 캐시 매핑
- 캐시가 히트되기 위해 매핑하는 방법(CPU의 레지스터와 메모리간의 데이터를 주고받을 떄를 기반)
- 웹브라우저 캐시
- 쿠키 - 만료기한이 있는 키-값 저장소
- 로컬 스토리지 - 만료기한이 없는 키-값 저장소 / 브라우저를 닫아도 유지되며 도메인 단위로 저장, 생성됨 (HTML5)
- 세션 스토리지 - 만료기한이 없는 키-값 저장소 / 탭 단위로 세션 스토리지 생성되며 탭을 닫을 때 데이터 삭제(HTML5)
- 데이터 베이스 캐싱 계층
- 메인 데이터베이스 위에 redis 데이터 베이스 계층을 '캐싱 계층'으로 둬서 성능을 향상시키기도 함.
- 주기억장치 / 메모리 (RAM)
- 저장장치(HDD, SSD) / 보조기억장치
메모리 관리
- 가상 메모리
- 페이지 - 가상 메모리를 사용하는 최소 크기 단위
- 프레임 - 실제 메모리를 사용하는 최소 크기 단위
- 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것
- 가상주소 -> MNU -> 실제주소 (프로세스 주소 정보가 들어있는 '페이지 테이블'로 관리)
- 속도 향상을 위해 TLB(메모리와 CPU사이에 있는 주소변환을 위한 캐시) 사용
- 스와핑
- 가상메모리에 존재하지만 RAM에 데이터가 없을 때 페이지 폴트가 발생함 -> 이때 메모리에서 당장 사용하지않는 영역을 하드디스크로 옮기고 하드디스크에서 데이터가 있는 부분을 메모리처럼 불러와서 페이지 폴트가 일어나지 않은것 처럼 보이게 하는것
- 페이지 폴트
- 프로세스의 주소 공간에는 존재하지만 RAM에는 없는 데이터를 접근하는 경우 발생
- 스레싱(thrashing)
- 메모리의 페이지 폴트율이 높은것을 의미 -> 컴퓨터 성능저하를 초래
- 메모리에 너무 많은 프로세스가 동시에 올라가게 되면 스와핑이 많이 발생하여 생기는 현상
- 운영체제에서 스레싱을 발지하는 방법
- 작업 세트 - 프로세스의 과거 사용 이령인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드
- PFF(Page Fault Frequency) - 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 지정하는 방법
- 메모리 할당
- 연속 할당
- 메모리에 연속적으로 공간을 할당하는 것
- 고정 분할 방식 - 메모리를 미리 나누어 관리하는 방식
- 가변 분할 방식 - 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용 -> 최초 적합/ 최적 적합/ 최악 적합
- 불연속 할당
- 페이징 기법 - 메모리를 동일한 크기의 페이지(보통4KB)로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당 -> 홀의 크기가 균일하지 않은 문제가 없어지지만 주소 변환이 복잡해짐
- 세그멘테이션 - 페이지가 아닌 세그먼트로 나누는 방식 -> 보안과 공유에 좋지만 홀의 크기가 균일하지 않음
- 페이지드 세그멘테이션 - 세그먼트로 나누고 임의의 길이가 아닌 동일한 크기의 페이지 단위로 나눔
- 페이지 교체 알고리즘
- 스와핑 발생이 적게 일어나도록 설계 해야함
- 오프라인 알고리즘
- FIFO (First In First Out)
- LRU (Least Recentle Used) - 각 페이지 마다 계수기, 스택을 둬서 가장 참조가 오래된 페이지를 확인.
- NUR (Not Used Recently) - Clock 알고리즘이라고도 불림(최근 참조된 프로세스를 1로 변경하고 참조되지 않은 0인 프로세스를 찾아다니며 변경)
- LFU (Least Frequently Used) - 가장 참조 횟수가 적은 페이지
프로세스와 스레드
- 프로세스 - 컴퓨터에서 실행되고 있는 프로그램
- 스레드 - 프로세스 내 작업의 흐름
프로세스와 컴파일 과정
- 컴파일 과정
- 전처리 - 소스 코드의 주석을 제거하고 헤더 파일을 병합하여 매크로를 치환
- 컴파일러 - 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
- 어셈블러 - 어셈블리어는 목적 코드로 변환
- 링커
- 프로그램 내의 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행파일 생성
- 정적 라이브러리 - 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
- 동적 라이브러리 - 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브 러리를 쓰는 방법
프로세스의 상태
- 생성 상태 - fork() / exec() 함수로 생성, PCB 할당
- 대기 상태 - 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하고 있다가 CPU 스케줄러로 부터 CPU 소유권이 넘어오길 기다리는 상태
- 대기 중단 상태 - 메모리 부족으로 일시 중단된 상태
- 실행 상태 - CPU 소유권과 메로리를 할당받고 지시 수행중인 상태
- 중단 상태 - 이벤트 발생 후 기다리며 프로세스가 차단된 상태(ex. I/O 디바이스 인터럽트 -> 프린트 할때?)
- 일시 중단 상태 -> 대기 중단가 비슷
- 종료 상태 -> 메모리와 CPU 소유권 모두 놓는 것 / 자연스럽게 될 때도 있지만 부모가 자식 프로세스를 강제로 비자발적 종료(abort)도 있음
프로세스의 메모리 구조
- 동적 영역(스택/ 힙)
- 동적할당은 런타임 단계에서 메모리를 할당 받는 것
- 정적 영역(데이터 영역(BSS Segment, Data Segment/ 코드 영역)
- 정적 할당은 컴파일 단계에서 메모리를 할당하는 것
PCB (Process Control Block)
- 프로세스에 대한 메타데이터를 저장한 데이터
- 컨텍스트 스위칭
- PCB 교환 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
멀티 프로세싱
- 여러개의 프로세스
- 동시에 두가지 이상의 일을 수행할 수 있는 것 -> 병렬로 일처리 가능해짐
- 웹 브라우저
- IPC(Inter Process Communiation)
- 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 매커니즘
- ex. 클라이언트와 서버가 데이터를 요청하고 응답하는 것
- 공유 메모리
- 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한을 부여하여 통신함
- 데이터 자체를 공유하도록 지원
- 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있음(동기화)
- 공유 메모리는 커널에서 관리
- 파일
- 디스크에 저장된 데이터 도는 파일 서버에서 제공한 데이터
- 소켓
- 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터 (TCP, UDP)
- 익명 파이프 (unamed pipe)
- 프로세스 간 읽히는 임시 공간인 파이프를 기반으로 데이터를 통신(단방향)
- 부모 자식 프로세스 간에만 사용 가능
- 명명된 파이프 (named pipe)
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 단방향 또는 양방향 파이프
- 상호 관련 없는 프로세스 간에도 사용 가능
- 메시지 큐
스레드와 멀티스레딩
- 스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 프로세스는 여러 스레드를 가짐
- 스레드는 각 프로세스마다 생성하는 프로세스와 달리 스택을 제외한 코드, 데이터, 힙은 스레드 끼리 공유 함
- 멀티스레딩
- 프로세스내 작업을 여러개의 스레드로 처리
- 한 스레드가 중단 되어도 다른 스레드는 실행 상태 일수 있기 때문에 중단되지 않는 빠른 처리 가능(동시성 상승)
- 한 스레드에 문제가 생길 경우 다른 스레드도 문제가 발생 할 수 있음
공유 자원 / 임계 영역
- 공유 자원 - 시스템 안에서 각 프로세스, 스레드가 함께 접근 할 수 있는 자원이나 변수 등을 의미
- 임계 영역 - 둘 이상의 프로세, 스레드가 공유 자원에 접근 할 때 순서등의 이유로 결과가 달라지는 코드 영역
- 임계 영역 해결 방법
- 뮤텍스(Mutex)
- 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠근 해제하는 객체
- 세마포어(Semaphore)
- 일반화된 뮤텍스
- 간단한 정수 값, wait() 및 signal()로 공유 자원에 대한 접근 처리
- 바이너리 세마포어, 카운팅 세마포어
- 모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공
- 모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리
교착상태(Deadlock)
- 두개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- 원인
- 상호배제 - 한 프로세스가 자원을 독점하여 다른 프로세스들이 접근 못함
- 점유 대기 - 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점 - 다른 프로세스가 보유한 자원을 강제적으로 가져올 수 없음
- 환형 대기 - 프로세스가 서로의 자원을 요구하는 상황
- 해결 방법
- 자원 할당 시 조건에 성립되지 않도록 설계
- 교착 가능성이 없을때만 자원 할당, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 은행원 알고리즘 사용
- 은행원 알고리즘 - 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안
- 교착상태 발생시 사이클을 확인하고 관련된 프로세스 하나씩 삭제
- 교착상태는 처리하는 비용이 크기 때문에 사용자가 직접 처리하는 방식
CPU 스케줄링 알고리즘
비선점 방식
- FCFS
- SJF(Shortest Job First)
- 수행시간이 가장 짧은 프로세스 먼저
- 긴 시간을 가진 프로세스가 실행되지 않는 Starvation이 일어날 수 있음
- 우선순위
- 오래된 작업에 우선순위를 높이는 방법을 줘서 단점 보완
선점 방식
- RR (Round Robin)
- 우선순위 스케줄링
- 각 프로세스는 동일한 할당 시간을 주고 그 시간안에 끝나지 않으면 다시 준비 큐의 뒤로가는 알고리즘
- 로드밸런서에서 트래픽 분산 알고리즘으로 활용
- SRF(Shortest Remaining Time First)
- 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
- 다단계 큐
- 우선순위에 따른 준비 큐를 여러개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케쥴링 알고리즘을 적용한 것