스택(LIFO)

먼저들어온 데이터가 나중에 나가는 구조

스택(stack)은 말 그대로 '쌓아놓은 더미'를 뜻합니다. 식당에 쌓여있는 접시 더미, 책상에 쌓인 책, 겹겹이 쌓인 상자 모두 스택의 예에 해당합니다. 이 중에서도 가장 대표적인 예시로 '프링글스(Pringles)'를 들 수 있겠습니다.

스택의 일상생활 활용 예시

ex)
웹 브라우저 뒤로 가기 : 가장 나중에 열린 페이지부터 뒤로 가기를 실행합니다.
문서작업에서 Ctrl+Z : 가장 나중에 수정한 내역부터 되돌립니다.
역순 문자열 만들기 : 맨 끝의 문자열부터 차례대로 만들어집니다.
후위 표기법 계산

예제 코드

stack = []

stack.append('a')
stack.append('b')
stack.append('c')

print(stack)
topElement = stack.pop()
print(topElement)
print(stack)

실행

['a', 'b', 'c']
c
['a', 'b']

큐(FIFO)

먼저들어온데이터가 먼저 나가는 구조

ex)
콜센터 고객 대기시간
프린터의 출력 처리
윈도 시스템의 메시지 처리기
프로세스 관리

예제코드

#Queue 모듈 추가
from queue import Queue

#인자값으로 maxSize를 정할 수 있습니다. 만약 인자값이 0이하인 경우 큐의 크기는 무한대가된다
q = Queue()

#요소추가
q.put("apple")
q.put("banana")
q.put("cherry")

#요소제거및 반환
print(q.queue) #큐 출력
print(q.get())#apple
print(q.queue)
print(q.get())#banana
print(q.queue)
print(q.get())

#큐가 비어있는지 확인 남아 있다면 "false" 비었다면 "Ture"출력
print(q.empty())

실행

apple
banana
False

+++추가적인 개념

스레드

운영체제에서 스레드는 프로세스 내부에서 실행되는 작은 작업 단위이다. 스레드는 프로세스의 실행 흐름을 구성하는 단위로, 하나의 프로세스는 내부에 여러개의 스레드가 포함될 수 있다.

[개념] 스레드

프로세스들이 서로의 데이터에 접근하는것이 직접적으로 불가능한데 반면, 스레드는 프로세스 내부에 존재하기에 프로세스의 데이터 영역에 접근이 가능하다. 그리고 스레드들끼리 서로의 데이터에 접근 가능하다. IPC 필요없이 프로세스의 데이터를 가져올 수 있다.

스레드도 일종의 작업 단위라서, 프로세스처럼 작업이 처리된다(리눅스에선 스레드를 Light Weight Process라고 부르는데, 프로세스 취급을 하는 것이다) 이 말은 즉, 스레드도 프로세스처럼 작업을 병렬로 처리해서 속도를 높일 수 있다는 것이다.

스레드는 일종의 함수로 구현된다. 스레드도 함수라서 데이터(지역 변수)를 다루고, 데이터를 관리하기 위해 stack 메모리 영역을 가진다. 이 stack공간은 프로세스가 가지는 stack 메모리 영역과는 별개이며, 스레드의 메모리 영역을 thread stack이라고 부른다.

프로세스는 메모리 영역을 크게 4가지(code, data, stack, heap)으로 나눌 수 있지만, 스레드는 thread stack 메모리 공간만 갖게된다.

멀티 스레드

멀티 스레드는 하나의 프로세스 내부에서 여러 개의 스레드가 동시에 실행되는 것이다.

[개념] 멀티 스레드

스레드끼리는 서로의 메모리 공간(thread stack)을 공유하고 접근할 수 있다.

IPC 통신이 아닌 메모리 기반 통신을 사용하기에 통신 속도가 빠르다.

각 스레드들은 여러 자원을 공유하기에, 하나의 스레드에 문제가 생기면 나머지 스레드들도 영향을 받을 수 있다.

프로세스 내에서 스레드의 작업을 여러개로 분할(쪼개서) 병렬로 처리할 수 있다.

java 스레드

Java에서는 멀티 스레드를 통해 ‘비동기식 및 병렬 애플리케이션’ 제작가능

비동기식 및 병렬 애플리케이션이란?

애플리케이션이 실행 중인 동안 사용자가 다른 작업을 수있도록 할수있음

profile
컴퓨터 소프트웨어 공학과 3학년 / 모빌리티 전공 (복수전공)

0개의 댓글