Home Get Next Line ③ 방향 탐색
Post
Cancel

Get Next Line ③ 방향 탐색

구현 방법

간략한 방법

  1. ‘\n’가 포함된 버퍼까지 읽는다.
  2. ‘\n’의 뒷부분 저장
  3. 계속 읽는다.
  4. EOF가 나오면 중단

해결방향

포인터로 해결이 가능한 mandatory 파트와 달리 추가적인 fd를 고려해야 하는 bonus 파트의 경우 해결방법이 둘로 나뉜다.

  • 포인터 배열을 활용한 풀이 (주로 OPEN_MAX)
  • 가변크기 자료구조를 활용한 풀이 (주로 연결 리스트)

나는 아래의 몇가지 사항을 고려하여 최종적으로 OPEN_MAX를 활용해서 과제를 수행하였다.

OPEN_MAX 사용

  • 문제점
    1. limits.h 관련
      a. 사용자가 ulimit -Hnulimit -Sn 를 통해 OS의 fd limit(OPEN_MAX값)을 변경한다면 함수에 Segmentation fault가 발생할 수 있다. (관련 링크)
      b. norminette 문서 위배(허용된 함수의 표준라이브러리 외 include 및 매크로 상수 사용)
    2. 메모리 관련
      a. 파일을 한개만 열어서 fd가 한개만 필요한 상황에서도 비효율적으로 RAM을 점유하게 될 수 있다. </br>
  • 해결방안
    1. limits.h 관련
      a. 헤더파일에 OPEN_MAX 상수를 직접 정의해서 사용
    2. 메모리 관련
      a. mandatory: 배열, bonus: OPEN_MAX 로 해결방식을 다양화 해서 mandatory에서 파일이 한개만 열릴 때의 문제 예방
  • 이 방법을 선택한 이유
    • 탐색과정의 효율성: fd=n일때의 시간복잡도 → 배열은 값을 바로 찾을 수 있지만 연결리스트는 맨 앞부터 n번째까지 탐색해야 한다.
    • fd값의 확률: 연결리스트의 장점인 OPEN_MAX 이상의 값을 처리하는 경우보다 그 이하의 값을 처리는 경우가 훨씬 많다고 판단한다. 범위를 벗어가서 생기는 문제는 gnl함수에서 fd값의 유효성을 체크하는 부분에서 처리한다.

Ref.

GNL OPEN_MAX vs Linked list?
링크 1, 링크 2

연결 리스트, 배열 시간복잡도 차이

This post is licensed under CC BY 4.0 by the author.

Get Next Line ② 배경 지식

배열과 포인터를 활용한 다양한 표현