본문 바로가기
[Objective-C] NSObject 클래스와 런타임 시스템 [Objective-C] NSObject 클래스와 런타임 시스템 출처 : OS X 구조를 이해하면서 배우는 Objective-C Chap 8. Notice : 정리자(돼지왕 왕돼지)가 remind 하고 싶은 내용이나 모르는 내용 기반으로 정리하는 것이기 때문에 구체적인 내용은 책을 사서 보시기를 권장드립니다. 8.1. NSObject 클래스 * 8.1.1. 루트 클래스의 역할 -런타임 시스템은 Objective-C 용 운영체제 같은 것으로, 객체 생성, 해제에 따른 메모리 영역 관리와 송신된 메시지에 대응하는 메서드 검색 등을 한다. -보통은 프로그램에서 런타임 시스템 기능을 직접 사용하지 않는다.이런 기본 기능은 루트 클래스인 NSObject 에 있는 메서드로 제공된다.다시 말해 루트 클래스는 런타임 .. 2017. 12. 29.
[Java Concurrency] 자바 메모리 모델 [Java Concurrency] 자바 메모리 모델 - 자바 메모리 모델(JMM, Java Memory Model) 의 내부 구조가 어떻게 동작하는지를 이해하고 있다면 상위 개념을 훨씬 효율적으로 쉽게 사용할 수 있을 것이다. 16.1. 자바 메모리 모델은 무엇이며, 왜 사용해야 하는가? - 특정 스레드에서 aVariable 이라는 변수에 값을 할당한다고 해보자. aVariable = 3; 자바 메모리 모델은 "스레드가 aVariable에 할당된 3이란 값을 사용할 수 있으려면 어떤 조건이 돼야 하는가?" 에 대한 답을 알고 있다. 동기화 기법을 사용하지 않는 상태라면 특정 스레드가 값이 할당되는 즉시, 심지어는 영원히 3이라는 값을 읽어가지 못하게 하는 여러 가지 상황이 발생할 수 있다. - JMM 은.. 2017. 5. 10.
[Java Concurrency] 단일 연산 변수와 넌블로킹 동기화 [Java Concurrency] 단일 연산 변수와 넌블로킹 동기화 - 병렬 알고리즘과 관련한 최근의 연구 결과를 보면 대부분이 넌블로킹 알고리즘, 즉 여러 스레드가 동작하는 환경에서 데이터의 안정성을 보장하는 방법으로 락을 사용하는 대신 저수준의 하드웨어에서 제공하는 비교 후 교환(compare-and-swap) 등의 명령을 사용하는 알고리즘을 다루고 있다. - 넌블로킹 알고리즘은 운영체제나 JVM 에서 프로세스나 스레드를 스케줄링 하거나 가비지 컬렉션 작업, 그리고 락이나 기타 병렬 자료 구조를 구현하는 부분에서 굉장히 많이 사용하고 있다. - 넌블로킹 알고리즘은 락을 기반으로 하는 방법보다 설계와 구현 모두 훨씬 복잡하며, 대신 확장성과 활동성을 엄청나게 높여준다. - 넌블로킹 알고리즘은 훨씬 세밀.. 2017. 5. 9.
[Java Concurrency] 성능, 확장성 #1 [Java Concurrency] 성능, 확장성 - 스레드를 사용하는 가장 큰 목적은 바로 성능을 높이고자 하는 것이다. 스레드를 사용하면 시스템의 자원을 훨씬 효율적으로 활용할 수 있고, 앱으로 하여금 시스템이 갖고 있는 능력을 최대한 사용하게 할 수 있다. 그와 동시에 기존 작업이 실행되고 있는 동안 새로 등록된 작업을 즉시 실행할 수 있는 준비를 갖추고 있기 때문에 앱의 응답 속도를 향상시킬 수 있다. - 성능을 높이는 방법은 대부분 앱의 내부 구조를 복잡하게 만들어야 하는 경우가 많고, 따라서 안전성과 활동성에 문제가 생길 가능성도 적지 않다. 최악의 경우에는 성능을 높이기 위해 적용한 프로그래밍 기법 때문에 프로그램의 다른 부분에서 역효과를 가져오거나 성능상에 문제를 일으킬 수도 있다. - 성능.. 2017. 5. 3.
[Java Concurrency] 활동성 최대로 높이기 #2 [Java Concurrency] 활동성 최대로 높이기 #2 10.2. 데드락 방지 및 원인 추적 - 한 번에 하나 이상의 락을 사용하지 않는 프로그램은 락의 순서에 의한 데드락이 발생하지 않는다. 물론 그다지 실용적이지 않은 방법일 수 있지만, 가능하다면 한 번에 하나 이상의 락을 사용하지 않도록 프로그램을 만들어 보는 것도 좋다. - 여러 개의 락을 사용해야만 한다면 락을 사용하는 순서 역시 설계 단계부터 충분히 고려해야 한다. 설계 과정에서 여러 개의 락이 서로 함께 동작하는 부분을 최대한 줄이고, 락의 순서를 지정하는 규칙을 정해 문서로 남기고 그 규칙을 정확하게 따라서 프로그램을 작성해야 한다. - 세세한 수준에서 락을 관리하는 프로그램에서는 두 단계의 전략으로 데드락 발생 가능성이 없는지를 확.. 2017. 5. 2.
[Java Concurrency] 중단 및 종료 #2 [Java Concurrency] 중단 및 종료 #2 7.3. 비정상적인 스레드 종료 상황 처리 - 스레드를 예상치 못하게 종료시키는 가장 큰 원인은 바로 RuntimeException 이다. RuntimeException 은 대부분 프로그램이 잘못 짜여져서 발생하거나 기타 회복 불가능의 문제점을 나타내는 경우가 많기 때문에 try_catch 구문으로 잡지 못하는 경우가 많다. RuntimeException 은 호출 스택을 따라 상위로 전달되기보다는 현재 실행되는 시점에서 콘솔에 스택 호출 추적 내용을 출력하고 해당 스레드를 종료시키도록 되어 있다. - 스레드 풀에서 사용하는 작업용 스레드나 스윙의 이벤트 처리 스레드와 같은 작업 처리용 스레드는 항상 Runnable 등의 인터페이스를 통해 남이 정의하고.. 2017. 4. 26.
[Java Concurrency] 작업 실행 [Java Concurrency] 작업 실행 - 앱이 해야 할 일을 "작업"이라는 단위로 분할하면 프로그램의 구조를 간결하게 잡을 수 있고, 트랜잭션의 범위를 지정함으로써 오류에 효과적으로 대응할 수 있고, 작업 실행 부분의 병렬성을 자연스럽게 극대화 할 수 있다. 6.1. 스레드에서 작업 실행 - 프로그램에서 일어나는 일을 작업이라는 단위로 재구성하고자 한다면 가장 먼저 해야 할 일은 작업의 범위를 어디까지로 할 것인지 정하는 일이다. 원론적으로 보자면 작업은 완전히 독립적인 동작을 말한다. 독립성이 갖춰져 있어야 병렬성을 보장할 수 있다. 작업을 스케쥴링하거나 부하 분산(load balancing)을 하고자 할 때 폭넓은 유연성을 얻으려면 각 작업이 앱의 전체적인 업무 내용 가운데 충분히 작은 부분을.. 2017. 4. 24.
[Effective Java] 스레드 스케쥴러에 의존하지 말자 [Effective Java] 스레드 스케쥴러에 의존하지 말자 - 많은 스레드가 runnable 상태일 때는 어떤 스레드를 실행시킬 것인지, 그리고 얼마 동안 실행시킬 것인지를 스레드 스케쥴러가 결정한다. 운영체제에서는 공정하게 그런 결정을 내리려고 하겠지만, 그 정책은 서로 다를 수 있다. 따라서 잘 작성한 프로그램은 그런 정책의 상세한 내용에 매달려서는 안 된다. 정확성이나 성능을 스레드 스케줄러에 의존하는 프로그램이라면 그 어떤 것도 이식성이 없어질 가능성이 크다. - 강력하고, 응답성이 좋고, 이식성이 있는 프로그램을 작성하는 가장 좋은 방법은, runnable 상태의 평균 스레드 개수가 프로세서의 개수보다 그리 크지 않게 하는 것이다. 이렇게 하면 스레드 스케줄러는 선택의 여지 없이 runnab.. 2017. 3. 17.
[실용주의 프로그래머] 적당히 괜찮은 소프트웨어 [실용주의 프로그래머] 적당히 괜찮은 소프트웨어 출처 : 실용주의 프로그래머-우리는 종종 뭔가 나아지게 하려다가 괜찮은 것마저 망친다. - 리어왕 -적당히 괜찮은 - 사용자, 미래의 유지보수자 혹은 자기 마음의 평화를 유지하기에 적당히 괜찮은 - 소프트웨어를 만들도록 자신을 단련할 수 있다. -“적당히 괜찮은” 이라는 문구는 너절하거나 형편없는 코드를 의미하지 않는다.시스템이 성공하려면 사용자의 요구사항을 충족해야 한다.당신이 생산해 낸 것이 어느 정도면 적당히 괜찮은지를 결정하는 과정에사용자가 참가할 기회를 가져야 한다는 걸 알아야 한다. -품질을 요구사항으로 만들어라. -오늘의 훌륭한 소프트웨어는 많은 경우, 내일의 완벽한 소프트웨어보다 낫다.사용자들에게 뭔가 직접 만져볼 수 있는 것을 일찍 준다면,.. 2016. 7. 27.
반응형