728x90
User Mode vs Kernel Mode
Kernel Mode (커널 모드)
정의
- 커널 모드는 운영체제의 핵심 부분이 작동하는 모드이다. 이 모드에서는 CPU가 모든 하드웨어에 대한 전체적인 접근 권한을 갖는다.
- 커널 모드에서 실행되는 코드는 시스템의 모든 메모리와 하드웨어 리소스를 자유롭게 조작할 수 있다.
특징
- 커널 모드에서는 운영체제가 시스템의 낮은 수준의 작업을 수행한다.
- 이 모드에서 실행되는 코드는 시스템의 안정성과 보안에 직접적인 영향을 미칠 수 있기 때문에, 일반적으로 신뢰할 수 있는 운영체제의 핵심 부분에 한정되어 있다.
용도
- 하드웨어와의 직접적인 통신, 메모리 관리, 프로세스 및 스레드 생성 관리, 시스템 호출 처리 등
User Mode (유저 모드)
정의
- 사용자 모드는 일반 응용 프로그램이 실행되는 모드이다.
- 이 모드에서 실행되는 프로그램은 제한된 메모리 영역에 접근할 수 있으며, 커널 모드에서 제공하는 API를 통해서만 시스템 리소스와 통신할 수 있다.
특징
- 사용자 모드에서 실행되는 코드는 시스템의 보안과 안정성을 해치지 않도록 설계되어 있다.
- 만약 어떤 응용프로그램이 오류를 일으키더라도, 그 영향은 해당 프로그램이나 그 프로세스에 국한되어, 시스템 전체에는 영향을 주지 않는다.
용도
- 일반 응용 프로그램 실행, 사용자와의 상호작용, 문서 편집, 게임 실행 등
User Mode와 Kernel Mode의 전환
운영체제는 사용자 모드와 커널 모드 사이를 효율적으로 전환할 수 있어야 한다.
예를 들어 응용 프로그램이 파일을 읽고 싶을 때, 시스템 호출을 통해 커널 모드로 전환되어 필요한 작업을 수행하고 다시 사용자 모드로 돌아온다.
이러한 전환은 운영체제의 성능과 안정성 및 보안에 중요한 역할을 하기 때문에 필수적인 요소이다.
각각의 모드가 잘 작동하면서, 운영체제는 효율적으로 리소스를 관리하고, 사용자에게 안정적인 서비스를 제공할 수 있다.
Mode 간의 통신 과정
인터넷에서 파일 다운로드 및 저장 과정을 예시로 들면,
- 먼저 사용자가 웹 브라우저에서 특정 파일을 다운로드 하기 위해 링크를 클릭하는데, 이 때 브라우저는 유저 모드에서 실행된다.
- 그 다음 웹 브라우저는 파일을 다운로드 하기 위해 네트워크 통신이 필요한데, 웹 브라우저는 운영체제의 네트워크 스택을 사용해야 하므로, 시스템 호출을 통해 커널 모드로 전환한다.
- 커널 모드로 전환되면 운영체제는 네트워크 인터페이스를 통해 인터넷에 접근하여 파일 데이터를 받아오기 시작한다. 이 과정은 커널 모드에서 수행되며, 운영체제는 하드웨어 자원에 직접 접근할 수 있다.
- 파일 데이터가 성공적으로 받아지면, 운영체제는 이 데이터를 웹 브라우저가 실행 중인 유저 모드의 메모리 공간으로 전송한다. 그리고 작업이 완료되면 다시 유저 모드로 전환한다.
- 사용자가 다운로드한 파일을 하드 드라이브에 저장하기를 원할 때, 웹 브라우저는 다시 시스템 호출을 통해 커널 모드로 전환하여 파일 시스템 서비스를 요청한다.
- 커널 모드에서 운영체제는 하드 드라이브에 접근하여 사용자가 원하는 위치에 파일을 저장한다. 이 과정은 커널 모드에서만 가능한 작업이다.
- 파일 저장이 완료되면 운영체제는 다시 유저 모드로 전환해, 웹 브라우저에 제어권을 넘겨준다.
Register vs Memory
레지스터(Register)
정의
- 레지스터는 CPU 내부에 존재하는 매우 빠른 소량의 저장 공간이다. CPU의 처리 속도에 맞춰 데이터를 저장하고, CPU 가 직접 접근해 연산할 수 있는 데이터를 임시로 보관한다.
속도
- 메모리 중에서 가장 빠른 접근 속도를 가지며, CPU가 프로그램을 실행할 때 필요한 명령이나 데이터를 레지스터에 미리 로드해두면, 메모리나 다른 저장 장치보다 훨씬 빠르게 접근할 수 있다.
용량
- 레지스터는 소량의 데이터만 저장할 수 있기 때문에 매우 제한적이다. 이는 CPU 설계에 따라 결정된다.
용도
- 연산에 필요한 데이터, 주소 지정, 명령어 실행 결과 등을 임시로 저장한다. CPU의 연산 속도를 최대로 끌어올리기 위해 사용된다.
메모리(Memory)
정의
- 메모리는 시스템의 주 기억장치로, RAM이라고도 한다. 프로그램의 명령어와 그 프로그램이 사용하는 데이터를 저장한다.
속도
- 레지스터보다는 접근 속도가 느리지만, 하드 드라이브나 SSD 같은 보조 저장 장치보다는 훨씬 빠르다. 시스템의 작업을 원활하게 수행하기 위해 중요한 역할을 한다.
용량
- 레지스터에 비해 훨씬 큰 저장 용량을 가지고 있다. 시스템의 RAM 용량은 기가바이트 단위로 측정되며, 이는 사용자가 실행할 수 있는 프로그램의 양과 시스템의 전반적인 성능에 직접적인 영향을 미친다.
용도
- 운영체제, 응용 프로그램, 현재 사용 중인 문서와 같은 데이터를 저장한다. CPU가 레지스터에 직접 접근할 수 없는 데이터는 메모리를 통해 접근한다.
레지스터와 메모리 차이점
속도와 용량
- 레지스터는 매우 빠르지만 용량이 작고, 메모리는 상대적으로 느리지만 용량이 크다.
위치
- 레지스터는 CPU 내부에, 메모리는 CPU 외부에 위치한다.
용도
- 레지스터는 CPU 연산에 직접적으로 관련 데이터를 저장하는데 사용되고, 메모리는 프로그램 실행에 필요한 명령어와 데이터를 저장하는데 사용된다.
User Stack
User Stack(사용자 스택)
- 프로그램 실행 중에 함수 호출과 반환, 지역 변수 저장 등을 위해 사용되는 메모리 구조이다.
- 스택은 LIFO 원칙, 즉 나중에 들어온 데이터가 먼저 나가는 구조를 가진다.
- 사용자 스택은 프로그램의 사용자 공간에 할당되며, 주로 프로그램의 실행 흐름을 관리하고 함수 사이의 데이터를 전달하는데 사용된다.
사용자 스택의 주요 기능
- 함수 호출과 반환
- 함수를 호출할 때마다 해당 함수의 실행 정보(반환 주소, 매개 변수 등)가 스택에 저장된다.
- 함수 실행이 완료되고 반환될 때, 이 정보를 사용하여 프로그램의 실행 흐름을 이전 상태로 복원한다.
- 지역 변수 저장
- 함수 내에서 선언된 지역 변수는 스택에 저장된다. 이는 각 함수 호출마다 고유한 스택 프레임을 가지기 때문에, 함수 호출이 중첩될 때 각각의 지역 변수가 서로 독립적으로 유지될 수 있다.
- 함수 간 데이터 전달
- 함수가 다른 함수를 호출할 때, 매개변수를 통해 데이터를 전달한다.
- 이 매개변수들은 스택을 통해 관리되며, 호출된 함수에서 사용할 수 있다.
사용자 스택의 특징
- 동적 할당
- 프로그램 실행 중 스택의 크기는 함수 호출의 깊이와 실행 중인 함수의 지역 변수의 양에 따라 동적으로 변한다.
- 임시 저장소
- 스택은 임시 데이터(매개 변수, 지역 변수 등)를 저장하는데 사용되며, 해당 데이터는 함수 실행이 끝나면 스택에서 제거된다.
- 실행 시간 효율성
- 스택을 사용함으로써 프로그램의 실행 흐름을 효율적으로 관리할 수 있으며, 메모리 사용이 최적화된다.
주의할 점
- 스택 오버플로우
- 스택의 크기가 한계를 초과해 너무 많은 함수 호출이 발생하거나 지역 변수가 과도하게 많을 때 발생한다. 이는 프로그램의 비정상 종료나 보안 취약점을 일으킬 수 있다.
- 재귀 호출의 관리
- 재귀 함수를 사용할 때 스택 오버플로우를 주의해야 한다. 재귀의 깊이가 너무 깊어지면 스택 공간을 과도하게 사용할 수 있기 때문
오늘의 잔디심기
|
백준
|
2440 |
자바스크립트
|
브론즈4
|
별 찍기-3 |
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().split("\n");
const n = Number(input[0]);
const star = '*';
for (let i = 0; i < n; i++) {
let result = '';
for (let j = n; j > i; j--) {
result += star;
}
console.log(result);
}
학습 시간 : 10 ~ 25시
728x90
'크래프톤 정글 > TIL' 카테고리의 다른 글
| 크래프톤 정글 week08, day66 - userprog 뜯기 (1) | 2024.03.14 |
|---|---|
| 크래프톤 정글 week08, day65 - Atomic Operation, Rax Register, Cache (1) | 2024.03.12 |
| 크래프톤 정글 week08, day63 - 잔디심기, pintOS - Project1 result (1) | 2024.03.11 |
| 크래프톤 정글 week08, day62 - 잔디심기, mlfqs-load-avg까지 구현 (1) | 2024.03.10 |
| 크래프톤 정글 week08, day61 - 잔디심기, 조건 변수, convar 성공 (1) | 2024.03.09 |