크래프톤 정글

Pintos Project2 - User Programs 키워드

Jerry_K 2024. 11. 21. 13:24

✨ User mode vs Kernel mode

User mode

  • 애플리케이션이나 사용자 프로세스가 실행되는 공간
  • 프로세스가 제한된 엑세스 권한 가짐
  • 프로세스 분리로 다른 프로세스에 영향을 주지 않음

 

Kernel mode

  • 프로세스가 하드웨어,메모리 등에 제한 없이 엑세스 
  • 커널 모드에서 충돌이 발생하면 전체 시스템 다운 
    • 커널 모드는 모든 프로세스가 공유하는 단일 공간 
  • OS에 시스템콜을 통해 커널 모드 기능 사용
    • ex) open/write/read/close/malloc/free 등
  • 시스템 자원 엑세스를 허용하는 특권
  • 시스템콜을 한다고 하더라도 모든 커널 영역에 접근할 수 있는것은 아님

 

사용자 모드와 커널 모드 간의 전환 (context switch)

  • 서로 다른 권한 수준 간의 전환으로 CPU의 모드와 컨텍스트를 전환
  • 많은 시간이 걸리고 리소스가 많이 소모

 


✨ Register vs Memory

Register

  • CPU 내부에 위치한 임시 저장소 
  • 매우 빠르고 CPU가 즉시 처리해야하는 데이터나 명령어 저장

더 자세한 레지스터 종류는 아래에서 확인

 

레지스터 종류

PCB 내부에 무엇이 들어있나 갑자기 궁금해졌다.그 안에는 레지스터의 여러 종류들이 보였고,레지스터에 대해 좀 더 알고 싶어서 포스팅을 만든다. ✨ Address Registers PC (Program Counter, 프로그램 카

jerry-k.site

 

Memory

  • 주로 메모리는 RAM(Random Access Memory)를 의미
  • 프로그램이 실행되는 동안 데이터를 일시적 저장
  • 프로그램 코드와 데이터를 일시적으로 저장
  • 종류 : 메인 메모리 / 캐시 메모리 / 보조 기억 장치

✨ User Stack

  • 프로세스가 사용자 모드에서 실행되는 동안 저장하는 메모리 영역
  • 함수 호출 스택 프레임 관리
    • 함수 호출될 때마다 Stack frame 생성
      • 현재 실행 위치와 리턴 주소가 스택에 저장되어 함수 종료 후 복귀 가능  
    • 함수가 실행되며 지역 변수와 매개변수가 저장된 스택 프레임 내 접근 가능
    • 함수 종료되면 해당 스택 프레임 삭제 
      • 스택 포인터는 이전 프레임으로 이동
  • 함수 외부에서 임시 데이터 저장
    • 일부 어셈블리 코드 또는 최적화된 코드

 

✨ Kernel Stack

  • 시스템 호출, 인터럽트 처리, 예외 처리에 사용
    • 사용자 모드에서 커널 모드로 전환될 때 커널 스택 활성화
  • 커널 모드에서만 사용 가능하고, 커널 모드 종료 시 초기화
  • 고정 크기 제한 (상대적으로 작은 크기로 유지)

✨ System Call

  • 사용자 모드 프로그램이 커널의 기능과 자원 사용 
  • 운영체제는 시스템 콜로 특정 기능을 제한하여 무분별한 사용 방지
  • 시스템콜은 트랩이라는 CPU명령으로 커널모드 전환
    • 트랩은 소프트웨어 인터럽트 
  • 시스템콜의 종류
    • 프로세스 관리 (fork, exec, exit, wait  등)
    • 파일 시스템 관리 (open, read, write, close 등)
    • 메모리 관리 (mmap, brk, sbrk 등)
    • 장치 관리 (ioctl, read, write 등)
    • 네트워크 관리 (socket, connet, send, resv 등)
    • 시스템 정보 관리 (uname, sysinfo 등)=

 

🔗 트랩

  • 인터럽트, 예외, 시스템 콜 모두 트랩을 통해 CPU가 커널 모드로 전환
  • 시스템 콜
    • 프로그램이 read/write 같은 요청하면 트랩 명령을 실행하여 커널 모드로 전환
  • 프로세서에서 오류나 특수 조건 발생했을 떄 예외 처리
    • ex) 0으로 나누기, Page Faurt, 잘못된 메모리 접근
    • 예외 발생 시 트랩을 통해 커널모드로 전환되어 오류 처리 또는 해당 프로세스 중지 
    • 예외는 주로 소프트웨어 상황에 발생
  • 인터럽트
    •  하드웨어 장치에서 요청 발생 시 CPU가 현재 작업 중단
    • 인터럽트는 주로 외부 하드웨어에 의해 발생
    • 타이머 인터럽트

✨ File descriptor 

  • 프로세스가 열고 있는 파일에 대한 정보 
  • 프로세스는 FD를 통해 파일에 접근
  • 파일 디스크립터 테이블은 FD와 파일 객체에 대한 포인터 매핑
    • 파일 디스크립터 테이블은 커널 영역에 존재 
  • 각 프로세스는 자신만의 FD 테이블을 가져서 프로세스 간의 파일 접근 격리 
  • 여러 프로세스가 동일한 파일을 열더라도, 각 프로세스는 개별적인 FD 테이블를 할당 받음
  • 커널의 파일 객체 공유
    • 여러 프로세스가 열 때, FD 테이블에서 가리키는 파일 객체는 하나만 생성하여 공유 

 

 

"유닉스의 모든 것은 파일이다."

OS에 거의 모든 자원을 파일 처럼 다룸

  • 일반 파일 
    • 우리가 생각하는 보통 파일 (텍스트 파일, 바이너리 파일 ,이미지 마일)
    • 저장된 데이터가 연속된 바이트로 구성
    • 데이터를 읽거나 쓸 수 있음
    • .txt, .c, .jpg, .bin 등 
  • 디렉토리
    • 폴더 (디렉토리 역시 파일)
    • 폴더는 다른 파일들의 목록을 가짐 (신기함!)
      • 목록의 형태는 파일의 이름과 파일의 인덱스로 구성
    • 다른 파일들에 비해 공간을 적게 필요
    • /home, /etx, /usr 등
  • symbolic link
    • 파일 자체는 작은 크기의 파일
    •  참조 대상의 파일 경로를 포함 
    • "바로가기 "와 비슷함
    • 원본 파일과 링크 파일의 위치가 다를 수 있음
  • FIFO special
    • 프로세스 간 순차적인 데이터 전송을 위한 특수 파일 
  • socket
    • 소켓 파일은 네트워크 통신을 위한 파일 
    • 소켓 파일을 통해 네트워크 연결 설정 
  • 장치파일 
    • 문자 장치 (터미널, 키보드)
    • 하드웨어 장치와의 상호작용을 위한 인터페이스

 

+ 추가적으로 ELF 파일에 대해 알고 싶다면 아래 포스팅으로 !!

 

Pintos Project 2 _ ELF 파일

Pintos Project 2에 process.c 파일에 load하는 과정이 있다. 이 과정에서 ELF 개념이 나온다.Deep dive를 안하려고 했지만, 찾다보니 여기까지 와버렸다...ELF가 무엇인지를 알아보자 ! 🔗 ELF 형식의 파일 

jerry-k.site

(참고) 전체적인 file 구조에 정리한 그림

 


✨ Cache 

  • 데이터 접근 속도를 높이기 위해 사용
  • 일반적으로 테이블 형태로 구성 
  • 데이터를 일시적으로 저장해두는 고속 임시 저장소 
  • 컴퓨터 시스템의 여러 계층에서 활용 
    • CPU 캐시, 디스크 캐시 , 웹 캐시
  • 캐시 히트 / 캐시 미스 / 교체 정책
    • 교체 정책 : 새로운 데이터를 캐시에 저장할 공간이 부족하면 기존 데이터 삭제하고 새로운 대이터 저장 
  • 공간 지역성 / 시간 지역성 

✨ Atomic Operation

  • 중단되지 않고  한 번에 수행되는 연산
  • 실행 도중 다른 연산이 끼어들거나, 불완전하게 중단되지 않음 
  • 다중 스레드 환경에서 안전하게 수행 

✨ rax register

  • x86-64 아키텍처쳐에서 사용하는 범용 레지스터
  • 주로 연산의 결과를 저장하는 용도로 사용 
  • RAX는 64비트 레지스터로, 이전의  EAX 32비트 레지스터를 확장한 형태 
  • 이전 하위 레지스터와도 호환 가능 
    • RAX(64비트), EAX(32비트) , AX (16비트) , AL (8비트)
mov rax, 5      ; RAX에 5를 저장

✨ 32 bit OS vs 64 bit OS

32 bit

  • 운영체제는 2^32의 메모리 주소 참조 (약 4GB RAM)
    • 실제로는 커널에 사용하는 메모리 공간을 제외해야 해서 약 3~3.5GM RAM 활용
  • CPU가 한번에 32비트 크기의 데이터 처리 (4 바이트)
  • 32비트 애플리케이션만 실행 가능 (64비트 아키텍처가 다르기 때문)
  • 메모 접근이 상대적으로 제한적 → 대규모 데이터 처리에 효율이 떨어짐

 

64 bit

  • 운영체제는 2^64개의 메모리 주소 참조 
    • 이론적으로 64비트 아키텍처는 매우 큰 메모리 공간을 다룰 수 있음
  • CPU가 한번에 64비트 크기의 데이터 처리 (8바이트)
  • 64비트  애플리케이션 지원하고 32비트 애플리케이션도 호환 모드를 통해 실행 가능
  • 고성능 컴퓨터와 서버에는 64비트 OD가 적합
  • 사용 가능한 메모리 한계 내에서 메모리 자유롭게 사용

✨ Interrupt

  •  CPU가 현재 작업을 일시 중단하고 특정 이벤트나 요청을 처리하도록 하는 신호
  • 주로 외부 장치나 소프트웨어의 요구에 즉각 대응에 사용
  • 비동기적 이벤트
    • CPU가 일정한 순서대로 작업 중 외부 장치나 특정 프로그램에서 요청 발생
    • 인터럽트에 우선순위가 있어, 더 중요한 인터럽트 먼저 처리
  • 하드웨어 인터럽트
    • ex) 키보드, 마우스, 네트워크 패킷 수신
  • 소프트웨어 인터럽트
    • ex) 입출력 요청, 메모리 할당 요청, 프로세스 생성
  • 예외
    • ex) 0으로 나누기, 잘못된 메모리 접근, 페이지 폴트

 

 

✨ Sementation Fault 

  • 잘못된 메모리 접근을 시도할 때 발생하는 오류
  • 허용되지 않은 메모리 영역을 읽거나 쓰려 할 때 발생
  • CPU가 허용되지 않은 메모리 주소에 접근하려 할 때 운영체제가 감
  • 세그멘테이션 폴트 발생 원인
    • NULL 포인터 역참조 
    • 잘못된 주소 접근
    • 배열 인덱스 초과
    • 해제된 메모리 접근
    • 읽기 전용 메모리 영역 쓰끼
    • 스택 오버 플로우