선입 선출
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
선입 선출(FIFO, First-In, First-Out)은 먼저 들어온 데이터가 먼저 처리되는 자료 구조 또는 방식이다. 컴퓨터 과학에서는 큐(queue)라고도 불리며, 데이터를 저장하고 처리하는 데 사용된다. FIFO는 하드웨어 시프트 레지스터, 원형 버퍼, 연결 리스트 등의 다양한 메모리 구조로 구현될 수 있으며, 프로세스 간 통신, 디스크 스케줄링, 네트워크 브리지 등 다양한 분야에서 활용된다. 전자공학에서는 버퍼링 및 흐름 제어를 위해 하드웨어 형태로 사용되며, 동기식과 비동기식 FIFO가 존재한다.
더 읽어볼만한 페이지
- 스케줄링 알고리즘 - 스케줄링 (컴퓨팅)
스케줄링은 운영 체제가 시스템의 목적과 환경에 맞춰 작업을 관리하는 기법으로, 장기, 중기, 단기 스케줄러를 통해 프로세스를 선택하며, CPU 사용률, 처리량 등을 기준으로 평가하고, FCFS, SJF, RR 등의 알고리즘을 사용한다. - 스케줄링 알고리즘 - 라운드 로빈 스케줄링
라운드 로빈 스케줄링은 프로세스 스케줄링에서 각 프로세스에 동일한 시간 할당량을 순환적으로 부여하는 선점형 방식이며, 네트워크 등 다양한 분야에 활용되고 가중 라운드 로빈, 결손 라운드 로빈 등 여러 변형된 방식들이 존재한다. - 사이버네틱스 - 진화 알고리즘
진화 알고리즘은 생물학적 진화 과정을 모방하여 적합도에 따라 개체를 선택하고 교차 및 돌연변이 연산을 반복하며 최적의 해를 찾아가는 계산 기술이다. - 사이버네틱스 - AI 안전
AI 안전은 인공지능 시스템의 부정적 결과를 줄이기 위한 연구 및 정책 분야로, 시스템 강건성 확보, 가치 정렬, 사이버 보안, 제도 개선 등을 포함하며 현재와 미래의 위험을 관리하기 위한 국제 협력과 거버넌스를 강조한다. - 정보 이론 - 양자 컴퓨터
양자 컴퓨터는 양자역학적 현상을 이용하여 정보를 처리하는 컴퓨터로, 큐비트를 통해 0과 1을 동시에 표현하여 특정 연산에서 기존 컴퓨터보다 빠른 속도를 보이며 암호 해독, 신약 개발 등 다양한 분야에 혁신을 가져올 것으로 기대된다. - 정보 이론 - 정보 엔트로피
정보 엔트로피는 확률 변수의 불확실성을 측정하는 방법으로, 사건 발생 가능성이 낮을수록 정보량이 커진다는 원리에 기반하며, 데이터 압축, 생물다양성 측정, 암호화 등 다양한 분야에서 활용된다.
선입 선출 |
---|
2. 컴퓨터 과학
응용 분야에 따라 FIFO는 하드웨어 시프트 레지스터로 구현될 수 있으며, 일반적으로 원형 버퍼 또는 일종의 리스트와 같은 다양한 메모리 구조를 사용할 수 있다. 추상 자료 구조에 대한 정보는 큐를 참조하라. FIFO 큐의 대부분의 소프트웨어 구현은 스레드 안전하지 않으며, 데이터 구조 체인이 한 번에 하나의 스레드에 의해서만 조작되고 있는지 확인하기 위해 잠금 메커니즘이 필요하다.
다음 코드는 연결 리스트 FIFO C++ 언어 구현을 보여준다. 실제로, 인기 있는 유닉스 시스템의 C sys/queue.h 매크로나 C++ 표준 라이브러리 std::list 템플릿을 포함하여, 처음부터 데이터 구조를 구현할 필요가 없는 다양한 리스트 구현이 존재한다.
#include
#include
using namespace std;
template
class FIFO {
struct Node {
T value;
shared_ptr
Node(T _value): value(_value) {}
};
shared_ptr
shared_ptr
public:
void enqueue(T _value) {
if (front == nullptr) {
front = make_shared
back = front;
} else {
back->next = make_shared
back = back->next;
}
}
T dequeue() {
if (front == nullptr)
throw underflow_error("Nothing to dequeue");
T value = front->value;
front = move(front->next);
return value;
}
};
프로세스 간 통신을 위한 파이프-앤-필터 모델을 지원하는 컴퓨팅 환경에서 FIFO는 이름 있는 파이프의 또 다른 이름이다.
디스크 컨트롤러는 FIFO를 디스크 스케줄링 알고리즘으로 사용하여 디스크 I/O 요청을 처리할 순서를 결정할 수 있으며, 여기서 앞서 언급한 CPU 스케줄링과 동일한 FCFS 이니셜리즘으로 알려져 있다.[1]
컴퓨터 네트워크에서 사용되는 통신 네트워크 브리지, 네트워크 스위치 및 네트워크 라우터는 FIFO를 사용하여 다음 목적지로 가는 데이터 패킷을 보관한다. 일반적으로 네트워크 연결당 최소 하나의 FIFO 구조가 사용된다. 일부 장치는 여러 종류의 정보를 동시에 독립적으로 대기열에 넣기 위해 여러 FIFO를 갖추고 있다.[3]
2. 1. 자료 구조
FIFO는 큐라고도 불리는 자료 구조의 일종으로, 데이터를 저장하고 처리하는 데 사용된다. 대한민국에서는 소프트웨어 개발 교육 과정에서 FIFO(큐) 자료 구조를 필수적으로 다루며, 알고리즘 문제 해결 및 시스템 프로그래밍 등에 활용된다.컴퓨터 과학에서 이 용어는 대기열에 저장된 자료를 처리하는 방식을 일컫는다. 대기하고 있는 각 항목은 대기열의 데이터 구조에 저장된다. 대기열에 추가된 첫 데이터는 제거될 첫 데이터가 되고, 그 다음의 이어지는 항목들 또한 이와 같은 순서가 되풀이되며 처리된다. LIFO와 스택 알고리즘도 참조하라.
큐에 저장된 데이터 처리 방법 중 하나이다. 큐상의 각 요소는 큐의 데이터 구조 내에 저장된다. FIFO 큐에서는, 처음에 저장된 데이터가 (나중에) 처음에 꺼내짐과 동시에 삭제된다. 입출력(저장과 꺼내기)은 항상 그 순서대로 이루어진다. 동의어로는 LILO(Last In Last Out)가 있다. 이는 큐의 일반적인 동작이다. 이것의 대칭으로, 선입후출(후입선출) 순서가 있으며, 스택 또는 LIFO를 참조하라.
자료 구조는 다음과 비슷하다.
```cpp
struct fifo_node {
struct fifo_node *next;
value_type value;
};
class fifo
{
fifo_node *front;
fifo_node *back;
fifo_node *dequeue(void)
{
fifo_node *tmp = front;
front = front->next;
return tmp;
}
queue(value)
{
fifo_node *tempNode = new fifo_node;
tempNode->value = value;
back->next = tempNode;
back = tempNode;
}
}
```
이 예에서, `queue(value)`는 `value`가 큐에 저장되고, `dequeue()`는 큐의 선두 데이터를 꺼내도록 되어 있다.
큐는 추상 자료 구조에 대한 더 자세한 정보를 제공한다. 일반 추가에 대한 더 자세한 정보를 보려면, 서큘러 버퍼를 참조하라.
잘 알려진 유닉스 시스템은 C/C++ 헤더 파일인 sys/queue.h를 포함하고 있으며, 이 파일은 FIFO 대기열을 만드는 응용 프로그램들에 유용하게 쓰이는 매크로를 제공한다.
2. 1. 1. 예제 코드 (C++)
cppstruct fifo_node {
struct fifo_node *next;
value_type value;
};
class fifo
{
fifo_node *front;
fifo_node *back;
fifo_node *dequeue(void)
{
fifo_node *tmp = front;
front = front->next;
return tmp;
}
queue(value)
{
fifo_node *tempNode = new fifo_node;
tempNode->value = value;
back->next = tempNode;
back = tempNode;
}
}
```
큐는 추상 자료 구조에 대한 더 자세한 정보를 제공한다. 일반 추가에 대한 더 자세한 정보를 보려면, 서큘러 버퍼를 참조하라.
잘 알려진 유닉스 시스템은 C/C++ 헤더 파일인 sys/queue.h를 포함하고 있으며, 이 파일은 FIFO 대기열을 만드는 응용 프로그램들에 유용하게 쓰이는 매크로를 제공한다.
2. 2. 프로세스 간 통신 (IPC)
운영체제에서 프로세스 간 통신(IPC)을 위한 파이프는 선입선출(FIFO) 방식으로 데이터를 전달한다. 이름있는 파이프는 파일 시스템 상에서 특별한 파일 형태로 존재하며, 프로세스들이 FIFO 방식으로 데이터를 주고받을 수 있도록 한다. 대한민국에서도 리눅스/유닉스 기반 시스템 개발 및 서버 프로그래밍에서 파이프를 활용한 프로세스 간 통신이 널리 사용된다.2. 3. 디스크 스케줄링
2. 4. 네트워크
3. 전자공학
FIFO는 하드웨어와 소프트웨어 간의 버퍼링 및 흐름 제어를 위해 전자 회로에서 일반적으로 사용된다. 하드웨어 형태의 FIFO는 주로 읽기 및 쓰기 포인터, 저장소 및 제어 로직으로 구성된다. 저장소는 정적 램 (SRAM), 플립플롭 , 래치 또는 기타 적합한 형태의 저장소일 수 있다. FIFO의 크기가 클 경우, 일반적으로 이중 포트 SRAM이 사용되며, 여기서 한 포트는 쓰기에 전용되고 다른 포트는 읽기에 전용된다.
논리 회로에서, 데이터가 흐르는 방향이 한 방향이라는 특성을 가진 기억 장치로, 버퍼링에 사용된다. 구현 방법으로는, 시프트 레지스터처럼 데이터 전체가 한 방향으로 움직이는 방법과, 주소 지정된 메모리와 쓰기/읽기 각 포인터, 제어 로직을 조합하는 방법이 있다.
중요한 역할을 하는 FIFO로는, 듀얼 포트 SRAM이 있다. 한쪽 포트는 쓰기에 사용되고, 다른 한쪽은 읽기에 사용된다.
동기형 FIFO는 읽기와 쓰기에 같은 클럭을 사용하는 것이다. 비동기형 FIFO는 다른 클럭을 사용한다. 비동기형 FIFO는 준안정성 문제를 안고 있다. 비동기형 FIFO에서는 쓰기/읽기 포인터의 번지 변화에 인크리먼트 대신 그레이 코드를 사용하여, 안정적인 신호 생성이 가능하도록 한다.
FIFO에는 몇 가지 플래그가 부속된다. 플래그는 FIFO의 상태를 나타내며, 가득 찼다거나, 곧 가득 찬다거나, 거의 비었다는 것을 나타낸다. 빈 공간이 설정된 용량 이하/이상이 되면 인터럽트를 발생시키도록 설정할 수 있는 것도 많다.
전자공학에서 구현된 최초의 FIFO는 1969년 페어차일드 반도체에서 피터 알프케에 의해 개발되었다.[4] 알프케는 나중에 자일링스의 이사가 되었다.
3. 1. 구현
하드웨어 FIFO는 읽기/쓰기 포인터, 저장소, 제어 로직으로 구성된다. 저장소로는 SRAM, 플립플롭, 래치 등이 사용될 수 있다. 큰 크기의 FIFO는 일반적으로 이중 포트 SRAM을 사용하여 읽기와 쓰기를 동시에 수행할 수 있도록 한다.동기형 FIFO는 읽기와 쓰기에 같은 클럭을 사용하는 반면, 비동기형 FIFO는 다른 클럭을 사용한다. 비동기형 FIFO는 준안정성 문제를 야기할 수 있다. 이를 해결하기 위해 비동기형 FIFO에서는 쓰기/읽기 포인터의 번지 변화에 인크리먼트 대신 그레이 코드를 사용하여 안정적인 신호 생성을 가능하게 한다.
FIFO는 상태를 나타내는 플래그를 갖추고 있으며, 플래그는 가득 찼거나, 곧 가득 차거나, 거의 비었다는 것을 나타낸다. 빈 공간이 설정된 용량 이하/이상이 되면 인터럽트를 발생시키도록 설정할 수도 있다.
최초의 하드웨어 FIFO는 1969년 페어차일드 반도체에서 피터 알프케에 의해 개발되었다.
3. 2. 동기 및 비동기 FIFO
동기식 FIFO는 읽기와 쓰기에 동일한 클럭을 사용하는 FIFO이다. 반면, 비동기식 FIFO는 읽기와 쓰기에 서로 다른 클럭을 사용하며, 이는 메타 안정성 문제를 야기할 수 있다. 비동기식 FIFO의 일반적인 구현은 안정적인 플래그 생성을 위해 읽기 및 쓰기 포인터에 그레이 코드 (또는 임의의 단위 거리 코드)를 사용한다. 플래그 생성과 관련하여 한 가지 더 유의할 점은 비동기식 FIFO 구현의 플래그를 생성하기 위해 반드시 포인터 연산을 사용해야 한다는 것이다. 반대로, 동기식 FIFO 구현에서 플래그를 생성하기 위해 누수 버킷 방식 또는 포인터 연산을 사용할 수 있다.하드웨어 FIFO는 동기화 목적으로 사용된다. 이는 종종 원형 큐로 구현되며, 따라서 두 개의 포인터를 갖는다.
- 읽기 포인터 / 읽기 주소 레지스터
- 쓰기 포인터 / 쓰기 주소 레지스터
논리 회로에서, 데이터가 흐르는 방향이 한 방향이라는 특성을 가진 기억 장치로, 버퍼링에 사용된다. 구현 방법으로는, 시프트 레지스터처럼 데이터 전체가 한 방향으로 움직이는 방법과, 주소 지정된 메모리와 쓰기/읽기 각 포인터, 제어 로직을 조합하는 방법이 있다.
FIFO에는 몇 가지 플래그가 부속된다. 플래그는 FIFO의 상태를 나타내며, 가득 찼다거나, 곧 가득 찬다거나, 거의 비었다는 것을 나타낸다. 빈 공간이 설정된 용량 이하/이상이 되면 인터럽트를 발생시키도록 설정할 수 있는 것도 많다.
3. 3. 상태 플래그
FIFO의 상태 플래그에는 가득 참(Full), 비어 있음(Empty), 거의 가득 참(Almost Full), 거의 비어 있음(Almost Empty) 등이 있다. 읽기 주소 레지스터가 쓰기 주소 레지스터와 같으면 FIFO는 비어 있고, 읽기 및 쓰기 주소 레지스터가 추가 최상위 비트에서만 다르고 나머지가 같으면 FIFO가 가득 찬 것이다. 이러한 플래그를 통해 FIFO의 상태를 모니터링하고, 데이터 오버플로우 또는 언더플로우를 방지할 수 있다.참조
[1]
서적
Modern Operating Systems
https://books.google[...]
Pearson
[2]
서적
Data Structures & Program Design (second edition)
https://archive.org/[...]
Prentice-Hall, Inc. div. of Simon & Schuster
[3]
서적
Computer Networking: A Top-Down Approach
https://books.google[...]
Addison-Wesley
2006-07
[4]
웹사이트
Peter Alfke's post at comp.arch.fpga on 19 Jun 1998
http://www.fpga-faq.[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com