. NET 4.6에서 GC.TryStartNoGCRegion ~ GC.EndNoGCRegion 라는 것이 추가 되었다.

GC.TryStartNoGCRegion에서 GC.EndNoGCRegion까지 자동 GC를 억제할 수 있다.

 

 

처리 중 GC가 일어날 경우

아래 코드는 1MB의 바이트 배열을 생성하고 GC 회수 대상이 될 수 있는 구성이다.

using System;

using System.Runtime;

using System.Threading;

 

namespace TestSpace {

    class Program {

        static void Main( string[] args ) {

            for( int i = 0; i < 30; i++ ) {

                var n = create();

                Thread.Sleep( 100 );

                GC.KeepAlive( n );

 

                Console.WriteLine( $"GC:{GC.CollectionCount( 0 ) } {GC.GetTotalMemory( false ):#,##byte} " );

            }

            Console.ReadLine();

 

        }

 

        public static WeakReference<byte[]> create() {

            var weak = new WeakReference<byte[]>( new byte[1048576] );

            return weak;

        }

 

    }

}

 

동작 환경에 따라서 차이가 있겠지만 몇 번 GC가 발생하는지 확인할 수 있다.

 

 

GC.TryStartNoGCRegion ~ GC.EndNoGCRegion 로 둘러싸 본다

속도가 중시되는 경우 GC 발생이 병목이 될 수 가능성이 있다.

 

GC.TryStartNoGCRegion에 메모리 사이즈(바이트 단위)를 지정한다.

이곳에서 지정한 사이즈가 소비될 때까지 GC가 억제되게 된다.

 

예를 들어 GC.TryStartNoGCRegion(15728640)라고 지정하면 15MB 소비할 때까지 GC를 억제하게 된다.

또한 지정 가능한 최대 크기는 실행 환경에 의해서 결정된다.

상세는 Fundamentals of Garbage Collection을 참조.

https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx

 

일반적인 클라이언트 PC 32비트 환경에서는 16MB, 64비트 환경에서는 256MB 이다.

아래의 예는 32비트 환경을 예상한 것이다.

using System;

using System.Runtime;

using System.Threading;

 

namespace TestSpace {

    class Program {

        static void Main( string[] args ) {

 

            if( GC.TryStartNoGCRegion( 15728640 ) ) {

                for( int i = 0; i < 30; i++ ) {

                    var n = create();

                    Thread.Sleep( 100 );

                    GC.KeepAlive( n );

 

                    Console.WriteLine( $"GC:{GC.CollectionCount( 0 ) } {GC.GetTotalMemory( false ):#,##byte} " );

                }

 

                if( GCSettings.LatencyMode == GCLatencyMode.NoGCRegion )

                    GC.EndNoGCRegion();

            }

            Console.ReadLine();

 

        }

 

        public static WeakReference<byte[]> create() {

            var weak = new WeakReference<byte[]>( new byte[1048576] );

            return weak;

        }

 

    }

 

}

 

GC.TryStartNoGCRegion 에서 지정한 15MB까지 GC가 이뤄지지 않는 것을 확인할 수 있다.

그러나 15MB를 초과 한 시점에서 자동적으로 GC가 발동 하는 것도 확인할 수 있다.

 

 

주의 사항

GC.TryStartNoGCRegion을 호출해서 새롭게 할당된 메모리가 지정 크기까지 도달할 때까지 GC를 억제하는 것이다.

이미 할당된 메모리 사이즈는 무의미하다.

 

GC.TryStartNoGCRegion을 다중으로 호출 할 수는 없다.

GC.TryStartNoGCRegion에 성공하면 GCSettings.LatencyMode값이 GCLatencyMode.NoGCRegion로 변경된다.

거꾸로 말하면, GCSettings.LatencyMode == GCLatencyMode.NoGCRegion 이라면 GC 억제 중이라고 판단할 수 있다.

 

GC.EndNoGCRegion() GCSettings.LatencyMode GCLatencyMode.NoGCRegion인 경우에만 실행 가능하다.

GC.EndNoGCRegion()를 호출하지 않아도 자동으로 해제되는 경우가 있다.

GC.TryStartNoGCRegion에서 지정한 사이즈에 달했다

GC.Collect등이 호출 되어 수동에 의한 GC가 발생했다

GC.GetTotalMemory(true)가 실행되었다

 

이런 경우 그 시점에서 GC의 억제 상태가 해제된다.

 

 

MSDN: GC.TryStartNoGCRegion

https://msdn.microsoft.com/en-us/library/system.gc.trystartnogcregion(v=vs.110).aspx

 

동시에 복수의 GC.TryStartNoGCRegion을 호출한 경우 InvalidOperationException이 발생하므로, 멀티 쓰레드에서 GC.TryStartNoGCRegion~GC.EndNoGCRegion을 할 때는 반드시 동기화 해야 한다.

 

출처: http://qiita.com/Temarin_PITA/items/749ad661fd13d7402794

 

저작자 표시
신고
by 흥배 2016.08.01 08:00

현재 내용으로 봐서는 2017 2분기쯤 되면 꽤 쓸만하겠네요^^;

링크: https://blogs.msdn.microsoft.com/dotnet/2016/07/15/net-core-roadmap/

 

 

8월말쯤에 1.0.1 나올 예정.

 

올해 말 혹은 내년 3월까지의 예정.

 

 

.NET Core Tooling

- .csproj/MSBuild project system 지원

- 프레임워크 관리용 명령어 추가

 

 

언어 관련. C# 7, VB 15 추가 언어 사양

- tuple, 패턴 매칭

- Value Task, Ref return, Throw expression, Binary Literals, Digit Separators

- Out vars, Local Function

 

 

ASP.NET

- Web Socket

- URL Rewriting Middleware

- Azure 관련 강화

- Service Fabric support via WebListener based server

- MVC & DI Startup Time Improvements

- 프리뷰

- SignalR

- View Pages (Views without MVC Controllers)

 

 

.NET Core Runtime

- ARM 32/64

- .NET Core Runtime

 

 

Entity Framework Core

- Azure

- Transient fault handling (resiliency)

- Mapping

- Custom type conversions

- Complex types (value objects)

- Entity entry APIs

- Update pipeline

- CUD stored procedures

- Better batching (TVPs)

- Ambient transactions

- Query

- Stability, performance.

- Migrations

- Seed data

- Stability

- Reverse engineer

- Pluralization

- VS item template (UX)

 

 

Q1 2017 / Q2 2017

- .NET Standard 2.0

 

 

출처: https://opcdiary.net/?p=32475

 

저작자 표시
신고
by 흥배 2016.07.26 10:05

출처: http://glassonion.hatenablog.com/entry/2016/06/13/173933

 

저작자 표시
신고
by 흥배 2016.07.21 08:00

부동 소수점 수를 사용할 때의 주의점

부동 소수점은 프로그램에서 소수를 다루기 위해서 널리 이용되고 있지만 조금 독특한 데이터 형이므로 그 특성을 잘 이해하고 이용하지 않으면 뜻밖의 함정에 빠질 수 있다.

 

부동 소수점의 특성으로 주의할 점은 다음과 같다.

a) 부동 소수점 연산에 고유의 오차가 항상 생길 수 있다.

b) 빌드 환경이나 옵션에 의해 동일한 소스 코드에서도 계산 결과가 달라질 수 있다.

c) 실행하는 CPU가 바뀌면 동일한 실행 모듈에서도 계산 결과가 달라질 수 있다.

 

 

소수 계산을 할 경우의 설계·프로그래밍 방침

1). 부동 소수점 연산 결과에 대해서는 유효 자릿수 범위에서 평가한다

 

부동 소수 점을 다루는 데이터 형에는 유효 자릿수를 규정하고 있다.

예를 들면 .NET Framework float 형의 경우 유효 자릿수 7자리, double 형이라면 유효 자릿수는 15~16자리 수 정도로 정의되어 있다.

 

부동 소수점의 특성상 유효 자릿수 이상의 자릿수에 대한 연산 결과는 부정이며 이 부분을 평가 대상으로 하는 시스템 설계 및 프로그래밍은 피할 필요가 있다.

예컨대 소수 값 일치를 평가하는 경우 아래 코드에서는 전자의 비교 연산자 "=="를 사용하는 방법으로는 보통 의도한 결과를 얻을 수 없다.

 

때문에 후자처럼 오차의 발생을 고려한 비교로 대용할 필요가 있다.

 

Double val_1=0.1+0.2+0.3;

Double val_2=0.6;

const Double Eps=0.000000000000001;

 

//부적절한 비교 방법

if(val_1==val_2)

{

    Console.WriteLine("변수 val_1 val_2는 똑같다");

}

 

//오차를 고려한 비교 방법

if(Math.Abs(val_1– val_2)<Eps)

{

    Console.WriteLine("변수 val_1 val_2는 거의 같다");

}

 

그 외 정수 변환에서는 Math.Round, Math.Floor, Math.Ceiling 라는 메소드나 정수형으로 캐스트를 이용할 수 있지만 이들의 동작을 이해하고 목적에 맞은 것을 이용하자.

 

 

2). 그래도 연산 오차 최소화가 필요한 경우는 10진 형식 타입 이용을 검토하자

 

 

출처: https://blogs.msdn.microsoft.com/jpvsblog/2014/10/28/93/

 

 

저작자 표시
신고
by 흥배 2016.07.08 08:00

이 문서는 NEXT의 게임 클라이언트/서버 과정 학생이 정리한 것이다. 



저작자 표시
신고
by 흥배 2016.06.27 08:00

이 문서는 NEXT의 게임 클라이언트/서버 과정 학생이 정리한 것이다. 




저작자 표시
신고
by 흥배 2016.06.21 08:00

몬스터 스트라이크’(http://kr.monster-strike.com/ )는 일본의 모바일 게임으로 퍼즐 앤 드래곤을 밀어낸 초 히트 게임이다.

 

서버 OS:                     Ubuntu Server

데이터베이스:               MariaDB

캐시서버:                     memcached

Web 애플리케이션 서버:  Nginx, Unicorn

메시지 큐잉 서버:          Resque

 

개발 언어:                    Ruby

프레임워크:                  Padrino

소스 코드 관리             GitHub

CI:                             Jenkins

가상 환경 구축:             Vagrant

커뮤니케이션:                Slack

 

운용 상황 가시화:          CloudForecast, GrowthForecast

운용 감시, 이상 감지:      Nagios, PagerDuty

로그 관리:                    fluentd, Elasticsearch, Kibana, Norikra

배포:                          Capistrano

 


출처: https://twitter.com/nacl/status/735324653950996480

 

저작자 표시
신고
by 흥배 2016.06.17 08:00

이 문서는 NEXT의 게임 클라이언트/서버 과정 학생이 정리한 것이다. 




저작자 표시
신고
by 흥배 2016.06.07 08:00

Visual Studio 2015 빌드 기준


다운로드 받은 Poco 라이브러리를 압축을 푼 후 해당 디렉토리에서 cmd를 실행한 후 아래의 명령어를 실행한다.


x86

buildwin.cmd 140 rebuild all both Win32


x64

buildwin.cmd 140 rebuild all both x64



좀 더 자세한 것은 아래 글을 참고

http://stackoverflow.com/questions/30374503/building-poco-c-libraries-on-windows-from-commandline

저작자 표시
신고
by 흥배 2016.06.02 08:00

이 문서는 NEXT의 게임 클라이언트/서버 과정 학생이 번역/정리한 것이다.
http://icecola89.blogspot.kr/

저작자 표시
신고
by 흥배 2016.05.30 08:00
| 1 2 3 4 5 6 7 ··· 71 |

티스토리 툴바