동시성과 병렬성의 차이
들어가며
이번 주제에서는 Swift Concurrency에 대해 자세히 알아보기에 앞서 동시성과 병렬성에 대한 개념을 잡아보려고 해요
코드를 다른 코드와 동시에 실행한다는 것은 무엇을 의미하는 걸까요?
Computer Science에서 ‘동시’라는 단어의 의미는 2개 이상의 사건이 정확히 같은 시간에 진행되는 것을 의미하는 “same-time”을 의미하는걸까요?
그럼 시작해보시죠!
우리가 작성하는 대부분의 코드는 동시성이 없는, 단일 스레드에서 실행되는 코드
아래와 같이 동기적인 방식으로 한번에 한줄, 한줄 씩, 한 함수씩 실행돼요
func getFullName() {
let givenName = getGivenName()
let familyName = getFamilyName()
print(“\\(givenName) \\(familyName)”)
}
func getGivenName() -> String {
print("What's your given name?")
return readLine() ?? " - "
}
func getFamilyName() -> String {
print("What's your family name?")
return readLine() ?? " - "
}
getFullName()
- 위 코드는 readLine() 함수에서 사용자의 입력을 받을 때까지 대기하고 있을 거예요
- 물론 사용자의 입력을 받을 때까지 대기할 동안 아무런 작업도 하지 못합니다.
위 처럼 오래걸리는 작업 혹은 프로그램이 CPU 혹은 스레드를 계속해서 점유하지 않고 원활하게 실행되도록 하려면 동시성을 활용해야해요
CPU는 여러 작업을 동시에 수행할 수 있습니다.
여러작업을 동시에 수행한다는 것은 무엇을 말하는걸까요?
여러작업을 동시에 수행한다는 것은 하나의 작업을 동시(same-time)에 수행하는 것이 아닌, 여러 작업을 번갈아 실행하며 동시(same-time)에 수행되는 것 처럼 보이는 것을 의미해요
한 개의 Core를 가진 CPU에서도 한 개 이상의 스레드를 동시에(번갈아 가며) 실행하며 멀티 스레딩 환경을 구현할 수 있어요
그렇다면 여러 코어를 가진 CPU에서는 어떨까요?
여러 CPU Core를 가진 환경에서는 병렬로 여러 스레드를 실행할 수 있는데요,
동시성과 병렬성의 차이
이쯤에서 동시성과 병렬성의 차이에 대해 정리하면 좋을 것 같아요
동시성은 위에서 말했던 것처럼 여러 작업을 번갈아가며 수행하는 것을 의미해요
병렬성은 여러 작업을 same-time에 수행한다는 것을 의미해요
Thread Safety
여러파일에서 한줄 한줄 씩 파일을 읽어서 특정 키워드를 찾아 일치한 키워드를 결과 파일에 기록하는 상황을 가정해보겠습니다.
색이 다른 각각의 박스는 다른 스레드에서 실행되고 있다고 가정합니다.
위 작업은 어떠한 잠재적인 문제를 가지고 있을까요?
여러 스레드가 정확하게 same-time에 일치한 특정 키워드를 기록하려고 할 때 데이터 레이스가 발생하게 됩니다.
기록하는 작업이 원자적으로 이루어진다는 전제하에서는 동시적으로 일치한 항목을 기록하려고 하면 괜찮지만, 병렬로 일치한 항목을 기록할 경우 데이터의 일관성이 깨지게 되는 문제가 발생할 수 있어요
위와 같은 상황 이외에도 멀티스레드 환경에서는 적어도 하나가 쓰기 연산을 수행할 때 데이터 레이스의 위험이 따르는데요,
예측 불가능한 결과를 방지하기 위해 멀티스레드 환경에서 작업할 때는 데이터 레이스를 피하기 위한 적절한 동기화 메커니즘을 사용해야 해요.
예를 들어 뮤텍스(Mutex)나 세마포어(Semaphore) 같은 도구를 사용하여 공유 자원에 대한 접근을 조절하고, 원자성을 보장할 수 있는 연산을 사용해야합니다.
마치며
이번 시간에는 동시성과 병렬성의 차이에 대해 알아보았는데요, Swift Concurrency에서는 앞서 살펴본 문제들을 어떻게 해결했는지 다음 글들을 통해서 알아보도록 하겠습니다 :)