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

컴퓨터에서 자원이라 함은 주로 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. 재시작 후 윈도우즈 업데이트 확인




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


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




Comma Separated Values (CSV)









한 레코드의 각 필드를 쉼표(,)로 구분한 텍스트 기반 데이터 파일 포맷이다. 확장자는 .csv이며 MIME 형식은 text/csv이다. 한글로 씨에스브이 라고 읽는다.


홍길동 1992년 7월 17일 국어100점 영어90점 수학70점

희동이 1992년 4월 3일 국어90점 영어100점 수학100점

예를 들어 학생기록부에 위와 같은 데이터를 CSV로 저장한다고 하면

홍길동,1992,7,17,100,90,70
희동이,1992,4,3,90,70,100

과 같이 저장된다. CSV포맷의 줄 바꿈 문자는 라인 피드(LF) 또는 캐리지 리턴-라인 피드(CRLF)를 사용한다.


단점은 데이터 자체에 쉼표가 들어가 있는 형태의 데이터를 취급하기 곤란하다. 예를 들어 천 단위마다 쉼표를 찍어 놓은 금액 데이터를 CSV에 직접 집어넣으면 문제가 된다. 따옴표로 감싸는 등의 해법이 있지만 보통 더 쉽게 구분자를 탭 문자(\t)로 바꾼 TSV 등을 사용한다. 사실 CSV라는 데이터 구조 자체에 무슨 표준이 있는 것은 아니라서 구분자를 뭘로 쓰든 데이터를 주고받는 사이에 약속만 지키면 된다. CSV에서 사용하는 특수 문자는 필드 구분자와 레코드 구분자 둘 뿐이고 인용이나 이스케이프 문자는 선택 사양이다. 일반적으로 데이터 생산자가 CSV데이터의 성격을 보고 필드 안에 들어갈 확률이 가장 적은 문자를 필드 구분자로 정한다. 레코드 구분자 역시 필드에 줄바꿈이 자주 쓰일 경우 라인 피드 대신 널 문자(NULL)를 쓰기도 한다.[1]

일반적으로 CSV파일의 무결성을 검증할 때는 한 줄의 콤마 수를 센다. 모든 줄의 콤마 수는 다 같아야 하며 더 적거나 더 많은 줄이 발견되면 오류로 판단해 걸러내는 등의 적절한 처리를 할 필요가 있다. 가장 일반적으로 발견되는 오류는 다음과 같다.

- 내용에 콤마가 들어가서 한 줄의 콤마 수가 몇 개 늘어나는 경우
- 줄바꿈 문자가 누락돼 한 줄의 콤마 수가 두 배로 늘어나는 경우
- 내용에 줄바꿈 문자가 들어가서 두 줄 이상의 콤마 수가 정상보다 적은 경우
- 줄바꿈 문자의 캐리지 리턴(CR)을 걸러내지 못해 마지막 필드의 데이터가 깨지는 경우
- 따옴표가 정상적으로 닫히지 않아 임의의 필드와 레코드가 한 필드 안에 인용돼 들어간 경우
- 마지막 줄의 라인 피드 누락으로 마지막 줄 데이터를 읽지 못한 경우
- 첫 줄에 헤더 텍스트가 들어간 CSV를 사용할 때 첫 줄을 건너뛰지 않은 경우



CSV 형식




1.  Each record is located on a separate line, delimited by a line break (CRLF).  


->  레코드는 줄 바꿈 (CRLF)으로 구분할수 있다.


For example:

       aaa,bbb,ccc CRLF

       zzz,yyy,xxx CRLF


2.  The last record in the file may or may not have an ending line break. 

 

-> 파일의 마지막 레코드 끝에 줄 바꿈 이 있거나 없을수 있다.


For example:


       aaa,bbb,ccc CRLF

       zzz,yyy,xxx


3.  There maybe an optional header line appearing as the first line of the file with the same format as normal record lines.  This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional "header" parameter of this MIME type). 

 

-> 첫번째 행에는 일반 레코드와 동일한 형식을 갖는 헤더행이 표시될 수 있다. 이 헤더는 파일의 필드에 해당하는 이름을 포함하며 나머지 파일의 레코드와 동일 한 수의 필드를 포함해야한다. ( 헤더 행의 유무는 옵션의 "header"매게  변수를 통해 표시되어야 한다.)

For example:


       field_name,field_name,field_name CRLF

       aaa,bbb,ccc CRLF

       zzz,yyy,xxx CRLF



4.  Within the header and each record, there may be one or more fields, separated by commas.  Each line should contain the same number of fields throughout the file.  Spaces are considered part of a field and should not be ignored.  The last field in the record must not be followed by a comma.  


-> 헤더와 각 레코드 내에 하나 이상의 필드는 쉼표로 구분된다. 각 줄에는 동일한 내용이 포함되어야한다. 파일 전체의 필드 수. 공백은 파일의 일부로 간주되며 무시해서는 안된다. 마지막 레코드의 입력란은 쉼표가 와서는 안된다.


For example:


       aaa,bbb,ccc


5.  Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft Excel, do not use double quotes at all).  If fields are not enclosed with double quotes, then double quotes may not appear inside the fields. 


-> 각 필드는 큰 따옴표로 묶을 수도 있고 안묶일 수도 있다. (Microsoft Excel과 같은 일부 프로그램에서는 큰 따옴표를 사용하지 않는다.) 

필드가 큰 따옴표로 묶이지 않으면 필드 안에 큰 따옴표는 나타나지 않을 수 있다.


For example:


       "aaa","bbb","ccc" CRLF

       zzz,yyy,xxx


6.  Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes.  


-> 줄 바꿈 (CRLF), 큰 따옴표 및 쉼표가 포함 된 필드는 큰 따옴표로 묶어야합니다.


For example:


       "aaa","b CRLF

       bb","ccc" CRLF

       zzz,yyy,xxx


7.  If double-quotes are used to enclose fields, then a double-quote appearing inside a field must be escaped by preceding it with another double quote.  


-> 필드를 둘러싸는 데 큰 따옴표가 사용된 경우에는 다른 큰 따옴표를 사용하여 필드 안에 표시된 큰 따옴표를 먼저 처리하여 해당 필드에서 벗어나야 한다.


For example:


       "aaa","b""bb","ccc"


7번 규칙에대한 설명을 덫 붙히자면 이스케이프 문자가 앞에추가되어야한다.

예를 들어 " 를 csv 포맷으로 바꾸면 최종 문자열이 """" 이 된다. 왜그럴까?


우선 6번의 규칙과 7번의 규칙이 혼합된 결과라고 보면된다. 더블쿼테이션 문자는 6번 규칙에의해 ""에 묶여야한다.

그렇게 되면 문자의 형태는 """ 이 된다.

7번 규칙에 의해 " 인 더블쿼테이션이 들어간 필드에는 이스케이프 문자가 추가된다. 그렇게 되면 """형태가 된다.


눈치가 빠른 사람이라면 알겠지만 하나의 필드를 묶는 더블쿼테이션은 빨간색 필드안에 오리지널 문자 레코드는 검은색 그 레코드의 이스케이프 문자는 파란색으로 구분 해놓은것이다.







+ Recent posts

티스토리 툴바