미새문지

크래프톤 정글 week09, day72 - 32bit OS vs 64bit OS, Segmentation Fault, Interrupt, 시스템 콜 도돌이표 본문

크래프톤 정글/TIL

크래프톤 정글 week09, day72 - 32bit OS vs 64bit OS, Segmentation Fault, Interrupt, 시스템 콜 도돌이표

문미새 2024. 3. 20. 00:32
728x90

32bit OS vs 64bit OS

32비트 OS와 64비트 OS는 컴퓨터 운영체제의 두 가지 주요 유형이며, 주로 데이터 처리와 메모리 관리 능력에서 차이를 보인다.

기본 개념

  • 32비트 운영체제(32-bit OS)
    • 이 운영체제는 32비트로 구성된 주소를 사용해 데이터를 처리한다.
    • 즉, 한 번에 32비트(4바이트)의 데이터를 처리할 수 있다.
  • 64비트 운영체제(64-bit OS)
    • 이 운영체제는 64비트로 구성된 주소를 사용해 데이터를 처리한다.
    • 즉, 한 번에 64비트(8바이트)의 데이터를 처리할 수 있어, 훨씬 더 큰 범위의 데이터를 빠르게 처리할 수 있다.

 

메모리 관리

  • 32비트 OS
    • 최대 4GB의 메모리(램)만을 직접 관리하고 사용할 수 있다.
    • 이는 2의 32승(약 4.3억) 개의 주소를 할당할 수 있기 때문인데, 실제로는 시스템 예약 공간 때문에 사용 가능한 메모리가 4GB 미만일 수 있다.
  • 64비트 OS
    • 이론적으로 2의 64승(약 1.84 x 10^19) 개의 주소를 할당할 수 있어, 실질적으로 무한에 가까운 메모리를 지원한다.
    • 현실적으로는 하드웨어의 물리적 한계와 운영체제의 구현에 따라 최대 지원 메모리 용량이 결정되며, 대부분의 64비트 시스템은 수 테라바이트(TB)의 램을 지원한다.

 

성능

  • 32비트 OS
    • 오래된 하드웨어와의 호환성이 뛰어나고, 더 적은 메모리를 사용하여 실행될 수 있다.
    • 하지만, 데이터 처리량이나 메모리 요구량이 큰 최신 애플리케이션을 실행하기에는 제한적일 수 있다.
  • 64비트 OS
    • 더 큰 데이터를 더 빠르게 처리할 수 있으며, 고용량 메모리를 효율적으로 관리할 수 있다.
    • 따라서 대용량 데이터를 처리하거나 고성능을 요구하는 최신 애플리케이션과 게임에 적합하다.

 

호환성

  • 32비트 애플리케이션은 64비트 OS에서도 실행될 수 있지만, 그 반대는 불가능하다. 즉, 64비트 애플리케이션은 32비트 OS에서 실행할 수 없다.
  • 현대의 대부분의 소프트웨어와 운영체제는 64비트를 기본으로 하고 있으며, 32비트 지원은 점차 줄어들고 있다.

64비트 OS는 메모리 관리와 데이터 처리 능력에서 32비트 OS보다 월등한 성능을 제공하지만, 오래된 소프트웨어나 시스템 요구 사항 때문에 32비트 OS를 사용해야 하는 경우도 있다.

 


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

컴퓨터 프로그래밍에서 자주 마주치는 오류이며, 프로그램이 잘못된 메모리 영역에 접근하려고 시도할 때 발생한다.

즉, 프로그램이 허용되지 않은 메모리 영역을 읽거나 쓰려고 할 때 운영체제가 해당 프로그램을 중단시키면서 발생하는 오류이다.

발생 원인

  • 포인터 오류
    • 잘못된 주소 참조 : 초기화되지 않은 포인터를 사용하거나, 이미 해제된 메모리를 참조하는 경우
    • 널 포인터 참조 : 널(NULL) 포인터를 참조하여 해당 위치에 접근하려고 시도하는 경우
  • 배열 범위 초과
    • 배열의 범위를 초과하여 접근하려고 할 때
    • 예를 들어 크기가 10인 배열의 11번째 요소에 접근하려고 시도하는 경우
  • 스택 오버플로우
    • 재귀 함수가 너무 깊게 호출되어 스택 메모리가 고갈되는 경우
    • 이는 스택 메모리 영역을 벗어나는 것으로 간주될 수 있다.
  • 메모리 권한 위반
    • 읽기 전용 메모리 영역에 쓰려고 시도하거나, 실행 권한이 없는 메모리 영역에서 코드를 실행하려고 시도하는 경우

 

처리 방법

  • 디버깅 도구 사용 : gdb와 같은 디버깅 도구를 사용해 오류가 발생하는 정확한 위치와 원인을 파악한다.
  • 포인터 검사 : 포인터를 사용하기 전에 항상 NULL이 아닌지 확인하고, 초기화되었는지 확인한다.
  • 배열 접근 : 배열을 접근할 때는 항상 배열의 범위를 확인해 초과하지 않도록 한다.
  • 재귀 제한 : 재귀 함수를 사용할 때는 재귀 깊이에 제한을 두어 스택 오버플로우를 방지해야 한다.

세그멘테이션 폴트는 프로그램의 안정성과 보안에 직접적인 영향을 미칠 수 있기 때문에, 프로그래밍 시 주의 깊게 코드를 작성하고, 오류를 발견하면 즉시 수정하는 것이 중요하다.


Interrupt(인터럽트)

컴퓨터 운영체제에서 매우 중요한 역할을 하는 메커니즘이며, 이는 프로그램 실행 중에 발생하는 이벤트나 조건에 대한 처리를 운영체제가 즉각적으로 인지하고 대응할 수 있게 해준다.

인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.

하드웨어 인터럽트

  • 하드웨어 인터럽트는 주변 장치(키보드, 마우스, 네트워크 카드 등)로부터 발생하는 신호에 의해 발생한다.
  • 예를 들어, 사용자가 키보드를 누를 때마다 키보드 컨트롤러는 CPU에 인터럽트 신호를 보내며, 이를 통해 운영체제는 해당 키 입력을 처리할 수 있다.
  • 하드웨어 인터럽트는 CPU 외부의 이벤트에 의해 발생한다.

소프트웨어 인터럽트

  • 소프트웨어 인터럽트는 프로그램 내부에서 실행 중인 명령어에 의해 발생한다.
  • 이는 주로 시스템 호출(syscall)이나 예외 상황에서 사용되며, 예를 들면 프로그램이 파일을 읽으려 할 때, 운영체제에 파일 접근을 요청하는 시스템 호출을 통해 소프트웨어 인터럽트가 발생한다.
  • 소프트웨어 인터럽트는 CPU 내부의 이벤트나 프로그램의 명령에 의해 발생한다.

인터럽트 처리 과정

  1. 인터럽트 발생 : 하드웨어 또는 소프트웨어 인터럽트가 발생한다.
  2. 현재 작업 중단 : CPU는 현재 실행 중인 작업을 중단하고, 현재 상태(레지스터 값 등)를 저장한다.
  3. 인터럽트 서비스 루틴(ISR) : 운영체제는 인터럽트의 종류를 확인하고 해당 인터럽트를 처리하기 위한 ISR를 실행한다.
  4. 작업 복원 및 계속 실행 : ISR 실행이 끝나면, 중단되었던 작업의 상태를 복원하고 작업을 계속 진행한다.

인터럽트의 중요성

  • 인터럽트는 다중 작업 환경과 실시간 시스템에서 필수적인 메커니즘이다.
  • 이를 통해 운영체제는 다양한 외부 이벤트와 내부 명령에 효율적으로 대응할 수 있으며, 시스템 자원을 효과적으로 관리하고, 사용자 요청을 신속하게 처리할 수 있다
  • 또한, 인터럽트는 시스템의 반응성과 성능을 향상시키는데 기여한다.

어제까지의 결과에서 몇 개를 더 수정해서 패스했다. create-exist 테스트는 코드를 비교해봐도 다른게 없었는데 처음 작성한 process_wait 함수에서 for문을 너무 적게 돌려 테스트가 끝나기전에 종료가 되버린게 원인이였다. 그래서 두 배로 올려주고 테스트 했더니 통과!

 

< 기존 테스트 >

35개 FAIL

 

open과 write부분을 어느정도 하고 fork를 들어갔는데 fork를 작성하기 위해 쓰레드 구조체에 변수가 너무 많이 들어가서 이걸 과연 스스로 생각하고 작성할 수 있을지 의문이 들었다. 재희님도 예비군에서 복귀해서 바로 달렸는데 fork에서 무한 로딩이 걸렸다. 아마 process에서 sema down을 해주고 블락되있는 동안 무한 로딩이 걸린거 같은데 코드를 디버깅하면서 잘못된 부분을 찾아 수정하고 다시 테스트 해본 결과 기존에 테스트하려던 fork와 이미 완료한 wait, write,read 부분은 다 에러가 발생하고, 오히려 후반 부분인 뭔지도 모를 lg와 sm이 테스트가 성공했다. 이 부분은 내일 다시 확인해보며 수정해볼 계획이다.

 

< 수정된 테스트 >

38개 FAIL?? 늘었다

 

 

학습 시간 : 10 ~ 25시

728x90