studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 동시성 vs 병렬성
  • 경쟁 상태
  • 공유자원 잠금
  • atomic
  • sync
  • 채널
  1. Go
  2. Go in Action

6장 동시성

  • Communicating Sequential Processes.

  • Channel

  • Go 런타임 스케쥴러

  • 운영체제의 물리적 프로세서, 쓰레드와 go 런타임의 논리적 프로세서, 고루틴으로 나뉘어져 있음.

    • 논리적 프로세서는 하나의 운영체제 쓰레드에 개별적으로 바인딩됨

    • Go 1.5부터는 코어 갯수만큼 논리 프로세서를 생성하고, 그 이전에는 기본적으로 하나의 논리 프로세서만 할당

    • 하나의 논리적 프로세서도 수많은 고루틴을 동시적으로 실행 가능

  • 운영체제 쓰레드 - 논리적 프로세서 - local run queue - global run queue - Go 런타임 스케쥴러

  • system call이 발생하면 해당 쓰레드랑 고루틴을 묶어서 논리프로세서에서 떼어낸 다음 해당 쓰레드가 system call이 완료되는걸 기다리게끔 만듬. 그리고 논리프로세서에는 새로운 쓰레드와 고루틴을 투입하고 system call이 완료되면 고루틴을 local run queue로 다시 이동, 쓰레드는 다시 사용할 것을 대비해서 풀링.

  • 네트워크 io가 발생하면 고루틴만 분리해서 netpoller로 이동. netpoller가 io 준비 완료를 알리면 다시 고루틴을 논리 프로세서에 할당해서 작업 수행.

동시성 vs 병렬성

  • 동시성

    • 서로 독립적으로 실행되고 있는 작업의 집합.

    • 많은 것들을 어떻게 한번에 다룰 것인가.

    • 설계에 대해서 말하는 것

    • 병렬처리가 필요한 문제가 있을 때, 어떻게 설계할 것인가에 대한 해결책이 될 수 있음

    • 동시성은 하나의 프로그램을 독립적으로 실행되는 여러 조각으로 쪼개서 설계하고 관리하는 방법

    • Communication은 독립적으로 실행되는 각 조각들 사이에서 적절하게 조정하기 위한 방법

  • 병렬성

    • 동시에 실행되고 있는 (가급적 서로 관계있는) 계산의 집합.

    • 많은 것들을 어떻게 한번에 실행할 것인가.

    • 실행에 대해서 말하는 것

    • 멀티코어, 네트워크, 클라우드

  • 완전히 같진 않지만 연관된 부분도 있음.

    • 동시성이 병렬이란건 아니다.

    • 동시성은 병렬을 가능하게 만든다.

    • 동시성은 병렬과 스케일링과 그리고 그 모든 것들을 더 쉽게 만들어준다.

경쟁 상태

  • 둘 이상의 고루틴이 동기화없이 공유된 자원에 접근하여 읽거나 쓰는 경우 발생

  • -race 옵션을 주고 빌드하면 프로그램을 실행할 때 race condition을 검사하게 만들 수 있음

공유자원 잠금

atomic

  • 정수 및 포인터에 대한 접근을 동기화할 수 있는 저 수준의 잠금 메커니즘 제공

sync

  • 뮤텍스 제공

  • 세마포어 제공

채널

  • 고루틴 간에 자원을 공유해야되는 경우 고루틴 사이를 연결하는 파이프처럼 동작

  • 데이터 교환에 있어 동기화를 보장

  • channel := make(chan type, bufferSize)

    • 버퍼의 크기를 지정하거나 생략 가능. 생략할 경우 버퍼가 없는 채널로 생성됨

  • 값을 보낼때는 <- 연산자 사용 channel <- data

  • 값을 받을 때도 <- 연산자 사용 value := <- channel

  • unbuffered channel

    • 동기화가 발생. 값 전달 과정에서 전달이 완료될 때 까지 양쪽에 반드시 블로킹 발생

    • 값을 보내고 받는 동작이 반드시 동시에 이루어진다는 것을 보장

    • 데이터가 반드시 교환될 수 있도록 보장

  • buffered channel

    • 버퍼가 꽉 찼을 때만 블로킹 발생

    • 채널이 close() 되더라도 버퍼에 남아있는 데이터는 받을 수 있음

    • 버퍼가 비어있고 (&&) 채널이 close() 되었을 때만 제로값 또는 상태값 false 반환

Previous5장 GO의 타입 시스템Next7장 동시성 패턴

Last updated 6 years ago