2013년 12월 29일 일요일

쓰레드 우선순위와 스케줄링

자바 가상머신은 스레드의 우선순위 값에 따라 CPU 사용을 분배하는 Fixed Priority Scheduling(고정 우선순위 스케줄링) 알고리즘 사용. 우선순위가 높게 설정된 스레드가 가장 먼저 실행되고 우선순위가 낮은 스레드는 높은 우선순위를 가진 스레드를 모두 처리된 후 실행
우선순위 범위는 1에서 10까지 10단계로 나누어져 있으며 최소 우선순위, 기본 우선순위, 최대 우선순위는 다음과 같이 상수로 정해져 있다.
java.lang.Thread.MIN_PRIORITY
1
java.lang.Thread.NORM_PRIORITY
5
java.lang.Thread.MAX_PRIORITY
10
스레드는 생성될 때 자신을 생성한 부모 스레드로부터 우선순위를 상속. 우선순위 값을 변경하거나 설정하기 위해서는 다음과 같은 메소드 사용
setPriority(int p)
현재 스레드의 우선순위를 인자 p로 설정하기 위한 메소드
getPriority()
현재 스레드의 우선순위를 반환하는 메소드
선점형 방식 : 현재 실행중인 스레드보다 우선순위가 높은 스레드가 들어오면 실행중인 스레드를 대기상태로 만들고 우선순위가 높은 스레드를 실행. ex) Solaris JVM
시분할 방식 : 현재 스레드가 높은 우선순위를 가지고 있더라도 낮은 우선순위를 가지고 있는 스레드도 실행될 수 있도록 일정한 시간이 지나면 다른 스레드에게 CPU 시간을 양보하는 방식. ex) Windows JVM
7.5 동기화
동기화 : 여러 스레드가 사용하는 자원의 상태를 일치시켜 예측 가능한 상태로 만듬
synchronized 키워드 : 동기화를 지원. 메소드에 사용하게 되면 오직 한 개의 스레드만 해당 메소드에 접근 할 수 있음. 동기화된 메소드가 사용된 객체는 locking(잠금) 상태에 있다고 하며 다른 스레드가 이미 사용 중인 동기화 메소드에 접하려고 하면 그 스레드는 동기화 메소드의 잠금이 해지될 때 까지 대기 상태에 있음
7.6 wait(), notify(), notifyAll()
wait(), notify(),notifyAll() 메소드는 동기화를 지원하기 위한 메소드로서 하나의 스레드가 다른 스레드와 통신을 할 수 있도록 지원. 이 메소드들은 synchronized 키워드가 사용된 메소드나 블록에 사용
wait(), notify(), notifyAll(), finalize() 메소드는 java.lang.Object 클래스의 멤버



단어는 알아야 소스를 찾는. 필수 데이터 구조

힙 스택 큐 리스트 그래프 트리 배열 기본 타입

2013년 12월 28일 토요일

배송은 정확히 16일 걸렸네.

주문일2013년 12월 11일
주문금액68,800원결제방법신용카드
 
주문상품 정보는 다음과 같습니다.
상품명옵션수량가격
[4moms]4moms Origami Weather Cover, Black (H1)One Color : One Size168,800원
총결제금액 : 68,800원 + 배송비 9,900원 = 78,700원


우리 애기 안 춥구로~

2013년 12월 27일 금요일

IT에서 수학이 중요한 이유 그러나 한편으로는 중요하지 않는 이유

수학에서 [변수]는 수학에서 쓰이는 수식에 따라서 변하는 값을 뜻합니다. <김승태씨의 드무아브르가 들려주는 정규분포 이야기>에서

프로그래밍에서의 [변수]의 뜻과 동일합니다.

절차 지향 프로그래밍 언어에서 함수는 f(x) 와 같습니다. 파라미터로 input을 넣고 output을 return 받아서 알고리즘을 처리하는 것이죠.

객체지향 언어도 크게 다르지 않습니다. 함수, 매소드, 펑션 등으로 불리는 문제 해결의 집합들도 모두 input을 받아서 원하는 output을 뽑아내는 "함수"의 한 종류 입니다.

수학 관련한 설명은 위키피디아가 정석이나 알기 쉽게 설명하는 곳은 "나무위키" 입니다.

그러나 중요하다고 하는 수학이 한편으로는 중요하지 않은 이유는 무엇일까요? 프로그래머는 결국 코드를 짜야 하는데, 수학을 프로그래밍으로 표현하는 기술이 부족하기 때문입니다. 

이에, 수학과 프로그래밍 언어를 잇는 책은 The art of computer programming  입니다.

그러나 이 책은 너무 어렵습니다. 또한 실무보다는 학문쪽에 가까워서 회사에서 제품을 만드는 것 보다는 학교에서 공부를 하는데 어울립니다.

그럼, 공부와 제품 창조의 중간에 있으려면 뭘 해야 할까요?

수학과 더불어 프로그래머라면 기초 영어를 해야 합니다. 기초 영어는 "초급"의 뜻이 아닙니다. substructure, basis 의 뜻입니다. 4~5년 전부터 일을 할 때 러시아, 인도, 방글라데시, 미국, 중국 개발자와 일하게 되는 경우가 매우 많아 지기 때문입니다. 식당에서 중국국적 종업원을 보는 것은 어려운 일이 아닙니다. 개발직도 그렇습니다. 우리 고유의 말과 글을 가지고 있지만 변변한 운영체제나 프로그래밍 언어가 없다보니 다른 나라의 속국으로 일해야 하는 경우가 많아졌습니다. 이에 적합한 인력이 되는 것. 이를, 글로벌한 인재가 된다고 표현 합니다.

ㅠㅠ... 울고 넘어 갑니다. 잡담만 너무 적으면 안될 것 같습니다.

+ - * / 의 경우 Addition, Subtraction, Multiplication, Division 입니다. 이들을 Operations 라고 합니다. 이 정도는 아는 영어지만 commutative law, distributive law 를 아는 사람은 많지 않습니다. 그러나 교환 법칙, 분배 법칙은 아는 분이 많습니다.

미국에서 성공하신 많은 분들이 한국의 수학 교육은 정말 대단하다고 하십니다. 그렇습니다. 주입식 교육으로 성공한 것은 "수학" 분야 입니다. 다만 고등학교 때 성공하는 것이 아니라 커서 프로그래머가 되었을 때 대부분 느낍니다.

서울대 출신 프로그래머와 일하다 보면 고등학교 때 배웠던 기초 수학 및 공업 수학등을 잘하고 그것을 응용해서 프로그램을 작성합니다. 더군다나 3D Engine과 같이 고차원적인 부분에서도 수많은 논문들을 참고하지만 정작 프로그래밍으로 표현할 때는 기초 수학의 내용을 응용해서 구현하는 경우를 보았습니다. 게다가 아무나 짤 수 없다는 것도 알고 있습니다.

그래서 저 역시 가장 싫어하던 과목이 수학이었는데 지금은 가장 좋아하는 과목이 되었습니다.

사실, 사람과의 약속에서 출발하기에 다른 학문과는 달리 정확한 학문이기에 싫어했었습니다. 젊은 시절에는 세상사 정확한 맞는 일이 하나도 없었었거든요. 어릴적 우리가 만든 수학기 틀렸기 때문에 달에 갈 수 있었다는 글귀를 어디선가 보았었습니다. 그 때는 그 말을 모르면서도 뭔가 심오한 뜻이 있다고 생각했습니다. 지금은 어렴풋이 알 수 있습니다. CPU 연산에서 실수 연산을 하면 계속해서 오차가 나고, 10진수가 정말 우리 세상을 대변해 주기 적합한 수인가? 라는 두 가지 질문에서 끊임없이 답을 찾다보니 말입니다.

100% 맞다고 하는 수학으로 세상을 보려고 해도 세상을 다 볼 수 없는 인간의 물리적 한계가 있기 때문에 괜찮을 것 같습니다. 저도 공부를 좀 해 보려고 합니다.

10-6 : take 6 away from 10 입니다.
-8 : minus eight 혹은 negative eight 입니다.
10-8 : subsract 8 from 10
10+(-8) : add a negative 8 to a positive 10
10 / 8 : 10 divided by 8
0.333333 에서 3은 cyclic

편하게

20 + 8 : twenty plus eight
10 - 8 : ten minus eight

입니다.

8 / 0  안되지요. Dividing by zero does not make sense.

이 정도 보고, 프로그래밍 어디에 쓰일까 생각해 보면 다음 책을 읽게 됩니다.


수학의 경우 여러 분야가 있지만
이산수학, 수치해석은 프로그래머의 과목으로 생각하고 있습니다.

그러나 제가 생각하는 프로그래밍의 수학 분야는 대수학과 통계학으로 보입니다. 통계학과 수학은 다른 학문이지만 수로 현상을 표현하는 통계학은 수(數) 에서 벗어나지 못합니다.

1. 세다
2. 수
3. 자주
4. 촘촘하다
5. 빠르다
- 다음 사전 (dic.daum.net) 에서

그 중 통계학은 프로그래머가 꼭 해야할 분야라고 생각됩니다.
CPU 자체가 수학을 완벽하게 표현할 수 없는 오류가 내제된 과학의 산물 이기 때문입니다.

100번 잘해주다가 1번 못해주면 나쁜 사람이고,
100번 못해주다가 1번 잘해주면 좋은 사람이라고 생각하면 안되는 것처럼

통계적으로 사랑하면 사랑하는 것이고,

통계적으로 맞다면 맞다는 쪽으로 생각을 하고 시스템을 만드는 마인드도 함께 가질 수 있습니다.

사람 목숨이 달린 임베디드 시스템을 만드는 임베디드 분야 역시 포함 됩니다. 자율 주행 자동차나 엘리베이터 시스템을 만들 때 완벽하다고 생각하지 말고 이중, 삼중으로 시스템의 위험성을 고려하고, 물리적 안전 장치를 두고 생각해야 한다는 것 입니다.

생산관리에서 말하는 6시그마가 100만개중 0.002개의 불량률로 불량률 0 에 도전한다고 배웠던 것 같습니다.

그러나 10억개중 2개의 불량율로 따지고 중국에 놀러간 와이프랑 애기가 탄 자율 주행차가 그 2대 중 한대에 탔다고 생각하면 끔찍합니다.

여기까지 생각이 미치면 통계적인 사고율은 0로 만들기는 불가능하니 사고가 났을 때 회사 책임이 아닌 인식을 주기 위해 취해야할 조치 사항들을 설계하기 바쁩니다. 경제적으로 궁핍하고, 회사에서 돈 받는 설계자라면요.

이 글의 제목처럼 수학이 중요하지만 한편으로 중요하지 않은 이유는 이와 같습니다. 사람을 생각하는 철학이 더 중요하지요. 수학적으로 생각하지 않으면 사회 현상을 수치화 하기 힘듭니다. 수치화 한 수학은 프로그래밍적 사고로 코딩을 해야 합니다. 수학을 통계학과 함께 고려한다면, 꽤 좋은 시스템을 만들 수 있을 것 같습니다.


여러 이야기를 하다가 잡글이 되었지만 향 후 수학 및 통계 관련 글도 올린다는 복선은 잘 깐 것 같습니다.

bootcamp 지우기

맥북 프로 레티나 터치바 diskutility 에서 bootcamp 파티션 삭제하면 검은색에서 회색으로 바뀐다(APFS로 지정) 파틴션 아이콘 클릭하여 - 버튼을 이용하여 삭제하면 끝.