TCP/IP는 대표적인 광역 네트워크 프로토콜이다. 미국의 군사 네트워크에서 활용했떤 프로토콜이였으나 이제는 전세계로 묶는 네트워크 프로토콜로 발전했다. 


웹브라우져를 통해 URL이나 IP주소를 입력하면 해당 사이트에 접속하여 웹 페이지가 열린다. 너무나 간단해 보이지만 여기에는 아주 복잡한 네트워킹 과정이 담겨 있다. 웹 통신 프로토콜인 HTTP 프로토콜은 TCP/IP 프로토콜을 기반으로 만들어져있다.



IP주소

전세계를 연결하는 TCP/IP 네트워크에 접속하려면 IP주소를 하나 갖고 있어야한다. 이주소는 친구의 집 주소와 같은 형식은 아니지만 전 세계에서 중복되지 않는 유일한 숫자(IPV4 체계에서는 32비트 숮자)이다. 따라서 이 주소만 알면 주소지 컴퓨터로 정보를 전달할 수있다. 물론 상대뿐만 아니라 나도 유일한 IP주소를 가져야 한다.


친구에게 물건을 택배로 보낸다느 가정하에 먼저 할 일은 보낼물건을 포장하고 친구의 집 주소를 송장의 받는 사람 주소에 쓰게된다. 이렇게 송장에는 반드시 받는 사람과 받는사람의 주소를 함께 적는다. 이렇게 하면 보낼 준비는 끝난 것이다. 그 다음 택배회사에 전화를 할 것이고, 택배회사에서 물건을 가지러 오면 택배기사에게 물건을 전단하고 수령한 물건을 택배회사에서는 배달지에 따라 분류해서 지역별 집겨지로 보낸다. 그런 다음 택배기사는 배달지에 도착해서 받는 사람 주소에 친구가 정말 사는지 확인하고 물건을 전달한다. 


정보를 전달하는건 ISP회사(KT,SKT,LG)가 담당한다. 따라서 인터넷을 통해 정보를 보내려면 ISP에게서 회선을 임대한 후 인터넷으로 접속하는 유일한 IP주소를할당받고 상대 주소로 정보를 전송하거나 역으로 수신받는다.

최종적으로 정보를 수신하는 호스트의 운영체제는 어떤 프로세스가 정보를 수신해야 하는지 확인하여 처리를 완료한다.


인터넷 프로토콜 버전4는 32비트 주소체계를 갖고 있다. 32비트는 네 개의 8비트로 재구성되며, 각각의 값은 10진수로 표시하고 구분점으로 나누어진다. 

자신의 아이피 주소를 확인하려면 CMD에서 IPCONFIG 명령을 사용하면 확인 가능하다.


IP주소는 네트워크 ID와 호스트 ID로 나누어지는데 네트워크 ID는 네트워크를 식별하는 주소(서울시 종로구 종로동), 호스트 아이디는(X번지) 해당 네트워크에 속한 컴퓨터 주소이다.  네트워크 프로그래밍에서는 호스트라는 말을 사용하는데 IP주소를 갖는 장치가 반드시 PC나 서버 같은 컴퓨터만이 아니라 다양한 네트워크 장비도 될 수 있기 때문이다.



SOCKET

일반적으로 네트워크 프로그래밍이라 하면 TCP/IP SOCKET 프로그래밍을 의미한다. 바꿔서 말하면 소켓 프로그래밍 곧 네트워크 프로그래밍이라 할 수 있다. 그런데 여기서 말하는 소켓은 기존의 파일 개념과 유사하다. 일반적으로 파일이라 함은 보조기억장치에 젖아된 데이터를 말하기 마련인데, 좀더 정확히 말하자면 보조기억장치를 추상화한것이다.


하드디스크가 내부적으로 작동되는 원리르 모르더라도 파일을 열고 쓰고 닫을 수 있따면 우리는 하드시크를 다룬다고 할 수 있습니다. 마찬가지로 보통 LAN카드라고 부르는 네트워크 카드도 하나의 파일로 추상화가 가능하다. 이렇게 추상화된 파일에 정보를 저장하면 하드디스크에 저장되지 않고 네트워크 카드를 통해 외부로 전달된다.


파일이 장치를 추상화한 것이라고 가정할 때만 일 대상 장치가 네트워크 카드이면 파일이라는 말 대신에 소켓이라고 한다. 그러므로 소켓 프로맹이라는 것은 네트워크 카드를 추상화한 파일 포인터를 다루는 일로 정리된다. 그래서 우리가 파일에 대해 알고 있는 프로그래밍 지식 대부분이 소켓 프로그래밍에서 적용된다.


파일의 정보를 읽거나 쓰려면 파일을 열어야 하는것처럼 소켓도 핸들을 열어서 입출력을 하게된다. 물론 사용한후에 핸들을 닫아야 한다. 여기서 조금 전에 설명한 TCP/IP에 대한 기초 지식을 결합하면 소켓에 대한 정의가 끝난다



이후에 MFC를 이용한 TCP/IP 소켓프로그래밍 채팅프로그램을 생성해보겠다.

프로그래밍에서 동기화가 필요한 경우는 매우 다양하다.

컴퓨터에서 자원이라 함은 주로 cpu나 메모리를 의미하는데 연산에 직접적으로 관여하는 부품을 말한다. 주변 정보기기와 통신하기 위한 인터럽트나 I/O 번지도 굳이 따지면 자원으로 분류된다. 그런데 이런 자원은 늘 제한되는 특성을 갖는다. 반면에 시스템은 여러 프로세스를 동시에 실행하여 운영하게 되면서, 각각의 프로세스는 저마다의 코드에 따라 특정 자원을 점유하려는 시도를 끊임없이 하게 된다. 이런 시도를 조정할 관리 시스템이 없다면 프로세스간의 충돌이 있을것이다.


지금부터 나오는 내용은 이런 구조적인 문제를 해결하기 위해 운영체제에 도입된 객체를 활용하는 방법이다.

운영체제가 제공하는 동기화용 커널객체에는 뮤텍스, 세마포어, 이벤트 등이 있다. 사용자 모드 동기화 객체로는 크리티컬 색션이 있다.




크리티컬 섹션(Critical Section)


- 한 시스탬 내에서 여러 스레드가 실행 중이라고 하더라도 실제로 CPU를 점유하여 연산을 하는 스레드는 하나이다. 코어가 두개라면 두 스레드가, 네 개라면 네 스레드가 동시에 실행 중일수 있다. 여러 스레드는 운영체제가 정하는 스케쥴에 따라 컨텍스트 스위칭을 하면서 실행된다는 것이 더 중요하다. 


- 크리티컬 섹션 객체로 보호하는 대상은 주로 전역 객체이다. 그중에서도 메모리와 관련된 대상은 반드시 그렇게 해야 멀티스레드 환경에서 문제가 되지 않는다.




뮤텍스와 데드락(Mutex Dead-lock)


- CMutex 클래스는 커널 뮤텍스를 객체화한 MFC클래스이다. 스레드와 프로세스를 동기화 시키는데도 사용한다. 일반적으로 스레드를 동기화 시킬때에는 뮤텍스가 아니라 크리티컬 섹션을 사용할 것을 권장한다. 이유는 뮤텍스가 동기화를 하는데 드는 비용이 크리티컬 섹션에 비해 크기 때문이다. 그렇다고 체감하기는 어렵지만 효율적으로 프로그래밍 하려면 고려해야하는 영역이다.


- CCriticalSection class나 CMutex class 모두 CSyncObject class의 파생 클래스인데 이들 클래스가 Lock()과 Unlock()메서드를 가상 함수로 정의한다. 

- CCriticalSection 에서는 인자값으로 주어지는 시간이 무시 되지만 CMutex 클래스에서는 이값이 적용되는데 여기서 시간은 멀티스레드 환겨에서 특정 스레드의 코드가 안전하게 주어지면 100mx 동안 다른 스레드의 저근이 차단되고, 100ms 이후에는 Unlock() 함수를 호출하지 않아도 자동으로 Lock() 함수가 풀리도록 한다. 이와 같은 기능이 필요한 이유는 데드락을 방지하기 위해서이다.


- 데드락은 스레드간의 서로 특정 자원을 점유한 상태에서 Lock() 함수를 호출하여 다른 스레드의 접근을 차단했지만 내부 코드사에서 조건이 맞지 않아서 Unlock() 함수를 호출하지 못하고 모든 스레드의 흐름이 정지된 상태를 말한다.


- Lock()함수에 시간값 인자를 줌으로써 데드락을 피해 특수한 상황에서도 스레드가 특정 코드나 자원으 무한저응로 점유하지 못하게 할수 있는것이다.



세마포어(Semaphore)


- 세마포어는 크리티컬 섹션이나 뮤텍스가 한 번에 한 스레드나 프로세스만 특정 리소스에 접근할 수있었던 것과달리동시에 여러 스레드나 프로세스가 특정 리소스에 접근할수 있도록 임의로 허용치를 정할 수 있다. 만일 10개의 스레드가 동시에 실행되는 멀티스레드 시스템에서 3개의 스레드만 리소스에 동시 접근이 가능하다면 일럴때 적합한 동기화 객체가 바로 세마포어이다.


- 서버 응용 프로그램에서 이런 구조가 절시하게 필요하다. 만일 동시에 최대 1000명까지 처리하는 서버가 있다고가정할대 일반 서비스의 경우에는 1000명 클라이언트 모두에게 서비스가가능하지만 특정 서비스만큼은 동시 접속을 10명까지로 서시브 제한을 두어야할 수도 있다. 이럴 경우에는 세마포어는 최선의 동기화 방법이 된다.


다음에 이벤트 방식의 동기화 방법에 설명하겠다.






안녕하세요.



공기어때팀입니다. 

5월 1일에 공기어때 버전업이 있었습니다. 

현재 최신 버전은 1.0.3 v 입니다.

꼭 마켓에서 업데이트를 받아주세요!




업데이트 내용


1) GPS 탐색 기능 개선 

- 기존 GPS 탐색 소스를 새롭게 작성하여 GPS탐색 소요 시간을 단축시켰습니다.

- GPS 탐색 시간 감소로 로딩시간이 줄어들었으니 좀더 쾌적하게 이용하실수 있습니다.


2) Update 오류 수정

- 기존 마켓 버전 체크하는 방식이 변경되어 실행시 업데이트 다이얼로그가 출력되는 이슈가 있었습니다.

- 이젠 업데이트 체크 방식을 바꿔 해당 버그를 수정했습니다.



이상 업데이트 내용에 대한 소개를 마치겠습니다.

미세먼지가 심한 요즘 외출시 꼭 마스크를 착용하셔서 건강 챙기시길 바랍니다.

감사합니다~!


OS 재설치후 윈도우즈 업데이트를 받을려는데 이게 진행이 안되는 현상을 겪었습니다.


재부팅도 해보고 이것저것 해봤는데도 안되기에 구글에 검색해보니 윈도우즈 업데이트 문제 해결사를 다운로드 받으라고 하더군요.


해결사가 진단한 내용은 '잠재적인 Windows 업데이트 데이터베이스 오류가 검색됨' 이였습니다.



1. 업데이트  데이터베이스 오류 해결



그래서 직접 고쳐보자 해서 구글링해보니 MSDN에 이렇게 답변이 되어있네요.


1. CMD 우클릭 관리자 권환으로 실행


2. DISM.exe /Online /Cleanuup-image /Scanhealth 입력


3. 실행 결과 확인


4. 재부팅


사실 저는 이렇게해서도 자동으로 윈도우즈가 업데이트를 하지 못했습니다.





2. 클린 부팅


그래서 또 구글링을 했는데 그 방법은 클린 부팅을 함으로써 외부프로그램이 윈도우즈 업데이트에 간섭을 못하도록 함이였는데요.


1. msconfig 실행


2. 서비스 -> 모든  microsoft 서비스 숨기기 -> 모두 사용안함


3. 시작프로그램 -> 작업 관리자 열기 -> 시작프로그램 - >  의심되는 프로그램을 사용안함시키거나 모두 사용안함시키세요

(저같은경우 안랩의 보안프로그램이 문제였던거같습니다.)


4. 재시작 후 윈도우즈 업데이트 확인




저같은 경우에는 백신프로그램이 영향을 주고 있엇던거 같습니다.


실행중인 백신프로그램을 전부 사용안함시킨 다음 클린부팅 시키니 정상적으로 업데이트가 되네요 ^^!



+ Recent posts