크래프톤 정글/TIL

PintOS 프로젝트 2주차 키워드 정리 ( User mode, Kernel mode, Register, Memory, System Call, File Descriptor, Cache, Atomic Operation, %rax, 32bit OS, 64bit OS, interrupt, Segmentation Fault )

양선규 2024. 6. 2. 22:41
728x90
반응형

User mode vs Kernel mode

리눅스 운영체제는 User mode와 Kernel mode라는 두 가지 주요 실행 모드를 가지고 있다.

 

커널 모드(Kernel mode)

- 운영체제의 핵심 부분인, "커널"이 실행되는 모드

- 하드웨어에 대한 완전한 접근 권한을 가진다. -> 메모리, 프로세스 스케줄링, 파일 시스템 관리, 네트워킹 같은 low level 작업을 수행할 수 있다.

- 시스템의 모든 자원을 제어할 수 있기 때문에, 커널 모드에서의 오류는 시스템에 심각한 영향을 미칠 수 있다.

- 커널 모드에서는 시스템 모든 자원에 접근할 수 있는 광범위한 권한을 가지며, 따라서 커널 모드의 프로세스들은 메모리 공간을 공유한다.

 

사용자 모드(User mode)

- 일반 응용 프로그램이 실행되는 모드

- 커널 모드에 비해 제한된 접근 권한을 가진다 -> 하드웨어를 제어하거나 OS의 중요한 데이터 구조를 변경하는 등의 작업은 불가하다.

- 사용자 모드의 응용 프로그램이 시스템 자원 등을 필요로 하면, System call을 통해 커널에 요청을 보내서 커널이 그 요청을 처리한 후 결과를 리턴해 준다.

- 사용자 모드 프로세스들은 각자 독립적인 메모리 공간을 가진다.

 

사용자 모드에서 low-level 권한을 제한하는 이유

- 잘못된 코드, 악의적인 소프트웨어 등이 시스템 전체에 영향을 미치는 것을 방지한다.

- 다중 사용자 환경에서, 한 사용자의 응용 프로그램이 다른 사용자의 작업에 방해가 되지 않도록 보장한다.

 

 

 

Register vs Memory

레지스터와 메모리는 컴퓨터 시스템에서 사용되는 저장 장치이며, 약간의 차이가 있다.

 

레지스터(Register)

- CPU 내부에 위치한 소형의 고속 저장 장치, 현재 실행 중인 명령어와 관련된 데이터를 일시적으로 저장하고 처리하는데 사용된다.

- CPU 내부에 있으므로 매우 빠른 속도를 자랑한다. CPU가 가장 빠르게 접근할 수 있는 저장 공간이기 때문.

- 크기가 매우 작으며, 몇 바이트 정도의 데이터를 저장할 수 있다. x86에서는 32bit, 64bit 레지스터를 사용한다.

 

메모리(Memory)

- 컴퓨터 시스템에서 데이터를 저장하는 주요 저장 장치. RAM, ROM 캐시 메모리 등이 있다.

- 레지스터에 비해 접근 속도가 느리다.

- 저장 용량은 훨씬 크다. GB ~ TB 정도의 용량을 가진다.

- RAM은 휘발성 메모리, ROM은 비휘발성 메모리로 전원이 꺼져도 데이터를 유지한다.

 

레지스터와 메모리의 차이점 정리

1. 위치

- 레지스터 : CPU 내부

- 메모리 : CPU 외부, 메인보드에 위치

2. 속도

- 레지스터 : 매우 빠름

- 메모리 : 상대적으로 느림

3. 크기

- 레지스터 : 매우 작음( 몇 비트 ~ 몇 바이트 )

- 메모리 : 매우 큼( 몇 GB ~ 몇 TB )

4. 용도

레지스터 : 즉각적인 데이터 처리 및 임시 저장

메모리 : 프로그램 및 데이터의 저장과 관리

 

 

 

User Stack

User Stack이란 "사용자 모드에서 실행된 프로세스"가 할당받는 메모리에 있는 Stack, Heap, Code, Data, BSS 등 영역에서 Stack 영역을 지칭하는 용어이다.

 

 

 

System Call

- 사용자 모드 응용 프로그램이 커널 모드 기능을 이용할 수 있게 하는 인터페이스

- 프로그램이 파일 시스템, 네트워크 통신, 프로세스 관리 및 IPC 등 커널 모드의 권한이 필요할 경우 System Call을 이용해 커널 모드에 요청하게 된다.

 

System Call 작동 원리

1. 사용자 모드 응용 프로그램이 System Call 요청

2. 프로그램은 System Call number로 요청하며, System Call마다 고유한 번호를 가지고 있다.

3. OS는 number를 확인해서 해당하는 커널 함수를 실행한다. ( 커널 모드에서 실행된다 )

4. 요청 작업이 수행된 결과가 사용자 모드 응용 프로그램으로 반환되며, 프로그램은 실행을 계속한다. ( 다시 사용자 모드로 돌아온다 )

 

 

 

 

 

File Descriptor

- OS에서 파일이나 입/출력 자원을 식별하는 추상적인 핸들러

- 0과 양의 정수 형태로 표현되며, 프로세스가 파일, 소켓, 파이프 등을 열 때 생성된다.

- 파일 디스크립터는 파일 디스크립터 테이블을 통해 관리되며, 테이블은 프로세스별로 고유하다.

- 프로세스는 파일 디스크립터를 통해서 다양한 리소스를 관리하며, 해당 리소스에 대한 읽기, 쓰기 작업을 수행할 수 있다.

- fd 번호의 할당은 아직 할당되지 않은 가장 작은 양의 정수값이 할당된다.

- fd 번호 0, 1, 2는 각각 표준입력, 표준출력, 표준에러로써 기본적으로 할당되어 있다.

 

파일 디스크립터의 중요성

파일 디스크립터는 OS가 프로세스와 파일 시스템 간의 상호작용을 관리하는 기본적인 메커니즘이다. 이를 통해 프로세스는 파일이나 다른 I/O 자원에 효율적으로 접근하고 관리할 수 있다. 또한, 리소스 누수(resource leak)를 방지하기 위해 적절히 관리되어야 한다. 파일을 열었다면 반드시 닫아야 하며, 사용되지 않는 파일 디스크립터는 해제해야 한다.

 

 

 

Cache

데이터나 값을 미리 복사해 놓는 임시 저장소. 데이터에 대한 접근 시간을 단축시키고, 시스템 전반적인 성능을 향상시킬 수 있다. 자주 사용되는 데이터를 캐시에 저장하는 방식 등으로 빠른 연산이 가능해진다.

 

캐시의 지역성 활용

프로그램은 시간/공간적 지역성을 따르는 경향이 있다.

시간적 지역성 : 최근에 접근한 데이터에 다시 접근할 확률이 높은 성질

공간적 지역성 : 최근에 접근한 데이터의 근처에 있는 데이터에 접근할 확률이 높은 성질

캐시는 이러한 지역성 특징을 활용해서 효율적으로 데이터를 저장하게 된다.

 

 

 

Atomic Operation

- 중단될 수 없는 하나의 단일 연산

- 연산이 시작되면, 그 연산이 완료될 때 까지 아무런 다른 작업도 수행될 수 없다

- 트랜잭션과 비슷하게, 연산이 완벽하게 완료되거나 / 연산이 아예 시작되지도 않은 둘 중 하나의 상태여야 한다.

- 동시성 제어, 멀티 스레딩 환경에서 데이터 일관성과 동기화를 유지하는 데 필수적으로 사용되며, race condition이나 deadlock같은 문제를 방지할 수 있다.

- 프로세스 스케줄링 과정에서, 스케줄링을 방해받지 않도록 인터럽트를 disable 시켜놓는 것도 일종의 Atomic Operation이라고 할 수 있다.

 

 

 

%rax Register

x86-64 아키텍처에서 사용되는 64비트 범용 레지스터 중 하나이다. 64비트 데이터를 저장할 수 있으며, 함수 호출 시 return value를 저장할 때 주로 사용된다.

 

%rax 레지스터의 특징

1. 함수의 return value를 저장한다.

2. 산술 연산, 논리 연산에 사용될 수 있다. 특히 곱셈 연산에서 중요한 역할을 하며, 곱셈 결과의 하위 64비트를 저장한다.

3. 일부 특수 명령에서도 사용된다. ex ) cpuid 명령은 CPU 정보를 가져오는데, 결과가 %rax에 저장된다.

4. 인덱싱 및 주소 계산에 사용된다. 메모리 접근 시 인덱스 레지스터로 활용될 수 있으며, 주소 계산에도 활용된다.

 

 

 

32bit OS vs 64bit OS

bit는 한 번에 처리할 수 있는 최대 데이터의 단위를 의미한다. 레지스터의 크기를 의미하기도 한다. 레지스터의 크기가 크면 큰 단위의 데이터를 한번에 처리할 수 있게 되어, 처리 속도와 성능이 향상된다. 

 

메모리 주소 지정

32비트

- 메모리 주소를 지정하는 데 32비트를 사용한다. 최대 2^32개, 즉 약 4GB의 메모리 주소 공간을 지정할 수 있다.

64비트

- 메모리 주소를 지정하는 데 64비트를 사용한다. 최대 2^64개, 즉 약 16엑사바이트의 메모리 주소 공간을 지정할 수 있지만, 현재는 하드디스크의 한계로 6TB 정도까지 지정할 수 있다.

-> 메모리 주소 공간 1개, 즉 특정한 주소 1개는 1byte의 크기를 가진다. 즉 32비트는 2^32 바이트, 64비트는 2^64 바이트인 것이다. 

 

 

 

interrupt

CPU가 현재 진행 중인 작업을 잠시 멈추고, 더 중요한 작업(예 : 하드웨어로부터의 입력 등)을 처리할 수 있도록 한다. 인터럽트 처리가 끝나면, CPU는 이전에 하던 작업으로 돌아가 계속 처리한다.

 

하드웨어 인터럽트(Hardware Interrupts)

- 하드웨어로부터 발생하는 인터럽트. 키보드 입력, LAN카드 데이터 수신 등등

- 장치 컨트롤러가 CPU에 신호를 보내 발생시킨다.

- CPU는 이 신호를 받으면 실행 중인 작업을 중단하고 해당 장치를 관리하는 인터럽트 핸들러( 또는 인터럽트 서비스 루틴, ISR)로 제어를 이동시킨다.

-> 인터럽트 핸들러, ISR은 동일한 개념이라고 봐도 무방하다

 

소프트웨어 인터럽트(Software Interrupts)

- 프로그램 코드 내부에서 발생한다. System call이 대표적인 예시이다.

- 프로그램이 파일을 열거나 네트워크 연결 등의 작업을 요청할 때, system call을 통해 OS에 전달된다. system call은 소프트웨어 인터럽트를 발생시키며, OS가 해당 요청을 처리하도록 한다.

 

System call이 직접 커널 모드로의 전환을 하는 것은 아니다. System call이 인터럽트 또는 트랩 등을 호출하여 커널 모드로의 전환을 "요청" 한다.

직접 커널 모드로 전환할 수 있는 건 interrupt, Exception, Trap 뿐이다.

 

 

 

Segmentation Fault(세그멘테이션 폴트)

- 프로그램이 잘못된 메모리 주소에 접근하려 할 때 발생하는 오류

- 주로 잘못된 포인터 사용, 배열의 범위를 벗어난 접근, 메모리가 할당되지 않은 주소로 접근하려고 할 때 발생한다.

- 프로세스가 자신에게 할당되지 않은 메모리에 접근하려고 하면 발생하는 일종의 "보호 메커니즘"이다.

- 세그멘테이션 폴트가 발생하면 OS는 해당 프로세스를 종료시키고 오류 메시지를 출력한다.

728x90
반응형