2013. 12. 19. 13:05

' 오랫만'  뜻  ?    ‘오래간만(어떤 일이 있은 때로부터 긴 시간이 지난 뒤)’의 준말.

' 오랫동안' 뜻 ?   '시간으로 썩 긴 동안


질문:

'오랫만' 과 '오랜만' 중 올바른 표현은?

답:

‘오래간만’의 준말은 ‘오랜만’이다. 이를 ‘오랫만’으로 쓰는 것은 ‘오랫동안’처럼 실질형태소의 결합으로 착각하는 데서 나온 현상이다.   올바른 표현: 오랜만


질문:

'오래간만이다, 오랜만이다' 둘 다 맞는 표현인가요? 그리고 띄어쓰기도 맞는지 궁금합니다.

답:

'오래간만'은 '어떤 일이 있은 때로부터 긴 시간이 지난 뒤.'라는 의미를 가진 말이고, '오랜만'은 '오래간만'의 준말입니다. 따라서 본말인 '오래간만'이나 준말인 '오랜만'을 모두 쓸 수 있습니다.


질문:

'오랫동안'과 '오랜동안' 중 올바른 표현은?

답: 실질형태소 ‘오래’와 ‘동안’이 결합하면서 사이시옷이 들어간 합성어이기 때문에 ‘오랫동안’이 올바른 표기이다. ‘오랜동안’이라 흔히 쓰는데, 잘못된 표현이다.

올바른 표현: 오랫동안


출저 : 네이버 국어사전

출저: 국어생활백서

Posted by hoonihoon
2013. 12. 19. 11:07


blocking 모드 

어떤 시스템 콜을 호출하였을 때 네트워크 시스템이 동작을 완료할 때까지 그 시스템 콜에서 프로세스가 멈춤

소켓 생성시 디폴트 blocking 모드

listen(),connect(), accept(), recv(), send(), read(), write(), recvfrom(), sendto(), close()

block 될 수 있는 소켓 시스템 콜

I/O시 처리가 될 때까지 기다려야 함. 비 동기적인 작업 수행 불가능

일 대 일 통신을 하거나 프로그램이 한가지 작업만 하면 되는 경우는 blocking 모드로 프로그램을 작성할 수 가능


Non-blocking 모드

소켓 관련 시스템 콜에 대하여 네트워크 시스템이 즉시 처리할 수 없는 경우라도 시스템 콜이 바로 리턴되어 응용 프로그램이 block되지 않게 하는 소켓 모드

통신 상대가 여럿이거나 여러 가지 작업을 병행하려면 nonblocking 또는 비동기 모드를 사용하여야 한다.

non-blocking 모드를 사용하는 경우에는 일반적으로 어떤 시스템 콜이 성공적으로 실행될 때까지 계속 루프를 돌면서 확인하는 방법(폴링)을 사용한다.




정리 .....


동기 : 순서 있게 일한다. 


비동기: 신호를 보내고, 받는다. (무순서)


Blocking

- 리턴값에 신뢰성이 있다. 대신에 기다려야 한다.

- 어떤 시스템 콜을 호출 하였을 때 네트워크 시스템이 동작을 완료 할 때까지 시스템 콜에서 프로세스가 멈춤.


Non_Blocking 

- 네트워크가 즉시 처리 할 수 있으면 해당 결과를 리턴  ( 바로 리턴하는 대신 신뢰성을 보장하지 못함)

- 리턴값을 대게 -1, false 를 리턴한다.

- 결과 확인은 위한 반복적인 작업(폴링)으로 CPU 낭비를 초래한다.





<노컷님 정리>


* 더 쉬운 예(프린터를 예로 들어서, 문서 10개를 print시킬때)
1. sync : 문서를 작성하고 print시킨다. 다 프린트 되서 나올때까지 기다려서 확인.
          그 다음 문서를 print시키고, 다 나올때까지 확인.(당연 절라 느림)
          (거기다 사람(application)이 계속 기달리고 있어야 함...시간 아깝죠?^^)
2. async : 문서를 print시키라고 마구 시킨다.(프린터야 죽어나든 말든..)
           글구 사람(application)은 코딩작업을 마무리 하던가, 데브피아에 답변을
           올리던가...일을 하다가 printer가 일이 끝나면, 삐~~(신호음)을 울려주고
           그때서야 프린트가 잘 됐나 한번 봐준다^^
          (사람(application)을 부릴땐 이렇게 시켜야 효율적으로 일하겠죠?^^)
          (실제로 쓰이고 있는 방식입니다.)
3. non-blocking방식 : 프린트 시키고 딴짓하다가 프린트가 나오기 시작하면,
          다 끝날때까지 기다림(sync보단 효율적이고, async보단 더 느리고)
          (recv함수를 쓰는 동안은 기다리니깐요)

동기는 프로그래밍하기가 좋고, 비동기는 좀 더 까다로운 대신 기능이 좋죠^^

덧. async가 네트워크 속도가 빠른 건 아닙니다(확인하고 보내는 시간이 없으니 조금 
더 빠르긴 하지만...프린트를 1000장을 시킬때, 완료될때까지 걸리는 시간은 그렇게 
차이가 안나죠, 문제는 사람(application)이 하루종일 기달리고 있느냐, 하루종일 딴
일하고, 마지막에 확인만 해주느냐의 차이인 것이죠.^^


출저:




아래 읽어보세요.

Non Blocking IO 에 관한 질문..

litdream의 아바타

어제, 후배가 'Non blocking IO 를 왜 쓰나요?' 라고 물어오더군요.
솔직히 한번도 non-blocking IO 를 써본적이 없는 저로써는,
잘 모르겠다만, 내가 알기로는 머 이러이러하다라고 말해준것이
계속 맘에 걸립니다. 잘못 얘기해준것 같아서요.

" 어떤 function call 이 blocking socket 에 대해 이루어질때,
버퍼가 비어있다면 버퍼에 무엇인가 들어올때까지 프로세스는 sleep
상태가 되고, OS 는 다른 프로세스를 선택하게되지만,
non-blocking socket 에 대해 이루어지면, 버퍼가 비어있으면,
펑션은 바로 NULL 을 리턴하게되고, 곧바로 다음 문장을 실행하게
된다. 이것이 가지는 장점은, (여기서 잠시 머뭇하다가.. )
select() 나 poll() 같은 펑션에 소켓을 등록한후, 그 몽땅을 하나의
channel 로 관리하게 되므로, 각각의 소켓에 쓰레드를 할당하는것
과 대조적으로 하나의 쓰레드로 관리할수 있게되므로, 쓰레드에서
잇점이 있다. "

막상 이렇게 정리를 해놓고 보니 넘겨짚은 부분이 많은것 같아서요.
그리고, 설명을 못해준것이, 
1. 이것이 performance 입장에서는 어떻게 더 나은지..
2. 이것이 scalable 한 이유.

이런 문제에 관해서는 전혀 생각을 못했네요.
고견을 부탁드립니다.

kane의 아바타

제가 알고 있는 장점은thread context switching을

제가 알고 있는 장점은
thread context switching을 줄일 수 있다는 겁니다.
프로세스 보다야 낫겠지만 쓰레드도 컨텍스트 스위칭에 오버 헤드가 있기 때문에 이걸 줄일 수 있다면 좋습니다. 특히 소켓 수가 많고, 소켓 통신이 빈번하게 이루어지는 상황이라면 이 오버 헤드도 무시 못할 게 되죠.
대신에 코딩하기 귀찮아진다는 (무시 못할 ㅋㅋ) 단점이 있지만요.

추가로 소켓을 쓰레드에 분배하거나, 쓰레드끼리 데이타를 주고 받을 필요가 발생해서 생기는 오버 헤드도 있을 수 있습니다.

aqwerf의 아바타

select나 poll을 사용하였을 때의 장점은 performance나

select나 poll을 사용하였을 때의 장점은 performance나 scale면에서는 큰 장점은 없는 것 같습니다.

하지만, 
- thread를 여러개 만드는 것보다는 select를 사용하는 것이 메모리 사용면에서 효율 적이고
- 다른 io event와 같이 기다릴 수 있다
는 장점이 있을 것 같습니다.

저 같은 경우에는 두번째의 용도로 많이 씁니다. 예를 들어 소켓 통신 중 중단 시키려는 경우 빨리 깔끔하게 뒷처리를 하도록 하기 위해서는 blocking인 경우 thread를 바로 깨워줘야 하는데 이를 위한 방법이 없어서요. 
제가 주로 사용하는 것이 RTOS인데 unix는 이런 경우에 깨울수 있는 방법이 있나요?

ssehoony의 아바타

throughput 과 response time 간 trade off 관

throughput 과 response time 간 trade off 관계인데요.
일단 이거 단일 프로세스라는 가정에서 이야기를 하면

throughput 은 select 가 좋습니다.
kane 님께서 말씀 하셨듯이 컨텍스트 스위칭, 쓰레드 스케줄링, 크리티컬섹션의 뮤텍스 처리등이 쓰레드를 이용하면 생기는 부하들인데 이런 것들이 없기때문에 전체 성능은 좋아집니다.

하지만 select 는 (쓰레드와 비교해 상대적으로) response time 이 떨어집니다. 클라이언트 입장에서는 다른 클라이언트가 서버에 먼저 뭔가 요구했다면 그 작업이 끝날때까지 기다렸다가 내 차례가 오기때문이죠.

위와 같은 상황은 커널이 프로세스 스케줄링할때 어떤 알고리즘을 사용하느냐 그리고 한 프로세스에 한번에 주는 cpu 시간의 크기에 따라 throughput 과 response time 이 trade off 관계인것 과 같은 것이지요.

또한 쓰레드를 쓰면 각각의 쓰레드 생성 오버헤드도 있고 각 쓰레드의 스택세그먼트 공간을 생각하면 메모리 낭비가 문제지요.

그럼 쓰레드는 뭐가 좋냐? 위에 말씀 드린 것 처럼 response time 이 짧고 (클라이언트 입장에서 보면 서버의 throughput 은 자기완 전혀 상관없고, response time 이 중요하죠), 크리티컬섹션을 제외한다면 코드도 select 보다 간단하고, 멀티 프로세서일때 필요하다면 모든 프로세서를 동시에 병렬로 이용해서 단일 프로세서의 select 보다 더 좋은 throughput 을 낼 수도 있습니다.

litdream의 아바타

Context Switch 의 Overhead 가 있었군요!!이런이런

Context Switch 의 Overhead 가 있었군요!!
이런이런~ 가장 기본적인것을 놓치다니.. 역시 내공이 부족합니다.
답변주신 세분 감사합니다.

삽질의 대마왕...

pynoos의 아바타

NonBlock IO를 쓰는 가장 큰 이유는 소켓의 데이터 처리에 대한

NonBlock IO를 쓰는 가장 큰 이유는 소켓의 데이터 처리에 대한 스케쥴링을 OS나 일반적인 라이브러리에 맡기지 않고, 스스로 구현한 스케쥴링을 사용하겠다는 것입니다.

그리고, OS의 다른 overhead인 process/thread의 스케쥴링 비용(요것이 소켓 100개정도만 넘어가도 상당한 비용이 됩니다.)을 없애겠다는 것입니다.

윗분들이 언급하지 않은 것 하나는 select 또한 소켓수가 100개 이상되면 비용이 작은 것이 아닙니다. select는 각 소켓의 버퍼에 WATER MARK 이상의 값이 있는지에 대해 반응하는 것입니다. 대개 WATER MARK 값은 1로 설정되어 있고, 그 값보다 크게 데이터들이 들어와 있는지를 일일이 비교합니다. 즉 data의 level에 따라 select되는 것이고, 매번 I/O로부터 데이터가 올라왔을 때 바로 반응하는 epoll 을 사용하는 것이 좋습니다.

---
coolengineer.com


Posted by hoonihoon
2013. 12. 19. 11:03
동기 비동기 차이  (Synchronous, asynchronous 차이)

상대방의 일정 신호에 의해서 다음 동작이 이루어 지면 동기식
상대방의 상태와 관계없이 일방적으로 동작하면 비동기식


아래와 같은 함수가 있다면 getList() 메소드가 끝나면 list(Print)를 실행해야 되므로 동기식으로 되어야 한다.
getList();
listPrint();


ajax 에서 

1234567891011121314151617
// 전화번호를 검색하여 받아온다.
var telNo = '';
$.ajax({
url : '',
data : {},
type : 'post',
sendDataType : 'json',
success : function(data) {
telNo = data;
}
});
 
// 전화번호를 넣어준다.
$('#telNo').val(telNo);
 
// 정상적으로 전화번호를 넣어주지 못한다.
// success function에 console.log(data)를 찍어보면 잘나온다.

비동기로 처리 되기 때문에 흐름상으로 보면 ajax가 처리되고 난다음 telNo를 넣어줄꺼라

생각되지만, 실제 처리 되는 순서를 보면 ajax를 호출을 하고 data를 받지 못한상태에서

telNo에 값을 넣어주게 된다.

이는 ajax의 async option default값이 true로 되어 있기 때문이다.

그래서 ajax async option을 false로 주어야지만 정상적인 처리가 된다.

123456789101112131415
// 전화번호를 검색하여 받아온다.
var telNo = '';
$.ajax({
url : '',
data : {},
type : 'post',
sendDataType : 'json',
async : false,
success : function(data) {
telNo = data;
}
});
// 전화번호를 넣어준다.
$('#telNo').val(telNo);



Posted by hoonihoon
2013. 12. 19. 10:52

-다룰 객체를 미리 명시해줌으로써 형변환을 하지 않고 사용하는 것입니다


Posted by hoonihoon
2013. 12. 19. 10:51
Array Linked List 차이

Array:
- 동일한 자료형이고 메모리상에 연속적으로 놓인 데이터를 일괄적으로 처리하기 위해서
  만든 하나의 집합 형식으로 묶어놓은 자료구조
- 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
- 메모리 관리면에서 공간 낭비가 심하다
- 자료의 삽입 및 삭제시 성능면으로 떨어진다.


Linked List : (단순,이중(2개포인터),원형(노드의 처음과 끝이연결))
- 각 노드가 데이터와 포인터를 가지고 한줄로 연결되어 있는 방식.
- 노드의 포인터가 다음이나 이전의 노드와의 연결을 담당하게 된다
- 메모리 할당이 비연속적이며, 크기가 동적이므로 낭비가 없다
- 데이터가 많은 경우의 검색시에 처음 자료로부터 순차적으로 찾아야 하는 단점


Posted by hoonihoon
2013. 12. 19. 10:48
static변수와 field변수의 차이

- Class 당 하나만 생성되는 변수, 객체(인스턴스)를 아무리 많이 만들더라도 변수는 하나만 존재

- 객체가 생성될 때마다 새롭게 생성되는 멤버 변수와는 달리 초기에 한번만 생성되고 공유하여 사용가능

- static 변수는 객체가 생성(new)되기 전에 별도의 메모리 공간에 할당되어 초기화 된다

- static 변수가 초기화 되는 시점은 JVM에 의하여 클래스가 메모리 공간에 올라가는 순간이다.


Posted by hoonihoon
2013. 12. 19. 10:33
오버로딩과 오버라이딩 차이.  overloading overrideing

오버로딩(Overloaing)

일반적으로 하나의 클래스 안에 정의된 메소드는 이름이 중복될 수 없다.
오버로딩은 하나의 클래스에 같은 이름을 가진 메서드를 여러개 정의 할 수 있다.

단,  매개 변수의 정보가 달라야 한다. 

왜 쓸까?

동일하거나 유사한 일을 수행하는 메소드가 전달 받는 매개변수에 따라 조금씩 다른 연산을 해야 하는 경우

모든 상황에 따라 메서드 이름을 각각 정의 하는 것보다 매개변수 정보만 달리하여 동일한 이름으로 정의 한다면 코드를 작성하면

사용자 입장에서 직관적이고 편리하게 사용할 수 있다.



 


오버라이딩(Overriding)

클래스간 상속 관계에서 메소드를 재정의 하는 방법. 
오버라이딩을 할 메소드는 이름, 매개변수, 반환형이 모두 같아야 한다.


왜 쓸까?

부모클래스에 대해서 잘 알지 못하더라도 상속과 구현을 통해 이미 만들어 진 것을 사용하는 것이 가능하다.
클래스마다 다르게 구현할 필요없이, 메소드 오버라이딩을 통해서 한번에 로직을 작성하는 것이 가능하다.

이것을 다형성이라고 한다.


Posted by hoonihoon
2013. 12. 19. 10:06
프로세스와 쓰레드의 차이.  process, thread 차이

1. 
프로세스는 독립적으로 실행되며 자신만의 고유공간과 자원을 할당 받아 사용한다.
쓰레드는 한 프로세스 내에서 동작되는 여러 실행흐름 으로 프로세스 내 주소 공간이나 자원들을 대부분 공유하면서 실행된다.

2. 
프로세스는 부모 프로세스의 데이터 세그먼트의 자체 복사폰을 가지고 있다.
스레드는 그 프로세스의 데이터 세그먼트에 직접 엑세스 가능하다.

3. 
프로세스는 형제 프로세스와 통신하기 위해서 반스디 프로세스간 통신을 사용해야 한다.
스레드는 프로세스내 다른 스레드와 직접 통신 할 수 있다.

4. 
프로세스는 상당한 오버헤드가 있다.
스레드는 오버헤드가 거의 없다.
오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다. 

5. 
새로운 프로세스는 부모 프로세스의 복제를 필요로 한다.
새로운 스레드를 쉽게 만들 수 있다.

6. 
프로세스는 자식 프로세스에 대한 제어를 행사 할 수 있다.
스레드는 동일한 프로세스의 스레드를 제어 할 수 있다.

7. 
부모 프로세스에 대한 변경은 자식 프로세스에 영향을 주지 않는다.
메인 쓰레드의 변경(취소,우선순위변경 등) 은 프로세스내 다른 스레드의 행동에 영향을 미칠 수 있다.


스레드의 장점
-시스템의 throughput이 향상된다.
-시스템의 자원 소모가 줄어든다.
-프로그램 응답 시간이 단축된다.
-프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다.

스레드의 단점
프로그램 디버깅이 어렵다.
여러개의 스레드를 이용하는 프로그램을 작성하는 경우에는 주의 깊게 설계해야 한다.

스레드간 통신시에 데이터를 주고받는 방법은 메모리 공간을 공유하므로 데이터 세그먼트, 즉 전역 변수를 이용하여 구현한다. 
그런데 전역변수를 여러 스레드가 함께 사용하려면 문제가 발생한다.  따라서 스레드 간에 통신을할 경우에는 충돌 문제가 발생하지 않도록 동기화 문제를 해결해야 한다.



그외.

프로세스는 CODE, DATA, HEAP, STACK 으로 구성 되어 있고 쓰레드는 프로세스 안에서 CODE, DATA, HEAP을 공유하고 STACK 만 별도로 가주고 있다.
프로세스간 이동 시에 비해 STACK 만을 Switching 하면 되므로 전환 속도가 빠르다.






Posted by hoonihoon