알아볼 내용
- 컴퓨터 구성
- 운영체제
- 컴퓨터의 요소
- 메모리
[3.1] 운영체제와 컴퓨터
0. 컴퓨터
1) 컴퓨터 구성
(1) 하드웨어: 물리적으로 컴퓨터 시스템을 구성하고 있는 기계 장치
(2) 소프트웨어: 논리적으로 컴퓨터 시스템을 구성하고 하드웨어들을 관리하고 동작시키는 역할을 한다.
소프트웨어는 명령어들의 집합으로 볼 수 있으며 일반적으로 프로그램이라고 칭하기도 한다.
컴퓨터 하드웨어는 크게 3가지 중앙처리장치(CPU) , 기억장치(Memory) , 입/출력장치(I/O) 로 구성 되어있다.
시스템 버스(System Bus)는 각 요소들과 연결되어 있고 데이터와 명령 제어 신호를 각 장치로 실어 나른다.
소프트웨어는 하드웨어의 동작을 지시하고 제어하는 명령어 집합으로 볼 수 있으며 크게 시스템 S/W, 응용 S/W 2가지로 구분할 수 있다.
- 시스템 S/W는 운영체제(OS), 컴파일러(Compiler), 어셈블러(Assembler), 로더(Loader) 등이 있다.
- 응용 S/W는 일반적으로 프로그램이라고 지칭하는 것으로 MS Office, 한글 등이 있다.
1. 운영체제(OS, Operation System)의 역할과 구조
1) 운영체제의 역할
: 사용자가 컴퓨터를 쉽게 다루게 해주는 인터페이스로, 한정된 메모리나 시스템 자원을 효율적으로 분배해준다.
(1) CPU 스케줄링, 프로세스 관리 : CPU 소유권을 어떤 프로세스에 할당할지, 프로세스의 생성과 삭제, 자원 할당 및 반환을 관리
(2) 메모리 관리 : 한정된 메모리를 어떤 프로세스에 얼만큼 할당해야 하는지 관리
(3) 디스크 파일 관리 : 디스크 파일을 어떠한 방법으로 보관할 지 관리
(4) I/O 디바이스 관리 : 마우스, 키보드와 컴퓨터간에 데이터를 주고받는 것을 관리
CPU 소유권?
CPU가 어떤 프로세스에 실행 권한을 부여할지를 결정하는 것을 말한다.
운영체제는 여러 프로세스가 동시에 실행될 수 있도록 CPU의 시간을 공정하게 분배해야 합니다.
이를 CPU 스케줄링이라고 합니다.
- 스케줄링 알고리즘: 다양한 알고리즘(예: 선입선출, 라운드 로빈, 우선순위 기반 등)을 사용하여 어떤 프로세스가 CPU를 사용할지 결정합니다.
- 컨텍스트 스위칭: 현재 실행 중인 프로세스의 상태를 저장하고, 다음 프로세스의 상태를 복원하는 과정입니다.
프로세스?
프로세스는 단순히 프로그램 파일이 아니라, 실행 중인 상태의 모든 정보를 포함합니다. 이를 통해 운영체제는 프로세스의 상태를 관리하고, 프로세스 간에 자원을 할당합니다. 프로세스의 기본 요소는 다음과 같습니다:
- 프로세스 상태: 실행 중, 대기 중, 종료 등 다양한 상태를 가집니다.
- 프로세스 제어 블록 (PCB): 프로세스의 상태, 프로그램 카운터, 레지스터, 메모리 정보 등을 포함한 데이터 구조입니다.
디스크 파일?
디스크 파일은 디지털 데이터가 저장되는 기본 단위로, 파일 시스템에 의해 관리됩니다. 파일은 다음과 같은 특성을 가집니다:
- 파일 이름과 확장자: 파일을 구분하는 이름과 확장자.
- 파일 내용: 저장된 데이터.
- 파일 속성: 크기, 생성 날짜, 수정 날짜 등.
운영체제는 파일 시스템을 통해 파일을 생성하고, 수정하고, 삭제하며, 접근 권한을 관리합니다.
2) 운영체제의 구조
유저 프로그램 | |
인터페이스 (GUI, CUI) | 운영체제 |
시스템콜 | |
커널 - 드라이버, 파일 시스템 등 |
|
하드웨어 |
- GUI : 그래픽 유저 인터페이스 (아이콘을 마우스로 클릭하는 동작으로 컴퓨터와 상호작용)
- CUI : 커맨드 유저 인터페이스 (명령어로 컴퓨터와 상호작용)
- 드라이버 : 하드웨어를 제어하기 위한 소프트웨어
(1) 시스템콜
: 운영체제가 커널에 접근하기 위한 인터페이스, 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할때 사용 (유저모드 → 커널모드 요청 단계)
- 커널 (Kernel) : 운영체제의 핵심 부분으로, 하드웨어와 응용프로그램 사이에서 인터페이스를 제공하고, 컴퓨터 자원을 관리한다. 즉 응용프로그램 수행에 필요한 여러가지 서비스를 제공하고 여러가지 하드웨어 리소스 (메모리, CPU) 를 관리하는 역할을 한다.
효율적인 자원 관리를 위해 CPU 스케줄링, 메모리관리, 입출력관리, 파일시스템 관리 등의 업무를 수행한다.
다만 이러한 커널은 항상 컴퓨터 자원들을 바라만 보고 있기에 사용자와의 상호작용은 지원하지 않는다. 따라서 사용자와의 직접전인 상호작용을 위해 프로그램을 제공하게 되는데, 대표적으로 쉘(Shell)이라는 명령어 해석기등이 있다.
- I/O 요청 : 시스템 자원에 대한 입출력 작업을 요청
입출력 함수 호출, 데이터베이스 작업 (읽기/쓰기), 네트워크 (데이터 송수신), 파일 접근(열거나 수정) 등
유저 프로그램이 I/O 요청으로 트랩(trap)* 을 발동하면 올바른 I/O 요청인지 확인한 후 유저 모드가 시스템콜을 통해 커널 모드로 변환되어 실행된다.
* 소프트웨어 인터럽트라고도 한다.
예를 들어 I/O 요청인 fs.readFile() 이라는 파일 시스템의 파일을 읽는 함수가 발동되었을 때
유저 모드에서 파일을 읽지 않고, 커널 모드로 들어가 파일을 읽고 다시 유저 모드로 돌아가 그 뒤에 있는 유저 프로그램의 로직을 수행합니다.
이 과정에서 컴퓨터 자원에 대한 직접 접근을 차단할 수도 있고 프로그램을 다른 프로그램으로부터 보호할 수 있다.
유저모드? 커널모드?
앞서 설명한 커널에서 중요한 자원을 관리하기 떄문에 사용자가 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나눈 것이다.
유저모드 : 유저가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드
코드를 작성하고 프로세스를 실행하는 등의 행동을 할 수 있다.
커널모드 : 모든 자원(드라이버, 메모리, CPU등)에 접근, 명령할 수 있다.
프로세스가 실행되는 동안 프로세스는 수없이 유저모드와 커널모드를 왔다갔다 하면서 실행이 된다.
프로세스나 스레드에서 운영체제로 어떤 요청을 할 때 시스템콜이라는 인터페이스와 커널을 거쳐 운영체제에 전달된다.
이 시스템콜은 하나의 추상화 계층이다. 그렇기때문에 이를 통해 네트워크 통신이나 데이터베이스와 같은 낮은 단계의 영역 처리에 대한 부분을 많이 신경쓰지 않고 프로그램을 구현할 수 있는 장점이 있다.
(2) modebit
0 또는 1 값을 갖는 플래그 변수
시스템콜이 작동될 때 유저모드(0)와 커널모드(1)를 구분한다.
카메라, 키보드와 같은 IO 디바이스는 운영체제를 통해서만 작동해야 한다.
→ 시스템의 안정성과 보안을 유지하기 위함. 모드비트는 이러한 모드 전환을 제어하여 시스템의 권한 레벨을 관리한다.
(I/O 디바이스에 대한 접근은 디바이스 드라이버를 통해 이루어지고, 디바이스 드라이버는 커널 모드에서 실행되어 하드웨어와 직접 통신함)
flag변수?
상태를 기록하고 제어하기 위한 boolean type의 변수를 의미.
플래그(flag)란 깃발이라는 뜻인데, 컴퓨터에서 무언가를 기억하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 프로그램에 사용되는 미리 정의된 비트이다.
유저 프로그램 | |
인터페이스 (GUI, CUI) | 운영체제 |
시스템콜 | |
커널 - 드라이버, 파일 시스템 등 |
|
하드웨어 |
2. 컴퓨터의 요소
: CPU, DMA 컨트롤러, 메모리, 타이머, 디바이스 컨트롤러
1) CPU
: 제어장치, 레지스터, 산술논리연산장치 로 구성
인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석해서 실행하는 일꾼
아래 그림처럼
관리자(운영체제의 커널) : 프로그램을 메모리 위에 올려 프로세스로 만든다
일꾼(CPU) : 처리한다.
(1) 제어장치 (CU, Control Unit) : 프로세스 조작을 지시
입출력장치 간의 통신을 제어하고 명령어들을 읽고 해석하며 데이터 처리를 위한 순서를 결정
(2) 레지스터 : 매우 빠른 임시 기억 장치
CPU와 직접 연결되어있어 연산 속도가 메모리보다 빠르다
CPU는 자체적으로 데이터를 저장할 방법이 없으므로 레지스터를 거쳐 데이터를 전달
(3) 산술논리연산장치 (ALU, Arithmetric Logic Unit)
덧셈, 뺄셈같은 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리연산을 하는 디지털 회로
- CPU의 연산 처리
① 제어장치가 메모리에 계산할 값을 로드한다. 레지스터에도 로드한다.
② 제어장치가 레지스터에 있는 값을 계산하라고 산술논리장치에 명령
③ 제어장치가 계산된 값을 → 다시 레지스터에서 → 메모리로 계산한 값을 저장
(4) 인터럽트 : 어떤 신호가 들어왔을때 CPU를 잠시 정지 시키는 것
- 하드웨어 인터럽트
키보드나 마우스를 연결 하는 등의 IO 디바이스에서 발생하는 인터럽트를 말한다.
운영체제에 시스템콜을 요청해서 원하는 디바이스로 향해 디바이스에 있는 작은 로컬 버퍼에 접근해서 일을 수행한다.
- 소프트웨어 인터럽트 = 트랩 ( trap )
프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동
2) DMA 컨트롤러 : I/O 장치가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
CPU 부하를 막아주는 보조 일꾼 개념
하나의 작업을 CPU와 DMA 컨트롤러가 동시에 하는것을 방지
3) 메모리 : 전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치
보통은 RAM(Random Access Memory)을 일컫는다.
메모리가 크면 클수록 많은 일을 동시에 할 수 있다.
4) 타이머 : 특정 프로그램에 시간 제한을 다는 역할
시간이 많이 걸리는 프로그램이 작동할 때 제한을 걸기 위함
5) 디바이스 컨트롤러
컴퓨터와 연결되어있는 IO 디바이스들의 작은 CPU를 말한다.
로컬 버퍼: 각 디바이스에서 데이터를 임시로 저장하기 위한 작은 메모리
[3.2] 메모리
CPU는 메모리에 올라와있는 프로그램의 명령어들을 실행하는 것이다
1. 메모리 계층
메모리 계층 구조란 메모리를 필요에 따라 여러가지 종류로 나누어 둔것을 의미한다. 이때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함이다.
메모리 계층 구조는 어떻게하면 컴퓨터를 최대한 빠르고 저렴하게 만들까에 대한 고민으로 고안된 구조이다.
보통 싼 메모리일 수록 용량이 크지만 느리고, 비싼 메모리는 용량이 작지만 빠르다.
그래서 성능이 좋고 비싼 메모리는 CPU 바로 옆에 작게 만들고, 느리고 용량이 큰 메모리는 먼 곳에 둔다. 이러한 원칙으로 만든 구조가 메모리 계층 구조이다.
여기서 컴퓨터 과학에서 증명된 법칙이 있다. "큰 메모리를 사용한다고 해서 그 안의 모든 데이터를 고르게 접근하지 않는다. 자주 쓰이는 데이터는 계속 자주 쓰고, 자주 쓰이지 않는 데이터는 계속 자주 쓰이지 않는다." 라는 법칙이다.
이를 이용해서 운영체제나 CPU는 자동으로 자주 쓰이는 데이터, 또는 자주 쓰일 것 같은 데이터를 메모리에서 캐시로 읽어온다. 자주 쓰이는 데이터는 전체 데이터 양에 비해 작은 양이기 때문에 캐시는 메모리보다 작아도 된다. 메모리와 하드 디스크의 관계도 마찬가지이다.
메모리 계층은 레지스터, 캐시, 메모리, 저장장치로 구성되어 있다.
메모리계층 | 설명 | 휘발성 | 속도 | 기억 용량 | 가격 |
레지스터 | CPU 안에 있는 작은 메모리 | 휘발성 | 가장 빠름 | 가장 적음 | 가장 비쌈 |
캐시 | L1, L2캐시 | 휘발성 | 빠름 | 적음 | 비쌈 |
주기억장치 | RAM | 휘발성 | 보통 | 보통 | 보통 |
보조기억장치 | HDD, SSD | 비휘발성 | 낮음 | 많음 | 저렴 |
각 메모리 특징
1) Register (32bit, 64bit)
컴퓨터에서 제일 빠른 메모리. CPU 안에 존재하고 명령어와 데이터를 일시적으로 저장하는 역할을 한다.
2) Cache
데이터를 미리 복사해놓는 임시 저장소
메모리와 CPU 사이의 속도 차이가 너무 크기때문에 중간에서 레지스터 계층을 두어 속도 차이를 해결
레지스터 다음으로 빠른 메모리. 대개 CPU 안에 존재하고 하위 캐시인 경우는 메인보드에 있는 경우도 있음.
CPU와의 거리에 따라 L1, L2, L3 등 여러 단계로 나뉨. 숫자가 작을 수록 CPU에 가까운 상위 레벨 캐시로 용량이 작고 빠름.
보통 프로그래머가 직접 제어할 수 없으며 CPU에 의해 자동으로 통제됨. 물론 캐시의 특성을 이해하고 프로그래밍을 하면 훨씬 효율 좋은 코드를 생성할 수 있음.
3) 메인 메모리(RAM)
램은 하드디스크로부터 일정량의 데이터를 복사해서 임시 저장하고 이를 필요시마다 CPU로 빠르게 전달하는 역할
주로 DRAM으로 구성.
4) SSD(Solid State Drive)
HDD를 대체하려고 개발된 보조저장장치. 데이터 입/출력 속도가 HDD에 비해 매우 빠르고 작고 가벼워서 컴퓨터 체감 속도를 비약적으로 상승시킴.
5) HDD(Hard Disk Drive)
비휘발성 데이터 저장소를 의미. CPU, 그래픽카드, RAM은 전기적으로 동작하는 반면 하드디스크는 물리적으로 동작하여 병목현상으로 인한 속도 저하가 심함.
하지만 1TB HDD가 5만원이 안된다는 엄청난 가성비를 가지고 있음.
캐시 Cache
: 데이터를 미리 복사해놓는 임시 저장소
빠른 장치와 느린 장치에서 속도 차이에 의한 병목 현상을 줄이기 위한 메모리 = 캐싱 계층
→ 데이터에 접근하는 시간이 오래 걸리는 경우를 해결하고 무언가를 다시 계산하는 시간을 절약
1) 캐시를 직접 설정할때는 지역성의 원리를 따라야 한다.
- 시간 지역성 : 최근에 사용한 데이터에 다시 접근
- 공간 지역성 : 최근 접근한 데이터를 이루고있는 공간이나, 그 가까운 공간에 접근하는 특성
2) 캐시히트 & 캐시미스
- 캐시에서 원하는 데이터를 찾으면 캐시히트
- 캐시에서 원하는 데이터를 찾지 못했다면 주 메모리로 가서 데이터를 찾아오는 것을 캐시미스라 함
3) 캐시매핑 : 캐시가 히트되기 위해 매핑하는 방법.
CPU의 레지스터와 주 메모리(RAM)간에 데이터를 주고받을때를 기반으로 설명
(1) 직접 매핑 : 처리는 빠르지만 충돌이 잦다
(2) 연관 매핑 : 순서 일치 x , 관련있는 캐시와 메모리를 매핑 / 충돌이 적지만 모든 블록을 탐색해야해서 느리다
(3) 집합 연관 매핑 : 위 두 방식을 합쳐놓은 방식. 순서를 두지만 집합을 두어 저장 (블록화). 보다 효율적
4) 웹브라우저의 캐시
: 사용자의 커스텀한 정보나 인증 모듈 관련 사항들을 웹브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나 중복 요청 방지를 위해 쓰이며 오리진(origin)에 종속된다.
브라우저는 개발자를 위해 쿠키, 로컬 스토리지, 세션 스토리지 이렇게 세 가지 종류의 저장소를 제공한다.
웹브라우저 캐시 | 특징 | 최대 용량 | 유의사항 |
쿠키 | 만료 기간이 있는 키 - 값 저장소 | 4KB | HttpOnly 설정을 통해 XSS*에 대해 안전을 확보할 수 있지만 CSRF*에 대해 취약 |
로컬 스토리지 | 만료 기한이 없는 키 - 값 저장소 웹브라우저를 닫아도 유지된다 (영구적) |
5MB | XSS에 취약하다. |
세션 스토리지 | 만료 기한이 없는 키 - 값 저장소 탭 단위로 세션 스토리지를 생성 탭을 닫으면 해당 데이터 삭제 |
5MB |
* XSS(Cross Site Scripting)
* CSRF(Cross Site Request Forgery)
우선 각 스토리지들에는 문자열 형태라면 어떤 정보든 저장할 수 있습니다. 하지만 웹 통신에 있어서 가장 취약한 부분이기도 하기 때문에 탈취됐을 때 문제가 생길만한 정보는 절대로 저장하면 안됩니다. 그래서 이 스토리지들의 가장 주된 용도는 서버와 클라이언트 사이에 형성된 세션에 관한 정보, 즉 세션 ID나 세션 토큰을 저장하는 것입니다.
서버는 인식표인 토큰을 나눠주는데, 클라이언트 코드에서 로컬 스토리지나 세션 스토리지를 토큰을 저장하는데 사용할 수 있습니다. 이 토큰은 프론트엔드에서 서버로 요청을 보낼 때 Authorization 헤더에 포함하는 등의 방식으로 사용됩니다. 이외에도 장바구니나 사용자가 작성 중이던 글 등 여러 정보를 저장하는데 사용할 수 있습니다.
새로고침을 하거나 브라우저를 껐다 켜도 유지되야하는 정보는 반드시 로컬 스토리지에 저장해야 합니다.
세션 스토리지는 하나의 탭에서 유효합니다. 탭을 닫으면 정보가 모두 삭제되고, 세션이라는 이름이 마치 한 브라우저 창에서 서버와의 세션이 살아있는 동안 유효할 것 같은 착각을 불러일으키지만 절대 아닙니다. 심지어 새로운 탭을 열 때 마다 모든 탭 각각에 새로운 세션 스토리지가 적용되니 주의하시고 목적에 맞도록 사용해야 한다.
// 로컬 스토리지에서 token1 아이템을 문자열로 가져오기
const token1 = localStorage.getItem("token1");
// 세션 스토리지에서 token2 아이템을 문자열로 가져오기
const token2 = sessionStorage.getItem("token2");
// 로컬 스토리지에 token1 아이템을 Hi 라는 문자열로 설정하기
localStorage.setItem("token1", "Hi");
// 세션 스토리지에 token2 아이템을 Hello 라는 문자열로 설정하기
sessionStorage.setItem("token2", "Hello");
5) 데이터베이스의 캐싱 계층
데이터베이스 시스템을 구축할 때, 메인 데이터베이스 위에 레디스* 데이터 베이스 계층을 캐싱 계층으로 두어 성능을 향상 시키기도 한다.
*레디스는 Remote Dictionary Server의 약자로서, "키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템
2. 메모리 관리
운영체제의 역할 중 하나는 메모리 관리이다. 컴퓨터 내의 한정된 메모리를 최대한 활용해야 한다.
1) 가상 메모리 : 메모리 관리 기법 중 하나, 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 사용자들에게 매우 큰 메모리로 보이게 만드는 것.
→ 적은 메모리로 여러 프로세스를 실행시키기 위한 시스템
폰 노이만 아키텍처* 기반으로 된 코드들은 반드시 메모리 RAM에 적재되어 실행되어야 한다.
이 말대로라면 실제로 각 프로세스마다 메모리를 할당하기에는 메모리 크기에 한계가 있다. 일반적으로 우리는 16~32GB의 RAM을 컴퓨터에 장착한다 (상황에 따라 더 넣는 경우도 있지만). 그런데 우리는 게임을 실행하고 유튜브를 검색하면서 음악도 듣고 아니면 중간에 넷플릭스도 튼다. 그럼에도 컴퓨터는 이걸 전부 다 끊김없이 잘 실행시킨다.
바로 이걸 가능케 하는 게 가상 메모리 Virtual Memory 시스템이다.
프로세스 크기 자체는 엄청나지만, 실제로 프로세스가 사용하는 메모리는 작다는 점에 착안해서 고안되었다. 프로세스 간 공간 분리로 프로세스 이슈가 전체 시스템에 영향을 주지 않게 할 수 있다.
* 폰 노이만 아키텍처 : 내장 메모리 순차처리 방식으로서, 데이터 메모리와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조
프로세스는 가상 주소를 사용해서 실제 해당 주소에서 데이터를 읽고 쓸 때만 물리 주소로 변환된다.
- 가상주소 : 프로세스가 참조하는 주소
- 물리주소 = 실제 주소 : 실제 메모리상에 있는 주소
메모리 관리 장치(MMU): 가상 주소를 실제 주소로 변환하는 하드웨어 장치이다.
소프트웨어 방식보단 하드웨어 장치가 주소 변환이 더 빠르기 때문
가상 메모리는 가상 주소와 실제 주소가 매핑되어있고, 프로세스의 주소 정보가 들어있는 '페이지 테이블'로 관리된다.
TLB(Translation Lookaside Buffer): 페이지 테이블에 있는 리스트를 보관하며 CPU가 페이지 테이블까지 가지 않도록 하여 속도롤 향상시키는 캐시 계층이다.
- 스와핑
만약 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생하는데
이때 메모리에서 당장 사용하지 않는 영역을 하드디스크로 옮기고, 하드디스크의 일부분을 마치 메모리에서 불러와 쓰는 것을 스와핑이라 하며 이를 통해 페이지 폴트가 일어나지않은 것처럼 만든다.
- 페이지 폴트(Page Fault)
어떤 페이지가 프로세스의 주소 공간에는 존재하지만, 실제 물리 메모리에 없을 때 (이 컴퓨터의 RAM 에는 없는 데이터에 접근했을 때) 일어나는 인터럽트
- 페이지 폴트로 인한 스와핑 과정
① 어떤 명령어가 유효한 가상 주소에 접근했으나 페이지*가 없다면 (Page Fault가 발생하면) 운영체제한테 Trap*을 요청한다.
② 운영 체제는 실제 디스크로부터 사용하지 않은 프레임을 찾는다.
③ 해당 프레임*을 실제 메모리에 가져와서 페이지 교체 알고리즘을 기반으로 특정 페이지와 교체한다.
이때 스와핑이 발생
④ 페이지 테이블을 갱신시킨 후 해당 명령어를 다시 시작
*page: 가상 메모리를 사용하는 최소 크기 단위= 가상 메모리를 일정한 크기로 나눈 블록
*frame: 실제 메모리를 사용하는 최소 크기 단위 = 물리 메모리를 일정한 크기로 나눈 블록
*trap: 소프트웨어 인터럽트, 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동
2) 스레싱 thrashing: 반복적으로 페이지 폴트가 발생해서, 과도하게 페이지 교체 작업이 일어나, 실제로는 아무일도 하지 못하는 상황
페이지 폴트가 발생하면 CPU이용률이 낮아진다.
→ CPU 이용률이 낮아지면 운영체제는 CPU가 일을 하고있지 않다고 생각해서 가용성을 높이려고 더 많은 프로세스를 올린다.
→ 메모리에 너무 많은 프로세스가 동시에 올라가면 스와핑이 많이 일어나고 스레싱이 발생한다.
- 스레싱 해결 방법
(1) 메모리를 늘리거나, HDD를 SDD로 교체
-- 운영 체제에서의 해결 방법 --
(2) 작업 세트 : 프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어 미리 메모리에 로드
→ 탐색에 드는 비용을 줄일 수 있고, 스와핑도 줄일 수 있다.
(3) PFF(Page Falut Frequency) : 페이지 폴트 빈도를 조절하는 방법.
상한선에 도달하면 프레임을 늘리고 하한선에 도달하면 프레임을 줄인다.
3) 메모리 할당
물리 메모리 영역은 일반적으로 OS 상주역역, 사용자 프로세스 영역으로 나뉘어 사용한다.
사용자 프로세스 영역의 메모리를 할당하는 방법은 연속 할당과 불연속 할당으로 구분한다.
(1) 연속 할당 : 프로세스를 메모리에 올릴 때 그 주소 공간을 여러개로 분할하지 않고 물리적 메모리의 한 곳에 연속적으로 적재하는 방식
- 고정 분할 방식: 물리적 메모리를 주어진 개수만큼의 영구적인 분할로 미리 나누어두고 각 분할에 하나의 프로세스를 적재해 실행시킬 수 있게 함 (분할의 크기는 모두 동일하게 할 수도 있고 서로 다르게 할 수도 있습니다.)
고정 분할 방식은 동시에 메모리에 올릴 수 있는 프로그램의 수가 고정되어 있으며 수행 가능한 프로그램의 최대 크기 또한 제한된다는 점에서 가변분할 방식에 비해 융통성이 떨어진다.
외부 단편화와 내부 단편화가 발생할 수있다.
외부 단편화란 프로그램의 크기보다 분할의 크기가 작은 경우에는 해당 분할이 비어 있는데도 불구하고 프로그램을 적재하지 못하기 때문에 발생하는 현상
내부 단편화는 프로그램의 크기보다 분할의 크기가 큰 경우 해당 분할에 프로그램을 적재하고 남는 현상
- 가변 분할 방식: 고정분할 방식과 달리 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식 → 내부 단편화는 발생하지 않는다.
만약에 프로그램들의 크기대로 메모리 공간에 차례대로 P1, P2, P3, P4, P5를 적재시킨 후
프로세스 P2와 P4가 종료가 돼서 이제 메모리에서 삭제된 경우, 종료된 프로세스가 사용된 메모리 공간이 비게 된다.
즉, 프로세스가 종료되면 위의 그림처럼 빈공간 A와 빈공간 B 처럼 메모리 내의 여러 곳에 산발적으로 메모리 가용공간(빈공간 = hole)이 생겨버려요.
그렇기 때문에 새로운 프로그램을 적재시키기 위해서는 가용공간 중 어떤 위치에 올릴 것인지 결정하는 문제가 생깁니다. 이러한 문제를 "동적 메모리 할당 문제"라고 한다.
이를 해결하기 위한 가변 분할 방식
① 최초적합: 크기가 N 이상인 가용 공간 중 가장 먼저 찾아지는 곳에 프로그램을 할당. 시간적 효율성 ↑
② 최적적합: 크기가 n 이상인 가장 작은 가용공간을 찾아 그곳에 새로운 프로그램을 할당. 공간적 효율성 ↑
③ 최악적합 : 가용 공간 중에서 가장 크기가 큰 곳에 새로운 프로그램을 할당
(2) 불연속 할당 : 메모리를 연속적으로 할당하지 않음.
- 페이징 : 현대 운영체제가 쓰는 방법
메모리를 동일한 크기의 페이지 (보통 4KB) 로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리의 서로 다른 위치에 프로세스를 할당
홀의 크기가 균일하지 않은 문제는 해결되지만, 주소 변환이 복잡하다.
- 세그멘테이션: 페이지 단위가 아닌 의미 단위인 segment 로 나누는 방식
세그먼트마다 별도의 크기를 갖는다.
프로세스를 이루는 메모리는 코드 영역, 데이터 영역, 스택 영엽, 힙 영역으로 이뤄지는데
코드와 데이터로 나누거나 코드내의 작은 함수를 세그먼트로 놓고 나눌 수도 있다.
공유와 보안 측면에서 장점을 가지지만 홀크기가 균일하지 않은 단점이 있다.
- 페이지드 세그멘테이션: 프로그램을 의미단위인 세그먼트로 나눠 공유나 보안 측면에 강점을 두고
임의의 길이가 아닌 동일한 크기의 페이지 단위로 나누는 것.
4) 페이지 교체 알고리즘
페이징 기법으로 메모리를 관리하는 운영체제에서 필요한 페이지가 주기억장치에 적재되지 않았을 시(페이지 폴트)
어떤 페이지 프레임을 선택하여 교체할 것인지 결정하는 방법을 페이지 교체 알고리즘이라고 한다.
(1) 오프라인 알고리즘 : 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘. 이상적으로 가장 좋은 알고리즘.
(2) FIFO (First in First out) : 가장 먼저 들어온 페이지를 교체
(3) LRU (Least Recently Used) : 가장 오랫동안 사용하지 않은 페이지를 교체
(4) NRU (Not Used Recently, Not Recently Used) : 클럭 알고리즘
최근에 사용하지 않은 페이지 교체 (LRU를 근사한 알고리즘)
교체되는 페이지의 참조 시점이 가장 오래되었다는 것을 보장하지는 못함
(5) LFU(Least Frequently Used) : 참조 횟수가 가장 낮은 페이지를 교체
[Computer Architecture] 컴퓨터의 구성 요소
⬛ 컴퓨터의 구성 컴퓨터 시스템은 크게 하드웨어(Hardware)와 소프트웨어(Software) 두 가지로 나눌 수 있다. 하드웨어는 물리적으로 컴퓨터 시스템을 구성하고 있는 기계 장치이고 소프트웨어는 논
codybuilder.com
https://minkwon4.tistory.com/295
[OS] 커널(Kernel)이란
커널이란 커널은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할
minkwon4.tistory.com
https://blockdmask.tistory.com/69
[운영체제] 유저모드와 커널모드에 대해서.
안녕하세요, BlockDMask입니다.오늘은 운영체제의 유저모드와 커널모드에 대해서 알아보도록 하겠습니다.글로 먼저 설명을 하고, 그림을 통해서 설명하겠습니다.제가 학교에서 수강했던 Unix system
blockdmask.tistory.com
https://doomdevlog.tistory.com/6
[컴퓨터 구조] 메모리 계층 구조
메모리 계층 구조란? 메모리 계층 구조란 메모리를 필요에 따라 여러가지 종류로 나누어 둠을 의미한다. 이때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함이다. -위키 백과- 메모
doomdevlog.tistory.com
웹 쿠키와 스토리지에 대한 깊은 이해
브라우저 스토리지의 용도, 사용 방식 그리고 주의점
medium.com
[운영체제] 가상 메모리
가상 메모리 내용 꽉꽉 채워서 정리해 봤어요(편을 나누는게 나았나...).
velog.io
'개발 공부 일지 > CS' 카테고리의 다른 글
[4.2] ERD와 정규화 과정 - [4.3] 트랜잭션과 무결성 (1) | 2024.08.11 |
---|---|
Q. HTTP 와 HTTPS 차이 / HTTP 메소드 (0) | 2024.08.02 |
[2.1] 네트워크의 기초 (1) | 2024.07.23 |
프로그래밍 패러다임 (0) | 2024.07.23 |
디자인 패턴 (0) | 2024.07.18 |