1. 큐 구조
- 가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조
- 웨이팅할 때, 가장 먼저 줄 선 사람이 가장 먼저 입장하는 것과 동일
- FIFO(First-In / First-Out) : 가장 먼저 들어 간 데이터 가장 먼저 나옴
- LILO(Last-In / Last-Out) : 가장 마지막으로 들어간 데이터 가장 마지막에 나옴
2. 용어
- Enqueue : 큐에 데이터를 넣는 기능
- Dequeue : 큐에서 데이터를 꺼내는 기능
3. 파이썬 queue 라이브러리
- Queue() : 가장 일반적인 큐
- LifoQueue() : 나중에 들어간 데이터가 먼저 나오는 구조를 가진 큐(=스택)
- PriorityQueue() : 우선순위 큐, 데이터마다 우선순위도 넣어서 우선순위가 높은 순으로 데이터 나옴
4. Queue() 사용
import queue
queue_data = queue.Queue()
4-1) queue 데이터 삽입
queue_data.put("queue1")
queue_data.put("queue2")
queue_data.put("queue3")
4-2) queue 크기
queue_data.qsize()
# 출력 화면 : 3
4-3) queue 데이터 추출
queue_data.get()
# 출력화면 : queue1
'''
# 큐 순서대로 출력해보기
for i in range(queue_data.qsize()):
print(queue_data.get())
# 출력 화면 :
queue1
queue2
queue3
queue_data.qsize()
# 출력 화면 : 0
'''
5. LifoQueue() 사용
import queue
queue_data = queue.LifoQueue()
5-1) LifoQueue 데이터 삽입 및 추출
queue_data.put("queue1")
queue_data.put("queue2")
queue_data.put("queue3")
queue_data.get()
# 출력 화면 : queue3
6. PriorityQueue() 사용
import queue
queue_data = queue.PriorityQueue()
6-1) PriorityQueue() 데이터 삽입 및 추출
import queue
queue_data = queue.PriorityQueue()
queue_data.put(5)
queue_data.put(2)
queue_data.put(10)
queue_data.get()
# 우선순위가 가장 높은(오름차순) 2를 반환
# 출력 화면 : 2
# * 튜플 형식으로 삽입했을때 (튜플의 0번째 인덱스를 우선순위로 여긴다.)
queue_data.put((5,"queue1"))
queue_data.put((1,"queue2"))
queue_data.put((10, "queue3"))
queue_data.get()
# 우선순위 큐는 우선순위를 오름차순으로 하여 반환함 따라서 1이 들어간 튜플부터 반환.
# 출력 화면 : (1, 'queue2')
# 튜플의 1번째 인덱스 값을 가져오고싶을 때
queue_data.get()[1]
# 위에서 (1, 'queue2') 출력됐으므로 그 다음 우선순위인 5를 가지고있는 튜플을 가져와 그 튜플의 1번째 인덱스 값 반환
# 출력 화면 : queue1
7. list로 queue 다루기(enqueue, dequeue 기능 구현)
queue = [1,2,3,4,5]
def enqueue(data):
queue.append(data) # .append() 함수를 사용하면 뒤에 데이터를 추가
def dequeue():
queue.pop(0) # .pop(0) 함수를 이용하여 맨 앞의 데이터를 제거 -> * pop()은 맨 뒤 데이터 제거 괄호안에 맨앞 인덱스인 0 추가해줘야함
# 또는 del queue[0]으로 써도 된다.
enqueue(6)
print(queue) # 출력 화면 : [1, 2, 3, 4, 5, 6]
dequeue()
print(queue) # 출력 화면 : [2, 3, 4, 5, 6]
큐의사용
- 프로세스 스케쥴링 방식 구현
더보기
* 프로세스 스케쥴링(CPU스케쥴링) : 여러 프로세스들 중에서 하나의 프로세스를 선택하여 적절한 CPU에 배치.
프로세스의 CPU 이용을 최대화하여 사용되지않는 CPU를 최소화
* 프로세스들을 스케줄링하기 위해 ‘스케쥴링 큐’ 라고 불리는 3개의 큐를 사용하여 프로세스 관리