일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- range
- window
- 리뷰
- go언어
- 영화
- Close
- go
- channel
- Sync
- json
- bitcoin
- Python
- Golang
- C
- package
- API
- mutex
- tcp
- 책
- JavaScript
- write
- http
- c++
- Linux
- GO 언어
- Callback
- windows
- File
- FOR
- install
- Today
- Total
목록Sync (6)
Code Habit
C++ 개발을 하면서 여러 일을 동시에 처리해야 할때 멀티 쓰레드를 사용하여 처리한다. 이때 여러 쓰레드에서 동시에 일을 처리하기 위해 코어에서 쓰레드 사이를 옮겨다니며 컨텍스트 스위칭이 발생하는데 이는 자칫하면 부하를 일으켜 성능 저하를 유발하곤 한다. 하여 Go언어에서는 컨텍스트 스위칭 비용을 절약하기 위해 Go루틴이라는 Go 런타임에서 직접 관리하는 경량쓰레드를 제공한다. Go루틴은 명령을 수행하는 단일 흐름으로 OS 스레드를 이용하는 경량 스레드이다. Go언어는 CPU 코어, OS 스레드, 소루틴을 서로 조율하여 사용해 고루틴을 효율적으로 다룬다. 고루틴을 이용하면 코어와 스레드는 변경되지 않고 오직 고루틴만 옮겨 다니기 때문에 컨텍스트 스위칭이 일어나지 않는다. OS 스레드를 직접 사용하는 다른..
go 언어는 sync패키지의 WaitGroup을 통해 대기 그룹을 제공한다. 대기 그룹은 고루틴이 끝날때까지 대기한다. sync 패키지에서 제공하는 대기 그룹의 구조체와 함수는 다음과 같다. sync.WaitGroup func (wg *WaitGroup) Add(delta int) : 대기 그룹에 고루틴 개수 추가 func (wg *WaitGroup) Done(): 고루틴이 끝났다는 것을 알려줄 때 사용 func (wg *WaitGroup) Wait(): 모든 고루틴이 끝날 때까지 기다림 package main import { "fmt" "runtime" "sync" } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 wg := new(s..
풀은 객체(메모리)를 사용한 후 보관해두었다가 다시 사용하게 해주는 기능이다. 객체를 반복해서 할당하면 메모리 사용량도 늘어나고, 메모리를 해제해야 하는 가비지 컬렉터에게도 부담이 된다. 즉 풀은 일종의 캐시라고 할 수 있으며 메모리 할당과 해제 횟수를 줄여 성능을 높이고자 할 때 사용한다. 그리고 풀은 여러 고루틴에서 동시에 사용할 수 있다. Sync 패키지에서 제공하는 풀의 구조체와 함수는 다음과 같다. sync.Pool func (p *Pool) Get() interface{} : 풀에 보관된 객체를 가져옴 func (p *Pool) Put(x interface{}) : 풀에 객체를 보관 사용 예제이다. package main import ( "fmt" "math/rand" "runtime" "sy..
Once를 사용하면 함수를 한 번만 실행할 수 있다. Sync 패키지에서 제공하는 Once의 구조체와 함수는 다음과 같다. Sync.Once func (*Once) Do(f func()) : 함수를 한번만 실행 사용예제이다. package main import ( "fmt" "runtime" "sync" ) func hello() { fmt.Println("Hello, world!") } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용 once := new(sync.Once) // Once 생성 for i := 0; i
읽기, 쓰기 뮤텍스는 읽기 동작과 쓰기 동작을 나누어 잠금(락)을 걸 수 있다. 읽기 락(Read Lock): 읽기 락끼리는 서로를 막지 않는다. 하지만, 읽기 시도 중에 값이 바뀌면 안 되므로 쓰기 락은 막는다. 쓰기 락(Write Lock): 쓰기 시도 중에 다른 곳에서 이전 값을 읽으면 안 되고, 다른 곳에서 값을 바꾸면 안 되므로 읽기, 쓰기 락 모두 막는다. sync 패키지에서 제공하는 읽기, 쓰기 뮤텍스 구조체와 함수는 다음과 같다. sync.RWMutex func(rw *RWMutex) Lock(), / func(rw* RWMutex) Unlock(); 쓰기 뮤텍스 잠금 / 잠금 해제 func(rw *RWMutex) RLock(), / func(rw *RWMutex) RUnlock(); 읽기..
Go 언어에서는 채널 이외에도 고루틴의 실행 흐름을 제어하는 동기화 객체를 제공한다. 대표적인 동기화 객체는 다음과 같다. Mutex: 상호배제(mutual exclusion)라고도 하며 여러 스레드(고루틴)에서 공유되는 데이터를 보호할 때 주로 사용한다. RWMutex: 읽기/쓰기 뮤텍스이다. 읽기와 쓰기 동작을 나누어서 잠금(락)을 걸 수 있다. Cond: 조건 변수(condition variable)이다. 대기하고 있는 하나의 객체를 깨울 수도 있고 여러 개를 동시에 깨울 수도 있다. Once: 특정 함수를 딱 한 번만 실행할 때 사용한다. Pool: 멀티 스레드(고루틴)에서 사용할 수 있는 객체 풀이다. 자주 사용하는 객체를 풀에 보관했다가 다시 사용한다. WaitGroup: 고루틴이 모두 끝날 ..