728x90
복습
User mode vs Kernel mode
- 사용자 모드와 커널 모드는 운영체제에서 CPU가 동작하는 두 가지 주요한 모드이다. 이 두 모드는 시스템 자원에 대한 접근 권한과 실행 가능한 작업의 범위를 구분하는 역할을 한다.
사용자 모드(User Mode)
- 사용자 모드는 일반적이 애플리케이션이 실행되는 모드이다.
- 사용자 모드에서 실행되는 프로세스는 제한된 권한을 가지며, 시스템 자원에 직접 접근할 수 없다.
- 사용자 모드의 프로세스는 가상 메모리 공간에서 동작하며, 자신의 코드, 데이터, 스택등을 가진다.
- 사용자 모드에서는 시스템 콜(System Call)을 통해 커널 모드로 전환하여 시스템 자원에 접근할 수 있다.
- 제한된 권한으로 인해 사용자 모드의 프로세스는 시스템의 안정성과 보안을 유지할 수 있다.
커널 모드(Kernel Mode)
- 커널 모드는 운영체제 커널이 실행되는 모드이다.
- 커널 모드에서 실행되는 코드는 시스템의 모든 자원에 직접 접근할 수 있는 권한을 가진다.
- 커널 모드에서는 하드웨어 제어, 메모리 관리, 프로세스 스케줄링 등의 핵심적인 시스템 작업을 수행한다.
- 커널 모드의 코드는 시스템의 안정성과 보안에 직접적인 영향을 미치므로 신뢰할 수 있는 코드만 실행된다.
- 커널 모드에서 발생한 오류나 충돌은 시스템 전체에 영향을 줄 수 있다.
모드 전환(Mode Switch)
- 사용자 모드에서 커널 모드로의 전환은 시스템 콜을 통해 이루어진다.
- 시스템 콜은 사용자 모드의 프로세스가 커널 모드의 서비스를 요청하는 인터페이스이다.
- 시스템 콜이 호출되면 CPU는 사용자 모드에서 커널 모드로 전환되고, 요청된 서비스를 처리한다.
- 서비스 처리가 완료되면 다시 사용자 모드로 전환되어 프로세스가 계속 실행된다.
보안과 안정성
- 사용자 모드와 커널 모드의 구분은 시스템의 보안과 안정성을 위해 중요하다.
- 사용자 모드에서 실행되는 프로세스는 제한된 권한을 가지므로 시스템에 직접적인 위협을 가하기 어렵다.
- 커널 모드에서 실행되는 코드는 신뢰할 수 있는 코드로 제한되며, 엄격한 검정을 거친다.
- 모드 전환을 통해 사용자 프로세스와 커널 사이의 경계를 명확히 하여 시스템의 무결성을 유지한다.
Register vs Memory
- 레지스터와 메모리는 컴퓨터 시스템에서 데이터를 저장하는 두 가지 주요한 개념이다. 이들은 저장 용량, 접근 속도, 기능 등에서 차이가 있다.
레지스터(Register)
- 레지스터는 CPU 내부에 위치한 고속 저장 장치이다.
- CPU가 직접 액세스할 수 있는 가장 빠른 저장 공간이다.
- 레지스터는 CPU에서 실행되는 명령어와 데이터를 일시적으로 저장하는 역할을 한다.
- 레지스터의 크기는 CPU 아키텍쳐에 따라 다르지만, 일반적으로 32bit, 64bit의 크기를 가진다.
- 레지스터는 명령어 실행, 데이터 연산, 주소 계산 등에 사용된다.
- 레지스터의 개수는 제한되어 있으며, CPU 아키텍처에 따라 다르다.
메모리(Memory)
- 메모리는 CPU 외부에 위치한 저장 장치로, 프로그램과 데이터를 저장하는 공간이다.
- 메모리는 CPU에 비해 상대적으로 느리지만, 대용량의 데이터를 저장할 수 있다.
- 메모리는 바이트 단위로 주소가 지정되며, 각 주소는 바이트 단위의 데이터를 저장할 수 있다.
- 메모리는 RAM(Random Access Memory)과 ROM(Read-Only Memory)으로 구분된다.
- RAM은 읽기와 쓰기가 가능한 휘발성 메모리로, 전원이 꺼지면 내용이 사라진다.
- ROM은 읽기 전용 메모리로, 전원이 꺼져도 내용이 유지된다.
속도 차이
- 레지스터는 CPU 내부에 위치하여 CPU와 직접 연결되어 있기 때문에 매우 빠른 접근 속도를 가진다.
- 메모리는 CPU 외부에 위치하며, 버스를 통해 CPU와 연결되므로 레지스터에 비해 상대적으로 느리다.
- CPU는 레지스터에 저장된 데이터를 바로 사용할 수 있지만, 메모리에 있는 데이터는 레지스터로 로드한 후에 사용할 수 있다.
용량 차이
- 레지스터는 CPU 내부에 제한된 개수만 존재하므로 저장할 수 있는 데이터의 양이 제한적이다.
- 메모리는 대용량의 데이터를 저장할 수 있으며, 시스템의 메모리 용량에 따라 수 기가 바이트에서 수 테라바이트까지 다양하다.
역할과 사용 용도
- 레지스터는 CPU에서 실행 중인 명령어와 관련된 데이터를 일시적으로 저장하고 빠르게 액세스하는 데 사용된다.
- 메모리는 프로그램 코드, 데이터, 운영체제, 응용 프로그램 등을 저장하는 데 사용된다.
- CPU는 메모리에서 필요한 데이터와 명령어를 레지스터로 로드하여 처리하고, 결과를 다시 메모리에 저장한다.
사용자 스택(User Stack)
- 프로세스의 메모리 공간에서 함수 호출, 지역 변수 저장, 매개변수 전달 등을 처리하는 중요한 메모리 영역이다.
메모리 구조
- 사용자 스택은 프로세스의 가상 메모리 공간에 할당된다.
- 스택은 높은 메모리 주소에서 낮은 메모리 주소 방향으로 증가한다.
- 스택 포인터는 현재 스택의 top을 가리키는 레지스터이다.
- 스택 포인터는 함수 호출과 반환에 따라 증가하거나 감소한다.
함수 호출과 반환
- 함수 호출 시, 호출된 함수의 매개변수, 반환 주소, 지역 변수 등이 스택에 저장된다.
- 함수 호출 시, 현재 함수의 실행 상태(현재 명령어 주소, 레지스터 값 등)가 스택에 저장된다.
- 함수 반환 시, 스택에 저장된 정보를 사용하여 이전 함수로 돌아간다.
- 함수 반환 시, 스택에 저장된 지역 변수와 매개변수는 스택에서 제거된다.
지역 변수 저장
- 함수 내에서 선언된 지역 변수는 스택에 저장된다.
- 지역 변수는 함수가 실행되는 동안에만 유효하며, 함수 종료 시 스택에서 제거된다.
- 각 함수 호출마다 별도의 스택 프레임(Stack Frame)이 생성되어 지역 변수를 저장한다.
매개변수 전달
- 함수에 전달되는 매개변수는 스택을 통해 전달된다.
- 함수 호출 시, 매개변수는 호출된 함수의 스택 프레임에 푸시(Push)된다.
- 함수 내에서는 스택에 저장된 매개변수에 접근하여 사용한다.
스택 오버플로우(Stack Overflow)
- 스택의 크기는 제한되어 있으며, 할당된 스택 공간을 초과하여 사용하면 스택 오버플로우가 발생한다.
- 스택 오버플로우는 일반적으로 재귀 함수의 무한 호출, 지나치게 큰 지역 변수 할당 등으로 인해 발생한다.
- 스택 오버플로우가 발생하면 프로그램이 비정상적으로 종료되거나 예기치 않은 동작을 할 수 있다.
스레드와 스택
- 각 스레드는 자신만의 독립적인 스택을 가진다.
- 스레드 간에는 스택 메모리가 공유되지 않으며, 각 스레드는 자신의 스택에서 함수 호출과 지역 변수를 관리한다.
- 스레드의 스택 크기는 일반적으로 제한되어 있으며, 스레드 생성 시 지정할 수 있다.
시스템 콜(System Call)
- 시스템 콜은 운영체제가 제공하는 서비스를 애플리케이션 프로그램이 요청하기 위한 프로그래밍 인터페이스이다. 애플리케이션 프로그램은 직접 하드웨어 자원에 접근할 수 없기 때문에, 운영 체제에게 필요한 서비스를 요청하고 운영 체제가 요청 받은 서비스를 수행하여 그 결과를 애플리케이션에게 전달한다.
애플리케이션과 운영 체제 간의 인터페이스
- 애플리케이션은 사용자 모드(User mode)에서 실행되고, 운영 체제는 커널 모드(Kernel mode)에서 실행된다.
- 애플리케이션이 운영체제의 서비스를 필요로 할 때, 시스템 콜을 호출하여 커널 모드로 전환한다.
- 운영 체제는 요청받은 서비스를 처리한 후, 다시 사용자 모드로 돌아가서 애플리케이션 실행을 계속한다.
시스템 콜의 동작 방식
- 애플리케이션에서 시스템 콜 함수를 호출한다.
- 시스템 콜 번호와 필요한 인자들을 레지스터에 저장한다.
- 소프트웨어 인터럽트(Software Interrupt)를 발생시켜 커널 모드로 전환한다.
- 커널 모드에서 시스템 콜 처리 루틴이 실행된다.
- 처리 결과를 애플리케이션에게 반환하고, 사용자 모드로 복귀한다.
다양한 시스템 콜의 종류
- 프로세스 관리 : fork(), exec(), wait(), exit() 등
- 파일 관리 : open(), close(), read(), write() 등
- 메모리 관리 : brk(), mmap(), munmap() 등
- 네트워크 통신 : socket(), bind(), listen(), connect() 등
- 시그널 처리 : signal(), sigaction() 등
시스템 콜의 장점
- 애플리케이션은 하드웨어와 직접 상호작용하지 않아도 되므로, 프로그래밍이 간소화 된다.
- 운영 체제가 자원 관리와 보안을 처리하므로, 시스템의 안정성과 보안성이 향상된다.
- 시스템 콜은 운영 체제 별로 표준화되어 있어, 이식성이 높은 애플리케이션을 개발할 수 있다.
시스템 콜 오버헤드
- 사용자 모드에서 커널 모드로의 전환에는 오버헤드가 발생한다.
- 시스템 콜을 빈번하게 호출하면 성능 저하가 발생할 수 있다.
- 이를 최소화하기 위해, 버퍼링이나 배치 처리와 같은 최적화 기법을 사용할 수 있다.
파일 디스크립터(File Descriptor)
- 유닉스 및 유닉스 계열 운영 체제에서 파일이나 입출력 자원을 식별하는 데 사용되는 추상 지표이다.
- 프로세스가 파일, 소켓, 파이프 등의 자원에 액세스할 때 사용된다.
정의
- 파일 디스크립터는 음이 아닌 정수 값으로 표현된다.
- 각 프로세스는 자신만의 파일 디스크립터 테이블을 가지고 있으며, 이 테이블은 열린 파일이나 입출력 자원을 추적한다.
- 파일 디스크립터는 시스템 콜을 통해 생성된다.
- 파일 디스크립터는 0부터 시작하는 정수 값으로 할당된다.
표준 파일 디스크립터
- 모든 유닉스 프로세스는 기본적으로 세 개의 표준 파일 디스크립터를 가지고 있다.
- 0 표준 입력 - 키보드 입력 등의 데이터를 읽는다.
- 1 표준 출력 - 터미널이나 화면으로 출력한다.
- 2 표준 오류 - 오류 메시지를 출력한다.
- 이 세 개의 파일 디스크립터는 기본적으로 열려 있으며, 필요에 따라 재지정할 수 있다.
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.05.30 수료 (0) | 2024.06.01 |
---|---|
24.05.29 이력서, 복습 (0) | 2024.05.29 |
24.05.27 점핏 취업캠프 (0) | 2024.05.28 |
24.05.26 개인 복습 (0) | 2024.05.26 |
24.05.25 나만무 (0) | 2024.05.26 |