NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
Oscon keynote: Working hard to keep it simpleMartin Odersky
The document discusses how Scala aims to make parallel and concurrent programming easier by avoiding mutable state and enabling a functional programming style, and it presents Scala as a language that unifies object-oriented and functional programming in a way that allows both sequential and parallel applications to be written safely and efficiently. Examples are given of how parallel collections and actors can be used in Scala for parallelism and concurrency, and how domain-specific languages embedded in Scala can help program parallel applications for different domains like physics simulation.
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥Seomgi Han
서버 자원의 효율성을 극대화하기 위해서는 흔히 비동기 프로그래밍 방식을 적용합니다. 파이썬에서도 비동기 프로그래밍 방식으로 웹서비스를 제공하기 위해서 여타 웹프레임워크 프로젝트가 탄생했습니다. Tornado부터 시작하여, Aiohttp, Sanic, Vibora 등과 같은 프로젝트가 이러한 목적을 갖고 있는 프로젝트입니다. 그 중에서도 Vibora나 Sanic 등과 같은 프로젝트는 서로 자기가 처리 능력이 좋다며 자랑하고 있습니다. 그 이유로 비동기 방식을 활용하기 때문이라고 하는데, 설명을 들여다보면 빠지지 않고 나오는 단어가 있습니다. 바로 uvloop입니다.
uvloop이 무엇인지 궁금하여 알아보면, 다시 libuv라는 라이브러리를 만날 수 있습니다.
이 프로그램에서는 libuv가 어떤 방향성을 갖고 디자인되었으며, 어떤 기능을 갖고 있기에 다수의 프로젝트에서 사용하게 되었는지, 파이썬의 기본 라이브러리인 asyncio와는 어떤 차이점이 있는지를 알아봅니다. 또한 파이썬으로 만들어진 몇몇 웹프레임워크가 어떤 처리 능력을 보여주는지 직접 테스트해본 결과를 공유합니다.
[2013.07.16] PythonKorea강남스터디 발표 - flask testingDaeHyun Sung
2013년 7월 16일자
PythonKorea강남스터디 2주차 발표 Flask Testing 자료입니다.
발표주제는 Flask의 테스트에 대한 소개입니다.
TDD의 간단한 소개와 unittest모듈 소개 및 Flask에서 unittest사용하는 방법과 unittest의 기능을 확장한 Flask-Testing모듈에 대해 소개를 합니다.
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
C++11을 시작으로 모던 C++이 도입된 지도 어느새 6년이라는 시간이 흘렀습니다. 올해는 C++17 표준이 도입될 예정입니다. 그만큼 많이 개선되고 새로운 기능들이 많이 도입되었기에 실무에서 사용해보고 싶은 경우도 많습니다. 하지만 이미 서비스 중이라 기존 프로젝트를 새 버전의 VS로 마이그레이션하기 어려운 프로젝트가 많습니다. 그렇다고 아예 불가능한 일도 아닙니다. 이번 세미나에서는 기존 프로젝트를 새 버전의 VS로 마이그레이션하면서 발생했던 문제와 마이그레이션 이후 모던 C++을 사용하면서 발생했던 문제, 그리고 해결법을 설명하고자 합니다. 또한 새 버전의 VS에 생긴 유용한 기능들도 함께 알려드립니다.
This short document promotes Haiku Deck, a presentation creation tool, and encourages the reader to get started creating their own Haiku Deck presentation on SlideShare. It provides a single prompt stating "Create your own Haiku Deck presentation on SlideShare!" to inspire the reader to take action.
2. 지난시간 복습
• 현대 컴퓨팅 환경은 동시성 제어가 필수다.
• 동시성 제어의 핵심은 동기화 처리이다.
• mutex
• semaphore
• spin lock
• kernel level vs user level
• atomic operation
• test and set
• compare and swap
• fetch and add
• ABA problem
3. 이번시간에는
• 많은 사람들의 주력 언어인 java 구현체를 알아봅시다.
• synchronized vs lock
• Runnable vs Callable
• ExecutorService / thread pool
• Future
• 왜 멀쩡한 oop 를 놔두고 functional programming을 해야 하나?
• concurrent programming 을 잘하기 위해서입니다.
4. java synchronized
• 인터넷에 아주 좋은 글이 있더라고요!
• https://01010011.blog/2017/01/20/java-synchronization-internal/
• synchronized 에는 2가지 종류가 있다.
• synchronized method
• synchronized block
6. • 차이?
• critical section 의 범위를 선택할 수 있다/없다
• bytecode compile 결과물이 다르다.
• biased lock 적용 여부가 다르다.
synchronized method vs synchronized block
• jvm 구현(openjdk 기준)까지 내려가 보면 둘 다 mutex 입니다.
7. • 차이?
• critical section 의 범위를 선택할 수 있다/없다
synchronized method vs synchronized block
Bar bar = new Bar();
public void foo() {
…
syhchronized(bar) {
…
}
…
}
public void synchronized foo() {
…
}
vs
8. public class SynchronizedExample {
public static void main(String[] args) {
Foo foo = new Foo();
synchronized (foo) {
++foo.foo;
}
methodFoo(foo);
}
static synchronized void methodFoo(Foo foo) {
++foo.foo;
}
static class Foo {
public int foo;
}
}
synchronized method vs synchronized block
• 차이?
• bytecode compile 결과물이 다르다.
L5
LINENUMBER 15 L5
ALOAD 1
DUP
ASTORE 2
MONITORENTER
L0
LINENUMBER 16 L0
ALOAD 1
DUP
GETFIELD SynchronizedExample$Foo.foo : I
ICONST_1
IADD
PUTFIELD SynchronizedExample$Foo.foo : I
L6
LINENUMBER 17 L6
ALOAD 2
MONITOREXIT
L1
GOTO L7
L2
FRAME FULL [[Ljava/lang/String; SynchronizedExample$Foo java/lang/Object] [java/lang/Throwable]
ASTORE 3
ALOAD 2
MONITOREXIT
L3
ALOAD 3
ATHROW
L7
퀴즈
왜 monitorexit 를 두번 할까?
9. // access flags 0x28
static synchronized methodFoo(LSynchronizedExample$Foo;)V
L0
LINENUMBER 23 L0
ALOAD 0
DUP
GETFIELD SynchronizedExample$Foo.foo : I
ICONST_1
IADD
PUTFIELD SynchronizedExample$Foo.foo : I
L1
LINENUMBER 24 L1
RETURN
public class SynchronizedExample {
public static void main(String[] args) {
Foo foo = new Foo();
synchronized (foo) {
++foo.foo;
}
methodFoo(foo);
}
static synchronized void methodFoo(Foo foo) {
++foo.foo;
}
static class Foo {
public int foo;
}
}
synchronized method vs synchronized block
• 차이?
• bytecode compile 결과물이 다르다.
monitorenter / monitorexit 가 없다.
나중에 bytecode interpreter 가 method 를 해석할 때
synchronized keyword 를 보고 lock 을 걸어준다.
10. synchronized method vs synchronized block
• 차이?
• biased lock 적용 여부가 다르다.
• biased lock?
• https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot
• lock 을 단계별로 적용하여 성능을 향상시켜보려는 기법
• object header 에 방금 CS에 진입한 thread id 를 적어둔다.
• 아까 그놈이 다시 CS에 진입하면 biased lock(가라 락) 적용
• biased lock – short term lock – long term lock 순으로 적용
• java6 부터는 default enabled
• default enabled 니까 몰라도 되겠네?
11. ReentrantLock
• Lock interface 를 구현한 class는 다음 3가지 뿐이다.
• ReentrantLock
• ReentrantReadWriteLock.ReadLock
• ReentrantReadWriteLock.WriteLock
• 참조
• https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html
• Lock 이 synchronized 보다 좋은 점?
• 보다 디테일한 동기화 전략을 수립할 수 있다.
• read lock 과 write lock 을 구분
• read 상황 시, 여러 thread 가 동시 접근하도록 허용
• write 상황 시, 1 개의 thread만 접근하도록 허용
13. Runnable vs Callable
• Runnable
• java1.0 부터 함께하던 Thread 추상화
• 특정 use case 를 만족시키기 어려운 디자인
• thread 가 작업 완료 후 연산 결과를 전달해야 하는 경우
Runnable은 반드시 공유 리소스를 사용해야만 한다.
• thread 작업 완료 시점을 알기 위해 추가적인 노력이 필
요하다.
• Runnable vs Callable 뭐가 다르죠?
• return type
• void vs <V>
• throws Exception
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
14. Runnable vs Callable
• Callable
• Executor / ExecutorService / Future 와 항상 함께 쓰임
• ExecutorService가 Executor 를 만들고
• Executor 가 Callable 을 실행하고
• Future 가 결과를 받는다.
• 숙제 : Future?
• asynchronous / blocking
• sync / async , blocking / non-blocking 의 차이점은?
• CompletableFuture 는?
16. thread safety
• 모든 thread safety 문제는 공유되는 리소스 간 동기화 문제
• 다음 4가지 상황을 만족하면 thread safe
• 공유 리소스 없다
• 공유 리소스 있다 & immutable
• 공유 리소스 있다 & critical section 에 대한 동기화 보장
• 공유 리소스 있다 & atomic operation
현재 functional programming이 각광받는 이유
• lock 없다 -> 빠르다
• thread safe 하다 -> multi core computing
17. 결정할 사항
• 정기 세미나 누가? 무슨 주제로?
• 누가 :
• 무슨 주제로 :
• RxJava 책 스터디
• 책 :
• http://www.acornpub.co.kr/book/rxjava-essentials
• http://shop.oreilly.com/product/0636920042228.do
• 발표자
• 1주 :
• 2주 :
• 2주로 끝낼 수 있도록
• 발표자 외에 나머지 사람도 준비를 많이 해 주세요