개발자로 후회없는 삶 살기
[OS] 운영체제와 컴퓨터, 메모리 본문
서론
※ 아래 내용을 다룹니다.
- 컴퓨터 구조
- 메모리
https://github.com/SangBeom-Hahn/boost-interview
본론
- OS의 역할
사용자가 컴퓨터를 편리하게 이용할 수 있도록 해주는 인터페이스로 메모리, CPU 등 컴퓨터 자원을 효율적으로 분배해준다. 쉽게 말해, 컴퓨터의 하드웨어 자원인 메모리, CPU, 디스크 등을 사용할 수 있도록 해주는 SW이다.
1. CPU 스케줄링과 프로세스 관리 : CPU 소유권을 어떠한 프로세스에게 할당하고, 프로세스 생성, 삭제, 자원 할당 및 반환을 관리
2. 메모리 관리 : 한정된 메모리에 어떠한 프로세스를 얼마나 할당할지 관리
3. 디스크 파일 관리 : 디스크에 파일을 어떻게 저장할지 관리
4. IO 장치 관리 : 키보드, 마우스 같은 IO 장치와 컴퓨터와의 통신 관리
-> 컴퓨터 구조
응용 프로그램 > UI > 시스템 콜 > 커널 > 드라이버 > 하드웨어로 구성되며, UI부터 드라이버까지 OS이다.
=> 시스템 콜
유저 프로그램에서 OS를 이용하고 싶을 때 커널을 호출하는 것을 의미한다. 유저 프로그램이 IO 요청으로 트랩을 발동하면, 시스템 콜이 호출되어 유저 모드를 커널 모드로 변환하고 요청이 실행된다.
✅ 예를들어
1) 유저 프로그램이 파일 시스템의 파일을 읽는 IO 요청 (트랩 발동)
2) 유저 모드가 시스템 콜로 커널 모드로 변환
3) 커널 모드로 파일을 읽고
4) 커널 모드가 유저 모드로 변환되어 유저 로직 수행
이를 통해, 유저의 시스템 자원에 대한 직접 접근을 차단하고 프로그램 간에 다른 프로그램 접근을 차단하여 보호할 수 있다. 프로세스나 쓰레드(=유저 프로그램)에서 OS로 요청을 할 때 시스템 콜과 커널을 거쳐 os로 전달된다.
-> 모드 bit
유저(1), 커널(0) 모드를 구분하며, 사용자 요청이 들어왔을 땐 유저 모드로 시스템 콜을 호출하여 모드 bit를 0으로 변환하여 커널 모드로 OS 기능을 수행한 후에는 다시 모드 bit을 1로 변환하여 유저 모드로 돌아간다.
카메라 같은 io 디바이스는 os에 의해서만 동작해야 하는 데 만약 카메라가 유저 모드로 켜진다면 나쁜 사용자의 의도로 카메라가 켜지기 쉽다. (따라서, 앱에서 권한을 요청하는 것이다.)
🚨 가장 중요한 부분
유저 > 시스템 콜 > 커널 > os 순이고, 유저 프로그램의 프로세스나 쓰레드가 os를 호출하면 시스템 콜이 호출되어 유저 모드를 커널 모드로 변환하고 시스템 자원을 사용한 후 다시 유저 모드로 변환하여 유저 로직을 수행
- 컴퓨터의 요소
=> CPU
메모리에 있는 명령어를 해석하고 해석한 결과에 맞게 동작하도록 하는 장치로 제어장치, 레지스터, 산술 연산 장치로 구성된다. CPU는 OS가 정해준 순서(CPU 스케줄링)에 맞게 명령어를 실행만 하는 일꾼 역할인데, OS가 실행할 프로세스를 메모리에 할당하고 할당된 프로세스 중 실행할 메모리 영역을 CPU에게 알려주면 CPU는 OS가 시키는 대로 메모리 영역을 해석해서 단순히 실행할 뿐이다.
1) 제어장치 : 메모리에 있는 명령어를 해석하고 실행할 순서를 결정
2) 레지스터 : CPU 내에 있는 임시 기억 장치로 CPU는 자체적으로 데이터를 저장할 방법이 없기 때문에 레지스터를 거쳐 계산할 피연산자와 계산 결과값을 저장
3) 산술 논리 연산 장치 : 덧셈, 뺄셈, 논리합, 논리곱 연산
-> CPU가 제어장치, 레지스터, 산술 논리 연산 장치를 통해 연산하는 과정
1) 제어장치가 메모리의 명령어를 해석해서 계산에 필요한 값을 메모리 로드하고 레지스터에 저장
2) 제어장치가 레지스터에 있는 값을 산술 논리 연산 장치에게 계산을 하도록 명령
3) 제어장치가 계산 결과를 레지스터와 메모리에 저장
이러한 제어장치의 순서를 결정하는 게 OS이다. CPU는 메모리에 있는 명령어를 실행만 한다고 했는데 어떤 프로세스를 메모리에 할당할 지 또 어떤 메모리에 있는 프로세스를 CPU에 할당할지 그 순서를 OS가 결정하고 제어장치가 그 순서에 맞게 동작한다. 제어장치의 순서 결정은 해석한 명령어에 기반한 동작 순서 결정이다.
=> 추가 CPU 요소
1) DMA 컨트롤러 : IO 장치가 메모리에 직접 접근할 수 있도록 하는 장치로, CPU에 너무 많은 인터럽트가 몰려 부하를 해소하기 위해 존재한다. CPU가 IO 장치를 관리해야 하면 IO의 입출력이 오면 CPU가 동작해서, 메모리에 쓰라고할 텐데, 이를 IO 장치에서 바로 메모리에 저장할 수 있도록 하여 불필요한 동작을 제거한다.
2) 타이머 : 시간이 많이 걸리는 프로그램이 작동할 때 실행 시간을 제한하며, 몇 초 안에 작업이 끝나야 한다는 것을 정한다.
3) 디바이스 컨트롤러 : 하드웨어 장치의 작은 CPU로 옆에 붙은 로컬 버퍼는 장치의 메모리이다.
- 메모리
하드디스크에 저장된 일정량의 데이터를 복사하여 임시 저장하고, 이를 필요시마다 CPU의 빠른 접근을 위해 사용되는 저장 공간
=> 메모리 계층
위로 올라갈 수록 용량 ↓, 속도는 ↑
=> 캐시
데이터를 미리 복사해 놓은 임지 저장소이자 빠른 장치와 느린 장치의 속도 차이에 따른 병목 현상을 줄이기 위한 메모리로 데이터 접근 시간을 해결하고 계산 시간을 절약한다.
-> 지역성의 원리
자주 사용되는 데이터나 빠르게 접속해야 하는 데이터가 있다면, 캐시를 직접 만들어야 하며, 캐시에 저장하는 것이 옳은지 판단하는 기준이 지역성의 원리이다.
1) 시간 지역성 : 최근 접근한 데이터에 다시 접근하려는 특성
2) 공간 지역성 : 최근 접근한 데이터를 이루는 공간이나 가까운 공간에 접근하려는 특성
즉, 최근 사용된 데이터나 공간 혹은 가까운 공간에 접근하려고 할 때 캐시를 만들면 접근 시간과 계산 시간 절약을 할 수 있다.
-> 컴퓨터 내부의 캐시 메모리를 활용한 데이터 찾기
※ 용어
1) 캐시 히트 : 캐시에서 원하는 데이터를 찾음
2) 캐시 미스 : 캐시에서 원하는 데이터를 찾지 못 하고 RAM으로가서 데이터를 가져옴
캐시 히트를 할 경우 CPU 내부 버스를 기반으로 동작하고 가까워서 빠르며, 미스할 경우 RAM에서 가져와서 느리다.
-> 캐시매핑
메인 메모리의 데이터를 캐시 메모리에 저장할 때, 메모리의 주소를 캐시 라인의 어디에 매핑할지 결정하는 방법이다.
1) 직접 매핑
정의 : 메모리에 1 ~ 100, 캐시에 1 ~ 10이 있을 때 캐시 1: 1 ~ 10/ 캐시 2: 1 ~ 20과 같이 고정된 매핑 방법
장점 : 속도가 빠름
단점 : 특정 캐시 라인에 동일 메모리 주소가 중복되어 충돌이 발생할 수 있음
2) 연관 매핑
정의 : 연관된 메모리와 캐시를 매핑하는 방법
장점 : 충돌이 적음
단점 : 모든 블록을 탐색해야 해서 속도가 느림
3) 집합 연관 매핑
정의 : 집합을 이루고 집합 내에서 연관 매핑을 하는 방법으로 메모리에 1 ~ 100, 캐시에 1 ~ 10이 있을 때 캐시 1 ~ 5: 메모리 1 ~ 50 / 캐시 6 ~ 10: 메모리 51 ~ 100을 저장하는 방법
장점 : 충돌이 적고 탐색 시간도 비교적 빠름
단점 : 구현이 어려움
-> 웹 브라우저의 캐싱
보통 사용자의 고유 정보나 인증 정보를 웹 브라우저에 저장하여 서버에 동일 요청이 중복되지 않도록 하기 위함
쿠키 : 만료기간이 있는 캐시로 4KB까지 데이터를 저장할 수 있고, 보통 서버에서 만료 기간을 결정함
로컬 스토리지 : 만료기간이 없는 캐시로 5MB까지 저장할 수 있고 웹 브라우저를 닫아도 데이터가 유지됨
세션 스토리지 : 만료기간이 없는 캐시로 5MB까지 저장할 수 있고 탭 단위로 세션 스토리지가 생기며 탭을 닫으면 데이터가 소멸됨
=> 메모리 관리
OS의 역할 중 한정된 메모리 공간을 극한으로 사용하는 방법을 알아보자
※ 용어
1) 페이지 : 가상 메모리 상의 영역 단위
2) 프레임 : 물리 메모리 상의 영역 단위
3) 스왑공간 : 물리 메모리의 공간 부족 시 대체하여 사용하기 위한 디스크 상의 공간으로, 메모리의 연장선으로 사용된다. 디스크 공간이므로 접근 속도가 오래걸린다.
4) 페이지 테이블 : 가상 메모리의 가상 주소와 물리 메모리의 실제 주소를 매핑한 테이블, CPU가 동작할 때 참조하여 실제 주소를 찾을 때 사용됨
5) TLB : CPU가 매번 페이지 테이블을 읽는 리소스를 줄이기 위해, 가상 주소와 물리 주소 매핑 값을 저장하는 캐시로, 접근 시간 등의 속도를 개선한다.
1. 가상 메모리
1개의 물리 메모리보다 더 큰 용량의 메모리를 사용할 수 있도록 하는 기술이다.
-> 페이지 폴트
CPU가 동작할 때 가상 메모리의 가상 주소에 있는 프로세스 명령어를 해석하고 실행하게 되는데 가상 메모리에 있는 페이지가 물리 메모리에 없는 현상을 의미한다.
1번 현재 접근하려는 가상 메모리가 디스크의 스왑 공간에 있는 경우
2번 물리 메모리의 용량이 부족하여 현재 접근하려는 가상 메모리를 적재할 물리 메모리가 없는 경우
페이지 폴트는 위 2가지 경우 발생할 수 있고, 스와핑을 통해 페이지 폴트가 발생하지 않은 것처럼 동작하게 한다.
-> 스와핑
물리 메모리에서 사용하지 않거나, 사용빈도가 낮은 프레임과 디스크의 스왑 공간을 교체하는 방법
1번 : 현재 접근하려는 디스크의 스왑 공간에 영역을 물리 메모리의 프레임과 교체
2번 : 물리 메모리에서 사용하지 않거나, 사용 빈도가 낮은 프레임과 디스크에서 사용하지 않는 영역을 교체하여 가용 공간을 확보 한 후 현재 접근하려는 가상 메모리를 적재
스와핑을 통해 물리 메모리의 가용 공간을 확보하여, 실제 물리 메모리보다 큰 용량의 메모리를 사용할 수 있게 한다.
2. 스레싱
페이지 폴트율이 높은 것을 의미한다. 메모리에 너무 많은 프로세스가 동시에 로드되어 있으면 페이지 폴트가 많이 일어나고 스와핑이 많이 일어나는 것 때문에 발생한다. 페이지 폴트가 일어나면 CPU 사용률이 저하되는데, OS는 CPU 사용률이 낮으면 "할 일이 적나? 일을 더 많이 줘야겠다"라고 생각해서 메모리에 더 많은 프로세스를 로드하고, 이러한 악순환으로 스레싱이 발생한다.
즉, 실제로 cpu 이용률이 낮은게 아니라 메모리에 너무 많은 프로세스가 올라가서 페이지 폴트가 많이 일어나서 cpu 이용률이 낮아지는 건데, 이 때문에 os가 cpu 이용률이 낮다고 착각하여 스레싱이 일어난다.
-> 해결방법
하드웨어적 : 메모리 늘리기, HDD를 SSD로 변경
작업세트 : 지역성을 통해 과거에 접근한 페이지 집합을 만들어 미리 메모리에 로드하는 것으로 페이지 폴트를 줄일 수 있음
PFF : 페이지 폴트 빈도 수 조절
3. 메모리 할당
메모리 할당은 할당의 시작점과 메모리 할당 크기를 기준으로 동작한다.
-> 연속 할당
프로세스를 메모리에 순차적으로 할당한다.
1) 고정 분할 방식
프레임(5) / 프레임(5) / 프레임(5)
메모리를 미리 고정된 크기로 나누고 프로세스를 할당하는 방식으로 메모리를 미리 나누기 때문에 융통성이 없고, 내부 단편화가 일어날 수 있다.
2) 가변 분할 방식
프레임(5) / 프레임(3) / 프레임(2)
메모리를 프로세스의 크기에 맞게 동적으로 할당하는 방식으로 외부 단편화가 일어나고, 내부 단편화는 비교적 일어나지 않는다.
※ 용어
내부 단편화 : 페이지가 프로세스 크기보다 커서 할당하지 못하는 영역이 발생
외부 단편화 : 페이지가 프로세스보다 작아서 할당하지 못하는 영역이 발생
최초적합 : 연속 할당에서 메모리를 위나 아래에서 부터 순회하여 최초에 접근한 홀에 바로 할당
최적적합 : 할당할 수 있는 메모리 중에서 프로세스와의 크기 차이가 가장 적은 홀에 할당
최악적합 : 할당할 수 있는 메모리 중에서 프로세스와의 크기 차이가 가장 큰 홀에 할당
-> 불연속 할당
현대 OS에서 사용하는 할당 방식으로 메모리의 불연속 공간에 프로세스를 할당한다.
1) 페이징 : 메모리를 동일 크기의 페이지 단위로 나누고 불연속한 서로 다른 위치에 프로세스를 할당하며 이를 페이지 테이블로 관리한다.
2) 세그멘테이션 : 메모리를 페이지 단위가 아닌 의미 단위인 세그먼트로 나누며 메모리는 데이터, 스택, 힙, 코드 등의 영역으로 나뉘는데 코드의 작은 함수를 세그먼트 단위로 설정할 수 있다.
3) 페이지드 세그멘테이션 : 프로그램을 세그먼트 단위로 나누고 동일 크기의 페이지 단위로 나눔
- 페이지 교체 알고리즘
FIFO : 가장 먼저 온 프로세스를 교체 영역에 먼저 배치
LRU : 가장 오래 사용하지 않은 프로세스를 교체
NUR : 최근 사용하지 않은 프로세스 교체
LFU : 가장 참조 횟수가 적은, 즉 가장 많이 사용하지 않은 프로세스 교체
스와핑을 할 때 페이지 교체 알고리즘을 사용한다.
'[개발자] > [CS]' 카테고리의 다른 글
[DB] 조인의 원리와 종류 (0) | 2024.07.03 |
---|---|
[DB] 정규화와 트랜잭션, 인덱스 (0) | 2024.06.18 |
[OS] 프로세스와 스레드, 공유자원 관리 (2) | 2024.06.11 |
[네트워크] IP 주소, HTTP (0) | 2024.05.29 |
[네트워크] 용어, 네트워크 분류, TCP/IP 계층 (4) | 2024.05.22 |