FAT ( File Allocation Table ) 파일 시스템  



  마이크로소프트사의 빌게이츠가 만들어쏙, 전 세계적으로 많이 사용되는 파일 시스템 중의 하나이며, 초기에 만들어진 파일시스템이다. 처음 만들어진 이후 여러 번의 발전을 거듭해 왔지만, 최초 제작 당시에는 고려하던 저장장치의 크기가 매우 작았으며 성능상의 문제는 큰 이슈로 작용하지 않았다. 따라서 매우 단순한 구조를 지니고 있으며 최근에는 대용량 저장장치를 지원하기 위해 FAT16, FAT32 등이 만들어진 이후 윈도우 OS의 흥행과 더불어 지금도 널리 사용되고 있다. 이렇나 FAT 파일시스템의 범용성은 휴대용 장치들과 PC와의 호환성을 높여주는 결과를 가져왔으며, 이동식 저장장치들은 FAT 파일 시스템을 설치하기만 하면 별도의 설치 과정 없이 엔드유저(End User)들의 PC에서 간편하게 읽어 들일 수 있게 만들었다. 파일 시스템에서 사용되는 부가 기능은 적고, 제약 사항들은 많은 단점이 있었으나 그만큼 가볍고 심플한 느낌을 갖게 한다. 하짐나 그에 따른 여러 문제점들이 생기게 되는데, 연결 리스트를 사용한 자료구조는 검색 시간이 오래 걸리게 하는 결과를 초래하였으며, 파일 데이터 블록들이 여기저기 흩어지는 단편화 현상이 심해져서 한 파일의 데이터를 읽어 들이는 데에도 디스크 헤드가 여러 번 이동하게 만들었다. 이를 위해 디스크 조각 모음 등의 부가적인 프로그램이 등장하기도 하였지만 근본적인 해결책은 되지 않았으며 서버 시스템 등에서 사용되기에는 여러 가지 부족함이 많은 파일 시스템이었기에 이후 여러 파일시스템들이 이를 개선하기 위해 등장하게 된다.


----------------------------------------------- IT EXPERT 임베디드 개발자를 위한 파일시스템의 원리와 실습 中----

 오브젝트 코드 파일, 실행 파일, 라이브러리

 

 C 프로그래밍에서의 기본 전략은, 자신이 만든 소스 코드 파일을 실행 가능한 기계어 코드를 가진 파일인 실행 파일로 변환시켜 주는 프로그램을 사용하는 것이다. 이 과정은 컴파일링(compiling)과 링킹(linking)이라는 두 단계를 거쳐서 이루어진다. 컴파일러(compiler)는 소스 코드를 중간 단계의 코드로 변환시키며, 링커(linker)는 실행 파일을 만들기 위해 다른 코드(시스템 라이브러리 파일과 중간 단계에서 생성되는 오브젝트 코드)를 결합해 주는 역할을 한다. C는 프로그램의 모듈화가 가능하도록 이와 같은 두 가지 접근법을 사용한다. 컴파일러로 각각의 모듈을 따로 컴파일한 후, 컴파일된 모듈들을 나중에 링커로 합칠 수 있다. 따라서, 전체 프로그램 중에서 특정 모듈만 수정한 겨우, 수정한 모듈을 제외한 나머지 다른 모듈들은 다시 컴파일 할 필요가 없다.

 

 중간 단계 파일의 형태에는 몇 가지가 있다. 가장 널리 쓰이는 방식은 소스 코드를 오브젝트 코드 파일(object code file, 또는 간단히 줄여서 오브젝트 파일)이라 불리는 기계어로 변환하는 것이다.(여기서는 소스 파일이 한 개의 파일로 이루어져싿고 가정하자). 비록 오브젝트 파일이 기계어 코드를 포함하고 있지만 아직 실행할 준비는 되어 있지 않다. 오브젝트 파일이란 소스 코드를 단순히 기계어 코드로 번역했을 뿐 완전한 프로그램이 아니기 때문이다.

 

 오브젝트 파일이 가지고 있지 않은 첫번째 요소가 스타트 업(start-up) 코드다. 이 코드는 프로그램과 운영체제 사이의 인터페이스를 담당한다. 예를 들어, IBM PC에서는 DOS Linux를 운영체제로 사용할 수 있다. 두 경우 모두 똑같은 하드웨어에서 운영되므로 똑 같은 오브젝트 코드가 있다면 두 운영체제에서 똑 같은 작용을 한다. 그러나 Linux Dos 운영체제는 프로그램들을 처리하는 방식이 다르기 때문에 각자 독특한 스타트 업 코드가 필요하다.

 

 두 번째로 부족한 코드 요소는 라이브러리 루틴에 대한 코드다. 거의 모든 C 프로그램은 표준 C 라이브러리의 일부분인 루틴들을 사용한다. – 생략 실제 코드는 라이브러리(library)라 불리는 다른 파일에 저장되어 있다. 라이브러리 파일은 수많은 함수에 댛나 오브젝트 코드를 포함하고 있다. 링커(linker)의 역할은 이러한 세 가지 요소(오브젝트 코드, 각 시스템에 대한 표준 스타트 업 코드 및 라이브러리 코드)를 묶어서 하나의 파일 즉, 실행 파일로 만들어주는 것이다. 링커는 사용하려는 함수에 대한 코드를 라이브러리로부터 추출한다.

 

사용자 삽입 이미지

 

 간단히 말해서 오브젝트 파일과 실행 파일 모두 기계어 명령어들로 이루어져 있다. 그러나 오브젝트 파일은 사용한 코드를 단순히 기계어로 번역한 것에 불과하지만, 실행 파일은 사용된 라이브러리 루틴에 대한 기계어 코드는 물론 스타트 업 코드도 포함하고 있다.

 

 어떤 시스템에서는 컴파일러와 링커를 별도로 실행해야 하는 경우도 있으며, 또 어떤 시스템에서는 컴파일러가 링커를 자동으로 호출하여 실행 파일을 한번에 만드는 컴파일러도 있다.


------------------------------------------------------------------------------------------------------------------------- C 기초 플러스 중 -------

Selection sort & Heap sort & Quick sort  정렬 속도 비교




사용자 삽입 이미지


학교 과제로 나온 ... 시간 복잡도를 비교하는 과제 ...

음 ... quick 정렬이 나름 제일 빠른 줄 알았지만 ( nlogn 이라고 하지만 ... ) 이런 속도 차이가 ...

selection, insert, bubble 등 이런 정렬들은 ... 일정 자릿수 이상의 값을 입력 하였을 시에 ...

미칠듯한 정렬 시간이 나왔다.

첨부 된 그림은 실제로 적용 해 본 후 나온 결과 화면 ...


※ 정렬 되지 않은 자료일 경우 정렬하는데 얼마 걸리지 않는데, 정렬 된 자료 일 경우 ... 생각보다 시간이 걸렸다. 여러 책에 따르면 Quick sort는 정렬된 자료일 경우 정렬하는데 걸리는 시간이 더 걸린다고 하는데 ... 으흠 ... 쏘스에 따라 달라짐은 이를 어떡하랴 ?

화면을 클릭하면 크게 보일까? 흠흠 ...

( 테스트한 자료는 ... 50,000 에서부터 시작하여 2,000,000 까지의 데이터를 무작위로 생성하여 테스트 하였다. JAVA로 작업 하였음 )


- PS -
 이론상 Quick sort의 경우 정렬된 경우는 위의 결과처럼 나오지 않는다. 즉 복잡도가 증가해서 Selection sort의 경우처럼 느린 경우를 볼 수 있다.
 즉 작성하는 소스에 따라서 결과값은 달리 나온다.

/*
SelectionSort : sort contiguous list by the selection sort method.
Pre : The contiguous list list has been created. Each entry of list contains a key.
Post : The entries of list have been rearranged so that the keys in all the entries are sorted into nondecreasing order.
Uses : MaxKey, Swap
*/

void SelectionSort( List * list ){
   Position current; /* position of place being correctly filled */
   Position max; /* position of largest remaining key */
   for ( current = list -> count - 1; current > 0; current-- ){
      max = MaxKey ( 0, current, list );
      Swap ( max, current, list );
   }
}


/*
MaxKey : find the position of the largest key in the sublist.
Pre : The contiguous list list has been created. low and high are valid positions in list.
Post : The position of the entry between low and high with the largest key is returned
*/

Position MaxKey( Position low, Position high, List * list ){
   Position largest; /* position of largest key so far */
   Position current; /* index for the contigous list */
   largest = low;
   for( current = low + 1; current <= high; current++ )
      if( LT( list->entry[ largest ].key, list->entry[ current ].key ) )
         largest = current; 

   return largest;
}


/*
Swap : swap two entries in the contiguos list.
Pre : The contiguos list list has been created. low and high are valied positions in list.
Post : The entry at position low is swapped with the entry at position high
*/

void Swap( Position low, Position high, List * list ){
   ListEntry temp = list->entry[ low ];
   list->entry[ low ] = list->entry[ high ];
   list->entry[ high ] = temp;
}


/* 발췌 ---------------- Data Structures And Program Design in C */

public class Test {
   public static void main(String [] args){
      int [] array = { 7, 2, 3, 1, 5, 6 };
      SelectionSort selectionSort = new SelectionSort(array);
      selectionSort.runSort();
      selectionSort.print();
   }
}

class SelectionSort{
 
   int [] array;
 
   public SelectionSort(int [] array){
      this.array = array;
   }
 
   public void runSort(){
      int current;
      int max;
      for( current = array.length-1; current > 0 ; current-- ){
         max = this.getMaxKey( 0, current , array);
         runSwap( max, current, array );
      }
   }
 
   public int print(){
      int length = this.array.length;
      for( int count = 0; count < length; count++ )
         System.out.println(array[count]);
      return length;
   }
 
   private int getMaxKey( int low, int high, int [] array ){
 
      int largest;
      int current;
      largest = low;
 
      for( current = low+1 ; current <= high; current++ ){
        if( array[ largest ] <= array[ current ] ){
           largest = current;
        }
     }
 
    return largest;
 }
 
   private void runSwap( int low, int high, int [] array ){
      int temp = array[ high ];
      array[ high ] = array[ low ];
      array[ low ] = temp;
   }
}

+ Recent posts