티스토리 뷰
동시성 : 싱글 스레드에서 여러가지 작업을 번갈아가면 동작 시킴
병렬성 : 멀티 스레드에서 여러가지 작업을 동시에 동작 시킴
데이터 레이스 : 여러 프로세스/스레드가 공유된 데이터를 읽고 쓰는 작업을 할 때 실행 순서에 따라서 잘못된 값을 읽거나 쓰게 되는 상황. 병렬 처리를 하는 경우에 아주 흔하게 발생하므로 뮤텍스, 세마포어 등으로 처리해준다.
간단하게 동시성은 1개의 코어로 여러 일을 번갈아 가면서 동시에 하는것 처럼 실행 시키는것 이고 병렬성은 여러개의 코어로 여러 일을 동시에 실행 시키는것 이다.
싱글 스레드를 쓰는 언어는 Python, Javascript 등이 있고
멀티 스레드를 쓰는 언어는 Go, Java, Rust 등이 있습니다.
간단한 예제 (javascript)
var v = 0
setTimeout(function() {
for (let i=0; i<100000; i++) {
v += 1
}
}, 1000)
setTimeout(function() {
for (let i=0; i<100000; i++) {
v -= 1
}
}, 1000)
setTimeout(function() {
console.log(v)// 0
}, 2000)
1초 후 동시에 v라는 변수에 100000번을 더하고, 100000번을 빼는 코드 입니다.
자바스크립트는 싱글코어 이기 때문에 두 일정 시간 뒤에 함수를 실행시키는 비동기 함수인 setTimeout() 함수는 동시성을 띄고 실행이 됩니다. 100000 을 더하고 100000을 뺐으니 당연히 결과는 0이 나옵니다.
package main
import (
"fmt"
"time"
)
func main() {
v := 0
go func() {
for i := 0; i < 100000; i++ {
v += 1
}
}()
go func() {
for i := 0; i < 100000; i++ {
v -= 1
}
}()
time.Sleep(time.Second * 2)
fmt.Println(v) // 실행시킬 때마다 값이 달라짐
}
비슷한 방법으로 멀티 스레드를 사용하는 go언어의 go루틴으로 코드를 돌려보면 -53042, 54572, -74298 등 돌릴 때마다 다른 값들이 출력 됩니다. 하나의 변수에 두개의 코어가 동시에 접근해서 발생하는 문제 입니다.
위와 같은 상황이 데이터 레이스 상태 입니다. go언어 에서는 이를 방지 하기 위해 mutex를 이용하여 한 자원을 동시에 사용하지 못하도록 Lock을 걸어 줄 수 있습니다.
mutex.Lock()
v += 1
mutex.Unlock()
- Total
- Today
- Yesterday
- Two Scoops of Django
- query
- conTeXt
- ManyToMany
- 문자열 뒤집기
- stdout
- gunicorn
- taggit
- 의대 신경학 강의
- 파이썬
- dfs
- 독후감
- 소프트웨어 장인
- go context
- for-else
- 팰린드롬수
- leetcode
- go
- 백준
- django
- Python
- 방금그곡
- sql lite
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |