DB 기록을 주기적으로 할 수 있는 기능..

작업 스케줄러처럼 주기적으로 쓸 수 있는데다가 쿼리를 넣어두거나 프로시저 호출 등을 지정해둘 수 있다!... 이런 기능을 몰랐었다니..




show variables like 'event%';

ㄴ이벤트 스케줄러가 켜져 있는지를 체크할 수 있다.



SET GLOBAL event_scheduler = ON ;

SET GLOBAL event_scheduler = OFF ;

ㄴ 이벤트 스케줄러를 껐다 킬 수 있다. (이벤트 동작 여부를 총체적으로 결정)



SELECT * FROM information_schema.EVENTS;

ㄴ 현재 db에 작성된 event 들을 볼 수 있다.




CREATE EVENT 이벤트명
ON SCHEDULE EVERY 1 MONTH STARTS TIMESTAMP('2016-01-01')
DO 
수행할 작업;
ㄴ 이벤트를 생성할 수 있다. MONTH면 달, HOUR면 시, DAY면 일 등.. 주기적인 설정이 가능하다. 수행할 작업에는 프로시저를 호출할 수도 있고, 그냥 쿼리문을 쓸 수도 있다.


show create event 이벤트명;

ㄴ 해당 이벤트를 어떻게 생성하는 지 구문을 볼 수 있다. (다른 곳에서 옮겨오기도 좋다)



ALTER EVENT 이벤트명 

ON 시작 설정 등등.. ;

ㄴ 이벤트 수정이 가능


DROP EVENT 이벤트명; 

ㄴ 이벤트를 삭제할 수 있다.




덧붙여 At을 붙여서


CREATE EVENT test

ON SCHEDULE AT '2016-06-21 22:04:00'

DO

create table tt(id int(10))


과 같이 만들면 한번 쓰고 버리게 된다!


'프로그래밍 > MySQL' 카테고리의 다른 글

이벤트 스케줄러(Event Scheduler)  (1) 2016.06.21
MySql DB 작성해보기  (1) 2016.03.13
MySQL 저장 프로시져 내에서 발생한 에러 처리 (Error Handling)  (0) 2016.02.23
MySql 설치하기  (0) 2016.02.21
Auto Increment란  (0) 2016.02.05
MySql 주석을 달자  (0) 2016.02.01
Posted by GENESIS8

댓글을 달아 주세요


윈도우 서비스가 필요한 경우가 있어서 학습 시도..

그러고보니.. 그냥 가동되는 서비스라고만 알았지 윈도우 서비스란 뭘까..


위키백과를 읽어본다.

윈도우 서비스(windows service)는 오랜 시간 동안 실행되며 특정한 기능을 수행하는 실행 파일! 사용자 간섭을 요구하도록 설계 되지 않음 윈도우가 실행되는 동안 백 그라운드 모드로 (숨어서) 실행된다.
그리고 유닉스의 데몬과 개념이 비슷하다고 한다.

서비스 관리는 services.msc 를 통해서 실행 중인 서비스를 관리 가능.


그냥 운영체제에 의해서 실행되는 실행 파일이다.


자 그럼 이런 서비스는 어떻게 등록 삭제 등을 하는 지 알아봐야겠다.



막상 서비스에 가보면 등록도 삭제도 없다. 중지와 실행 정도가 있을 뿐...



알아보니 윈도우 서비스는 sc.exe 라는 것의 도움을 받아야 한다고 한다.

sc 하니까 스타크래프트가 생각나지만 생각해보니 ServiCe의 약자인 것 같다.





MS의 기능 설명.
https://support.microsoft.com/ko-kr/kb/251192

항상 느끼는 거지만 MS 가서 보면 내용은 많고 분명하지만 설명이 빡치게 어렵다. 이해가 잘 안된다. 그래서 어떻게 쓰라는 건데 ;; 하는 생각이 먼저 든다.


좋은 블로그를 읽자!
http://gentian.tistory.com/1
http://joont.tistory.com/44


결론적으로 서비스 등록은 
sc create 서비스명 binpath= 파일경로
삭제는
sc delete 서비스명
ex) 
시작은
net start 서비스명
중지는
net start 서비스명

이라는 걸 배웠다.

세상에 조회라는 것도 있다. (sc query 서비스명)


간단하게 실습을 남겨두자.


명령 프롬프트 (CMD) 창을 소환한다. 단 이때 주의할 점은 '관리자 권한'으로 부른다. 그러지 않으면 ..거부된다.


관리자 권한으로 하면 바로 성공한다. 



등록이 된 것을 확인할 수 있다.




다시 삭제를 통해서 간단하게 제거가 된다.






'프로그래밍 > Windows' 카테고리의 다른 글

윈도우 서비스  (0) 2016.06.21
Posted by GENESIS8

댓글을 달아 주세요

전에 글을 작성했지만 다시한번 복습해보자.



Active Server Page


동작하는 서버 쪽


위키백과를 읽어보니 MS사에서 동적으로 웹 페이지를 생성하기 위해 개발한 서버 측 스크립트 엔진!!! 


덧붙여 현재는 ASP.NET이 ASP를 대체하고 있다고 한다.



장점 

java나 html과 달리 코드가 노출되지 않는다. 코드 대신 코드의 '결과'만이 노출된다.

html이나 java script로 5*1 라고 쓴 것과.. asp로 같은 내용을 쓰면 결과가 다르다. 

asp에서는 결과 5 밖에 보이지 않는다!


Active 라는 이름에서 알 수 있듯이, 동적인 작용이 가능하다. 유저의 행동에 반응하여 변동이 가능한 동적인 사이트가 작성될 수 있다.



단점

IIS 및 Windows 플랫폼에서만 동작하는 거지 같은 플랫폼 종속성이 있다. (MS 종특)



VBScript 외에도 동적 스크립팅 엔진은 @Language 지시문이나 <script language="language" runat="server"> 구문으로 선택하여 사용 할 수 있다



ASP.NET에서는 Visual Basic, C# 및 J# C++.NET 등을 지원한댄다.

J#? 이게 뭐지?.. visual studio에서 제공하는 자바(JAVA) 툴... (현재는 선 마이크로 시스템즈에 극딜당해서 업데이트가 나오지 않는다고 한다)



'프로그래밍 > ASP' 카테고리의 다른 글

ASP란 뭘까..  (0) 2016.06.20
IIS 및 ASP 사용 환경 구성  (0) 2016.06.20
ASP란 무엇인가  (0) 2016.02.20
Posted by GENESIS8

댓글을 달아 주세요


1. IIS가 있는가? -> 없다

IIS는 윈도우에 내장되어 있다고 한다.

제어판에 가면 윈도우 기능 사용/사용 안함(또는 켜기 끄기)가 있다. (영어판이면 windows 머시기.. turn on off.. 라고 되어 있다. 



그걸 눌러주면..



ASP는 닷넷 기반의 플랫폼이기 때문에 .NET(윈도우 버전 등에 따라 상기와 차이가 날 수 있지만 어쨌든 닷넷)을 설치해준다.

인터넷 정보 서비스 쪽에 체크를 해주는데, 필수 구성이 되는 몇몇만 설치해줘도 괜찮지고 속편하게 다 설치해도 상관 없다. 어느 쪽이던 체크를 다시 풀어서 제거하거나, 추가로 설치할 수 있기 때문에 취향에 맞게 해주면 된다.

(전부 설치하면 불 필요한 부분이 추가될 수 있긴 하지만...)


그렇게 설정이 끝났으면 확인을 눌러준다.


IIS를 검색하면 IIS 관리자가 뜬다. (6.0 호환등을 포함하여 체크한 경우 iis 6.0도 뜨게 된다)




혹시나 신경써야할 점

IIS Server의 경우 주기적인 세션 정리 시간이 존재(default). 1740분(29시간)으로 설정되어 있다. 이를 0분으로 설정해줘야 세션 정리를 하지 않는다. (잠깐 잠깐 끊겨도 되는 서비스면 상관 없다)


변경할 응용 프로그램 풀 대상 선택 - 고급설정 - 표준 시간 간격 0 을 설정시... 유휴 시간보다 적을 수 없다고 난리를 치기 때문에 유휴시간도 0으로 해주어야한다.




그리고 사용을 하려고 하면.. ASP.NET이 없다는 사실을 깨닫게 된다



나처럼 멍청하게 .NET으로 ASP 서비스 실행하고서는 왜 실행이 되지 않는 지 모르는 현상이 발생할 수 있으므로... 


ASP 서비스를 위해서는 ASP를 사용해야한다.



분명 위에서 windows 기능 사용 / 사용 안함 단계의 트리노드를 세세히 보다보면 ASP 서비스가 있다. 설치는 분명했는 데 보이지 않는다.


이는 등록이 되지 않았기 때문에 그렇다.




v4.0.30319 라는 건 어디까지나 내가 사용하는 .Net에 따라 다르다. (2.0을 써야한다면 그쪽에서 해봐야한다.) 내친김에 가보게 되면...


무수히 많은 폴더가 있는 것을 알 수 있다. 



방금 실행한 응용 프로그램이 이것이라는 것을 확인할 수 있다. 

(그렇다고 더블 클릭으로 실행하는 우를 범하지는 말자.. 인자를 받아야하는 응용프로그램인 만큼 그런식으로 실행하면 도움말만 뜰 뿐이다)



그리고 IIS 관리자에게 가보면!



ASP.NET 이 생긴 것을 확인할 수 있다.



이제 asp, aspx 등을 실행할 수 있다!


'프로그래밍 > ASP' 카테고리의 다른 글

ASP란 뭘까..  (0) 2016.06.20
IIS 및 ASP 사용 환경 구성  (0) 2016.06.20
ASP란 무엇인가  (0) 2016.02.20
Posted by GENESIS8

댓글을 달아 주세요



위키백과 , 나무위키


클라우드(Cloud)의 의미는 컴퓨터 통신망이 구름과 같은 것에 싸여 안이 보이지 않고, 일반 사용자는 이 복잡한 내부를 굳이 알 필요도 없이 어디에서나 구름 속으로 손을 집어넣어 자기가 원하는 작업을 할 수 있다는 것이다. 이른바 동일한 체험을, 인터넷이 연결된 어디에서나 보장해주는 것.


인터넷 상의 유틸리티 데이터 서버에 프로그램을 두고 그때 그때 컴퓨터나 휴대폰 등에 불러와서 사용하는 웹에 기반한 소프트웨어 서비스이다.


클라우드 컴퓨팅의 정의는 개인이 가진 단말기를 통해서는 주로 입/출력 작업만 이루어지고, 정보분석 및 처리, 저장, 관리, 유통 등의 작업은 클라우드라고 불리는 제3의 공간에서 이루어지는 컴퓨팅 시스템 형태라고 할 수 있다.


  • 클라우드 컴퓨팅은 IT 관련된 기능들이 서비스 형태로 제공되는 컴퓨팅 스타일이다.
  • 사용자들은 지원하는 기술 인프라스트럭처에 대한 전문 지식이 없거나 제어할 줄 몰라도 인터넷으로부터 서비스를 이용할 수 있다.
  • IEEE 에서는 "정보가 인터넷 상의 서버에 영구적으로 저장되고 데스크탑이나 테이블 컴퓨터, 노트북, 벽걸이 컴퓨터, 휴대용 기기 등과 같은 클라이언트에는 일시적으로 보관되는 패러다임이다." 라고 말한다.
일반적인 클라우드 컴퓨팅에서 소프트웨어와 데이터는 서버에 저장된다.
  • 클라우드 컴퓨팅은 웹 2.0SaaS(software as a service)와 같이 최근 잘 알려진 기술 경향들과 연관성을 가지는 일반화된 개념이다.
이들 개념들의 공통점은 사용자들의 컴퓨팅 요구를 만족시키기 위해 인터넷을 이용한다는 사실이다. 예로서 구글 앱스(Google Apps)가 있다.

이 외에도 IaaS, PaaS 등의 개념이 있다.

  • IaaS(Infrastructure as a Service): 서비스로써의 인프라라는 뜻으로, AWS에서 제공하는 EC2가 대표적인 예이다. 이는 단순히 서버 등의 자원을 제공해 주면서 사용자가 디바이스에 제약없이 데이터에 접근할 수 있도록 해준다.
  • PaaS(Platform as a Service): 서비스로써의 플랫폼이라는 뜻으로, 사용자(개발자)가 소프트웨어 개발을 할 수 있는 환경을 제공해 준다. 구글의 APP 엔진, Heroku 등이 대표적인 예다.
  • SaaS(Software as a Service): 서비스로써의 소프트웨어라는 뜻으로, drop box, google docs 등 과 같은 것을 말한다.



클라우드 컴퓨팅의 개념은 1965년 미국의 컴퓨터 학자인 존 매카시가 "컴퓨팅 환경은 공공 시설을 쓰는 것과도 같을 것" 이라는 개념을 제시한데에서 유래하였다. 1993년부터는 이미 클라우드라는 용어가 거대한 규모의 ATM을 지칭하는 데 쓰였다. General Magic라는 회사는 1995년 3월부터 AT&T와 다른 여러 통신사들과 제휴를 맺고 클라우드 컴퓨팅 서비스를 최초로 시작했다. 하지만 이 시기는 소비자 중심의 웹 기반이 형성되기 전의 일이었기 때문에 클라우드 컴퓨팅 사업은 당연히 실패했다. 그러나 10년이 지난 2005년에서야 클라우드 컴퓨팅이라는 단어가 널리 퍼지기 시작했다. 하지만 2005년 당시 클라우드 컴퓨팅의 대부분의 내용들은 SaaS에 집중되어 있었다. 2007년까지는 SaaS에 집중되어 있었지만 2008년부터는 더이상 SaaS에만 집중되어 있지 않으며, IaaSPaaS로 그 영역을 넓혀가게 되었다.


장점[편집]

  • 초기 구입 비용과 비용 지출이 적으며 휴대성이 높다.
  • 컴퓨터 가용율이 높다. 이러한 높은 가용율은 그린 IT 전략과도 일치한다.
  • 다양한 기기를 단말기로 사용하는 것이 가능하며 서비스를 통한 일관성 있는 사용자 환경을 구현할 수 있다.
  • 사용자의 데이터를 신뢰성 높은 서버에 보관함으로써 안전하게 보관 할 수 있다.
  • 전문적인 하드웨어에 대한 지식 없이 쉽게 사용 가능하다.

단점[편집]

  • 서버가 공격 당하면 개인정보가 유출될 수 있다.
  • 재해에 서버의 데이터가 손상되면, 미리 백업하지 않은 정보는 되살리지 못하는 경우도 있다.
  • 사용자가 원하는 애플리케이션을 설치하는 데에 제약이 심하거나 새로운 애플리케이션을 지원하지 않는다.
  • 통신환경이 열악하면 서비스 받기 힘들다.
  • 개별 정보가 물리적으로 어디에 위치하고 있는지 파악할 수 없다



정확한 개념이 의외로 복잡한데, 대부분의 작업을 온라인에 분산되어 존재하는 데이터 센터(Data Center, 이하 클라우드)에 맡겨 수행하고, 사용자의 컴퓨터는 클라우드에 접속하여 상호작용하는 단말기 역할만 하는 것이다. 이 때문에 모든 데이터와 연산 자원이 클라우드 안에만 존재하게 되며, 이 자원을 유연하게 관리하기 위해 가상화 기술 등이 투입되게 된다. 


또한 인터넷 서비스 운영자의 입장에서는 직접 서버를 운영하는 대신에, 구글이나 아마존닷컴, 마이크로소프트 등의 대기업의 클라우드 자원을 빌려 서비스를 운영하는 편이 차후에 서비스의 규모가 커졌을 때 대처하기 편하다. 서버 세팅/확장 등은 신경쓰지 말고 서비스 운영 자체에만 집중할 수 있게 해 준다. 컴퓨팅 자원을 마치 전기 끌어다 쓰듯이 쓸 수 있도록 해 준다고 보면 된다.

또한 이러한 서비스를 이용한 실상품으로는 구글에서 추진하고 있는 크롬북이 대표적이다. 크롬북은 컴퓨터 전원을 켜면 크롬 브라우저 하나만[4] 덩그러니 실행된다. 다른 프로그램은 어떻게 쓰냐고? 클라우드에 접속하면 문서도구, 그래픽, 게임을 불문한 모든 작업이 가능하다. 컴퓨터에 아무것도 저장하지 않은 상태로 오직 클라우드 내에서만 구글 크롬 스토어에서 취급되는 앱들을 비롯한 다양한 클라우드 앱을 이용할 수 있으므로 굳이 프로그램을 깔아서 쓸 필요가 없다는 컨셉이다. 다만 크롬북은 모든 작업을 웹과 클라우드상에서 처리하다 보니 인터넷이 없으면 말 그대로 깡통이 된다는 치명적인 단점이 있다.

애플의 맥북 에어도 어떻게 보면 비슷한데, iCloud드롭박스 등의 여러 클라우드 서비스 등장으로 굳이 하드 탑재로 용량을 늘릴 필요가 없어졌기에 맥북 에어의 경우 두께를 위해 용량을 희생하고 그 두께의 거의 모든 부분이 배터리 확충에 치중되고 있다. 저장 용량이 중요하지 않고 되려 사용자의 편의성과 직결되어 있는 배터리 양이 더 중요하다는 것이다. 다만 크롬북과는 달리 인터넷에 연결되지 않아도 웬만한 건 다 할 수 있기 때문에 아래에 서술된 클라우드의 단점 역시 어느 정도 극복할 수 있는 형태라는 결정적 차이점을 가진다.


 그리드 컴퓨팅과는 다르다, 그리드 컴퓨팅과는!

왠지 그리드 컴퓨팅이라는 개념과 혼동하는 경우가 많은데, 분산처리라는 점에서는 같으나, 다음 면에서 큰 차이를 보이고 있다.

  • 그리드 컴퓨팅은 '분산'에, 클라우드 컴퓨팅은 '중앙집중'에 초점이 맞춰져 있다. 실제로 그리드 컴퓨팅은 흩어져 있는 컴퓨터의 여유자원을 인터넷으로 합쳐서 특정 프로그램을 돌리는 것이고, 클라우드 컴퓨팅은 은 내부 네트워크 내 컴퓨터들의 자원을 합쳐 특정 프로그램들을 돌리는 것이다.

클라우드 컴퓨팅은 협업 처럼 한 그룹에 있는 애들이 같이 으쌰으쌰해서 파워를 합치는 것 이고,

그리드 컴퓨팅은 군대처럼 지가 해야될 일을 다른 애들한테 짬시키는 것 이다.

여기까지만 들으면 거의 같지 않나 싶지만.. 클라우드 컴퓨팅은 자기 내부 그룹에서 하는 일이고, 그리드 컴퓨팅은 얼굴도 모르는 애들한테 막 시키고 난리를 친다.


  • 그리드 컴퓨팅은 자원 자체가 흩어져 있기 때문에 중간에 해커가 개입될 수 있지만, 클라우드 컴퓨팅은 자원이 중앙집중 및 가상화되어 있기 때문에 이런 일이 불가능하다. 클라우드를 해킹하려면 어차피 네트워크 전체를 침입해야 하는데, 중간에 방화벽에 막히기라도 하면 말짱 도루묵. 또한 클라우드 컴퓨팅은 용량과 성능의 제약에서 벗어나게 되므로 운영체제 레벨의 보안 처리와 함께 예외처리 떡칠을 해버리게 되면 암호 문제나 내부적인 문제를 제외한 모든 침입면에서는 해커들이 떡실신 당하게 된다. 물리적으로 데이터 센터 내부에 직접 접속하거나 협조를 얻으면 몰라도, 최소한 단말기로 하려는 원격 소프트웨어 해킹 시도는 불가능에 가까울 것이다.

또한 슈퍼컴퓨터와도 혼동하는 일이 있는데, 슈퍼컴퓨터는 전용 OS를 이용하여 모든 노드를 하나로 묶는 반면 클라우드 컴퓨팅은 각 노드마다 OS가 따로 깔리고 상호간 처리는 클라우드 미들웨어 간의 네트워크 전송으로 해결한다. 물론 슈퍼컴퓨터를 여러대 연결해서 그걸 클라우드 컴퓨팅으로 돌리는 것도 가능하고, 외부에서 보면 슈퍼컴퓨팅이나 클라우드 컴퓨팅이나 그게 그거다.


2000년대 들면서 급부상한 IT떡밥 중 하나이나, 정작 통신 보안쪽으로는 크게 골머리다. 클라우드 컴퓨팅 환경에서는 사용자의 개인 정보가 클라우드에 저장되면 사실상 사용자가 그 정보의 위치를 통제할 수 없기 때문.[5] 이를 리처드 스톨먼이 딱 한 단어, (Trap)으로 지적한 바 있다. 덧붙여 사실상의 처리를 사용자의 시스템에서 처리하지 않기 때문에, 통상 시스템에 비해 트래픽이 증가하게 된다. 인터넷 종량제라도 시행했다간...컴퓨터를 켜는 거 자체가 요금 그나마 대부분의 트래픽이 클라우드 내에서 처리될 수 있다는 점에선 그리드 컴퓨팅에 비해 약과. 그리드 컴퓨팅의 경우 처리되는 모든 트래픽을 떠안아야 한다.


여하튼 가벼움이 가장 큰 장점이고, 보안 전문가들이 공밀레가 되는 대신에 일반 사용자는 보안에 그다지 신경을 쓸 필요도 없기에 MS의 Microsoft Azure를 필두로 여러 곳에서 적극 도입이 진행 중. 아파치 재단의 프로젝트인 Hadoop 및 관련 프로젝트들은 이걸 오픈소스로 구현한 것이다.


클라우드 컴퓨팅에는 개인목적으로 저장해둔 데이터들이 사용자 본인이 아무리 관리를 철저하게 한다 해도 하루아침에 사라지거나, 전혀 상관없는 제3자에게 공개될 수 있는 매우 치명적인 단점이 존재한다. 이러한 문제가 발생하는 원인은 전적으로 당신의 데이터를 관리하는 회사에게 있다. 즉 클라우드를 관리하는 회사가 망하거나, 변심하거나, 관리를 소홀히 한다면음모론처럼 들리는 이 단점이 곧바로 현실이 된다.


관리소홀로 인해 데이터가 통째로 증발한 사례는 이미 현실에서 실현되었다. 일본 퍼스트서버 사고가 그것이다. 클라우드 서비스 업체가 5698개 기업의 데이터를 몽땅 날려먹은 초대형 사고가 발생하였다.


차라리 망하면 다행인데 더 끔찍한 비극은 클라우드를 관리하는 회사가 임의로 사용자의 정보를 제3자에게 제공하는 경우다.



구름이란 의미답게 정의도 뜬구름 잡는 듯한 것이 많다. 용어 자체가 굉장히 넓은 범위를 포함하고 있으며, 사람마다 정의하는 의미가 전부 다르다. 실제로 관련 서적을 봐도, 기본적인 내용은 다 같을지라도 세부적인 정의가 전부 다 다르다.

K모 대학에서 관련된 강의를 했었던 기업에서 실무를 담당하고 있는 누군가의 말을 빌리자면, "누군가와 클라우드 컴퓨팅에 대해 토의할 일이 있으면 시간의 80%를 그 사람이 생각하는 클라우드와, 내가 생각하는 클라우드를 비교하는데 쓴다"라고 했을 정도로 사람마다, 기업마다, 부서마다 생각하는 게 다르다.





Posted by GENESIS8

댓글을 달아 주세요

Mysql 설치부터 말썽이더니.. 이번에는 접속이 제대로 안됬다. Workbench를 이용하려는데 접속이 안되서 무엇인고 하니.. MySql 자체를 실행을 안해서 그랬다;;;; 



ㄴ 요 창 보기 싫으면 반드시 관리자 권한으로 가동한 후 net start mysql로 키고 net stop mysql로 끄거나 할 수 있다.



다 필요없고, Mysql Notifier라는 프로그램으로 원버튼 클릭에 껐다 켰다 할 수 있으니 그것도 좋다.





테스트용으로 db를 작성해보려는데.. localhost가 아닌 127.0.0.1를 입력하는 참사를 일으켰다. 그러지 말고 정상적으로 localhost를 입력했더니 정상적으로 된다.


schema를 작성하려고 하니.. 

name과

collation 이라는 것이 나온다.




collation은 사전을 보니 ① 대조 ② 간단한 식사 ③ 조사 라는 의미로 나온다.


찾아보았다.


출처 : http://blog.daum.net/warmfeel/106


  1. 문자셋(Character Set)
    • 말 그대로 특정 '문자(좀 더 정확히는 symbol)'가 컴퓨터에 저장될 때 어떠한 '코드'로 인코딩되어 저장될 것인지에 대한 규칙이 정의되어있는 집합을 말함. (character set is a set of symbols and encodings.
    • 대표적인 것으로는 ASCII, 한글을 지원하는 EUC-KR, 유니코드 UTF-8, UTF-16 등이 있음.
    • 문자셋은 자신이 처리할 문자 집합이 얼마나 큰가에 따라 하나의 '문자'를 저장하는데 필요한 저장공간의 크기가 달라지게 된다. 또한 항상 모든 문자들을 동일한 크기로 인코딩하는 고정폭 방식의 문자셋이 있는가하면, EUC-KR(1~2바이트)이나 UTF-8(1~3바이트)과 같이 가변폭 방식의 인코딩을 사용하는 문자셋도 있다.
  2. 콜레이션(Collation)
    • 이것은 특정 문자셋에 의해 데이터베이스에 저장된 값들을 검색하거나 정렬 등의 작업을 위해 문자들간에 서로 '비교'할때 사용하는 규칙들의 집합이다. (collation is a set of rules for comparing characters in a character set.) 따라서, 일반적인 Data Type에는 적용되지 않고, CHAR, VARCHAR, TEXT와 같은 데이터 타입을 가지는 칼럼들에 대해서만 적용된다.
    • 주로 대소문자를 구별하는 binary 형식을 사용할 것인지, 대소문자를 구별하지 않는 Case Insensitive 형식을 사용할 것인지로 나누어진다. Case Insensitive 형식을 사용하는 collation들은 모두 collation 이름의 끝에 'ci'라는 문자가 붙어있다.

 

'특정 문자 셋'에 의해 DB에 저장된 값들을 검색 , 정렬등을 위해 문자들을 '비교'할 때 사용되는 규칙의 집합...


특별히, MySQL에서의 문자셋과 collation 에 대한 문제는 단순히 데이터를 저장하는 공간에 대한 관점만이 아니라, MySQL 서버와 MySQL 서버에게 요청을 하는 클라이언트 사이에 주고받는 상호작용에 대한 관점까지도 포함한다는 것을 꼭 기억할 필요가 있다. 

  • 데이터를 저장하는 관점 : MySQL은 Server 레벨, Database 레벨, Table 레벨, Column 레벨까지 총 4개의 레벨을 지원하는 특징을 가지고 있음.

서로 지원하는 문자 규칙이 안맞는 경우 아예 변환 자체도 불가능한데 (가까운 예로 ANSI와 UTF-8) 클라이언트 (주로 웹)와의 상호 작용에 대한 관점 까지 포함하는 듯 하다.


서버와 클라이언트간의 상호작용 관점 : MySQL은 이 관점에서 문자셋과 관련한 총 3개의 서로 다른 타입을 제공한다.

  • character_set_client : 클라이언트에서 문장이 떠날 때 해당 문장은 어떤 문자셋으로 이루어져있는가의 문제
  • character_set_connection : 클라이언트에서 넘어온 문장을 서버에서는 어떤 문자셋을 기준으로 해석해야하는가의 문제.
  • character_set_results : 서버에서 클라이언트로 응답을 넘겨줄때 어떤 문자셋으로 넘겨야하는가의 문제.
    • 따라서, 데이터베이스 레벨에서 euckr 문자셋이 기본값으로 지정되어있는 데이터베이스를 생성한 후 해당 데이터베이스에 데이터를 잘 입력하였는데 이상하게 브라우저로 넘기면 데이터베이스에서 읽어온 문자만 글자가 깨지는 상황이 벌어진다면(브라우저의 인코딩 설정 등은 정상적이라고 가정) 다음과 같이 체크해봐야 한다.
      • Database 레벨, Table 레벨, Column 레벨에서 원하는 문자셋으로 잘 지정되어있는지를 확인
      • client, connection, results 에서의 문자셋도 적절하게 지정되어있는지를 확인. (대개 글자가 깨지는 경우라면, 아마도 이쪽이 잘못 지정되어있을 가능성이 높다)
    • SQL 문장 중에 'SET NAMES euckr [COLLATE collation_name]'을 사용하면 앞에서 살펴본 client, connection, results 3가지에 대한 문자셋을 한꺼번에 지정해줄 수 있음. (서버 실행중에도 변경이 가능. 단, 서버 실행중에 SQL 문장으로 변경하는 것은 영구 변경이 아니라 현재 연결에 한해서만 임시로 변경하는 것임)
    • 임시 변경이 아닌 영구 변경을 하려면, MySQL 서버가 처음 시작할 때 참고하는 my.cnf 환경설정 파일내에 'init_connect=SET NAMES euckr' 이런식으로 지정해두면 됨.
    • 이렇게 영구 변경과 임시 변경 방법을 활용하면 좀 더 다양한 응용이 가능해진다.
      • 서버가 시작하는 단계에서 지정하는 경우 : 대개 환경설정 파일인 my.cnf 파일에서 'init_connect=SET NAMES euckr' 명령어로 지정. 이렇게 했을때는 해당 서버를 사용하는 모든 애플리케이션들에게 이 설정이 기본값으로서의 영향을 미친다.
      • 시작 단계가 아니라 서버가 실행중에 데이터베이스 별로 다른 문자셋을 사용하도록 지정하는 경우 : 일단 클라이언트가 서버로 연결을 한 이후에 곧바로 'SET NAMES euckr' 명령어를 실행시켜서 현재 연결에 대한 연결 관련 문자셋들을 수정해놓고 시작한다. 이렇게 하면, 각각의 데이터베이스별로 서로 다른 연결 관련 문자셋을 지정할 수 있게 됨(!!!)
      • 즉, 동일한 서버내에서 대부분의 애플리케이션은 utf-8 문자셋을 사용하는데 특정 애플리케이션만 euckr 문자셋을 사용하고자 할 경우에 위와 같은 방법을 사용하면 가능.
      • 참고로, PHP에서 사용하는 mysqli 확장에서는 'SET NAMES ...'를 query 메소드로 실행시키는 방법 이외에 'set_charset' 이라는 더 나은 메소드를 통해서 동일한 효과를 얻을 수도 있음.
  1. (질문) PHPMyAdmin에서 새로운 데이터베이스를 생성할 때, 해당 데이터베이스에서 사용할 Default collation 만을 지정하게 되는데... 그렇다면, 해당 데이터베이스이 Default Character Set은 어떻게 되는 것일까?
    • (대답) 뭐... 당연한 이야기겠지만, Default collation 만을 지정하게 되면 해당 collation이 속해있는 Character Set이 자동으로 그 데이터베이스의 Default Character Set으로 지정됨. 물론, PHPMyAdmin의 GUI 방식을 사용하지 않고, 직접 DDL 문장을 사용하면 하나 하나 별도로 지정해줄 수도 있음. 또한, PHPMyAdmin에서 데이터베이스를 생성할 때, Default collation 조차도 지정하지 않게 되면, 당연히 MySQL의 환경설정 파일인 my.cnf(또는 my.ini)에서 지정되어있는 시스템의 기본적인 Character Set이 적용되게 되며 Collation은 해당 Character Set의 Default collation이 적용되게 됨.


결론적으로 내가 이 db의 데이터를 어떤 문자셋으로 관리할 것인지, 또 그것과 상호작용할 대상은 누구인지를 생각하고 써야하는 것 같다. 이번에 해보려고 한 것은 웹에서 구동되게 만들어보려 했으니, UTF-8을 선택하게 되었다.



예약하는 것을 만들어보려고 했는데, 해당 날짜에 존재하는 몇 곳 테이블(자리)에 대한 작성이었기 때문에 같은 날짜의 행이 있을 수 없고, 그것을 기반으로 테이블이 딸려오기 때문에 날짜(date)를 PK 값으로 잡고, 나머지는 예약이 있을 수도 없을 수도 있기에 NOT NULL을 설정하지 않을까 하였으나.. 무결성이 날아가는 것 같아 ""라도 쓰도록 NOT NULL을 강제했다.




상당히 단촐한 테이블 구성이 완료되었는데, 이곳에 쓰일 SP를 작성하면 DB에서의 작업은 거의 끝난 것 같다.








'프로그래밍 > MySQL' 카테고리의 다른 글

이벤트 스케줄러(Event Scheduler)  (1) 2016.06.21
MySql DB 작성해보기  (1) 2016.03.13
MySQL 저장 프로시져 내에서 발생한 에러 처리 (Error Handling)  (0) 2016.02.23
MySql 설치하기  (0) 2016.02.21
Auto Increment란  (0) 2016.02.05
MySql 주석을 달자  (0) 2016.02.01
Posted by GENESIS8

댓글을 달아 주세요

  1. 1466100957 2016.06.17 03:15  댓글주소  수정/삭제  댓글쓰기

    잘 읽고 가여~





내가 원한 것과 달리 한글이 특수문자로 번역되어 나온다.



다음의 설정을 해주자. 인코딩 방식을 변경해주지 않으면 웹 환경에서 한글을 원활히 쓸 수가 없다. (아마도 iis와 파일 사이의 문제인듯 ..)


->

.NET 에서는 문자열 처리를 명시적으로 지정하지 않는 한, 기본적으로 "System.Text.UTF8Encoding" 으로 처리를 합니다. 문제는 거기서 발생을 하지요.

해당 HTML 텍스트 한글 파일은 메모장에서 "ASCII" 형식으로 저장된 것이었고, 디코딩을 UTF-8 로 해버리니 당연히 깨질 수 밖에 없습니다.


라는 답변을 찾을 수 있었다. ANSI를 말하는 것인 듯하다. ASCII 표준에 각국에 맞는 상태로 변경을 한다고 하니..




작은 따옴표에서는 특수문자(\n 등)와 변수가 작동을 안한다는 강좌의 내용을 확인한다.

웹 페이지 상에서는 \n가 안 먹히길래 보니까.. <BR>로 개행할 수 있다.





배열은 다른 언어와 다를 게 없다... 고 하는 데 출력이 좀 웃긴다.




1차원 배열은 변수와 마찬가지로 " " 내부에 작성하게 될 경우 정상적으로 값이 보이는 반면,

2차원 배열은 저처럼 ehco $arr[0][0] 과 같이 해주지 않으면 arr 0 과 같이 값이 보인다..

마치 값이 아니라 포인터를 출력하고 있는 듯한 느낌인데.. 이거야 원..


아무튼 다음은 클래스다. 

php도 c와 마찬가지로 클래스를 구성할 수 있다.

심지어 기호도 ->다.




클래스 내에서 변수를 사용한다면 꼭 $this->a 와 같이 해주어야한다. 그 사실을 모르고 찾으니 암에 걸릴 뻔.. 친절한 분들 감사하다. 연산자는 애로우연산자는 물론 스코프 연산자(::)도  c와 같은 방식으로 사용한다.


다음은 폼이다.




폼을 이용할 때 register_globals 옵션을 안 키면 겪는 여러 문제 때문에 헤맸는데, 보안적인 문제 ex) 비밀번호가 맞으면 이동을 위해 지역 플래그를 변경하는 코드일 때, 그것을 전역에서 간섭할 수 있는 문제.. 같은 문제가 있으므로 키지 않고 쓰는 코딩 습관이 옳다고 한다.




'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글

php 기초 실습  (0) 2016.03.13
php 입문 사전 지식  (0) 2016.03.13
html 중급?  (0) 2016.02.21
HTML 기초  (0) 2016.02.21
비즈니스 로직(Business logic)?  (0) 2016.02.14
웹서버(Web Server) / 웹 서버 어플리케이션(WSA)  (0) 2016.02.14
Posted by GENESIS8

댓글을 달아 주세요




CGI는 위와 같은 구조를 가지는데.. ( HTML은 1과 4의 과정만 있음 )
보시는 바와 같이 HTML 보다 한단계 더 처리를 함으로써 계산과 처리 기능이 추가되었습니다. 이로인해 우리는 정적인 변화 없는 웹 페이지에서 변화가 자유롭고 방문자와 홈페이지 제작자간에 서로 상호작용이 가능한 웹 페이지를 만들 수 있게 된 것입니다.
그러나 여기서 주의해야 할 점은 3번에서 보듯이 CGI로 처리된 값은 HTML로 전송되어 집니다.
웹 브라우저는 HTML밖에 모르니 HTML로 바꿔서 보여줘야 하는 것입니다.
( PHP를 하려면 당연히 HTML을 알고 있어야겠죠? )

그러면 CGI와 PHP는 어떤 관계인가?

PHP는 약간 다르긴 하지만 일종의 CGI라고 볼 수 있습니다.


CGI는 일반적으로 웹서버로 요청이 들어오면 CGI 프로그램을 실행하여 하나의 프로세스를 생성하고 그 처리 결과를 웹서버로 전송한 후 프로세스가 종료되는 형식입니다.
100개의 요청이 들어오면 CGI 프로세스가 100개가 생성이 됩니다.

PHP는 CGI와 달리 아파치 웹서버에 모듈로 장착되어 있습니다.
따라서 매회 실행시마다 프로세스가 생성되는 CGI와 달리 하나의 프로세스에 여러개의 쓰레드를 생성하여 처리가 가능합니다. 

그래서 프로세스방식인 CGI 보다 쓰레드방식인 PHP가 성능이 우수합니다.



PHP는 무엇인가?

PHP (공식적 PHP Hypertext Preprocessor) 는 Server - side HTML-embedded 스크립트 언어입니다.
즉, PHP는 서버에서 실행되며 HTML을 포함한 스크립트 언어라는 말입니다.
HTML을 포함하고 있기 때문에 HTML 파일을 PHP 확장자 (.php )로 저장하여도 아무 지장없이 사용할 수 있습니다.

시작(<?php)과 끝 태그(?>)를 이용하여 HTML과 PHP를 구분합니다.



php도 세미콜론으로 한 문장을 파악하므로 줄의 끝에는 세미콜론이 필요.


주석은 // , # , /* */



Type (변수형)

진리값 , 정수 , 실수 , 문자열 , 배열 , 객체 , 리소스 , 널 총 8가지의 변수형


특수문자

의미

\n

 개행문자 ( 줄 바꿈 )

\r

 캐리지 리턴

\\

 역 슬래쉬

\t

 수평 탭

\"

 따옴표

\$

 달러 표시


<php?

?>

안의 내용이 php 내용이 된다.



2) 따옴표 내의 변수사용

큰 따옴표내에서는 변수의 사용이 가능합니다.
예를 들어 $name 이라는 변수에 "조명진" 이라는 문자열이 저장되어 있다면,
$str = "나의 이름은 $name입니다.";
라고 하였을 때 $str = "나의 이름은 조명진입니다."; 와 같은 효과를 가지게 됩니다.

2. 작은 따옴표

'나는 문자열이다.' 와 같이 작은 따옴표 안에 문자열을 넣으면 됩니다.
작은 따옴표를 이용한 방법은 큰 따옴표를 이용할 때와 차이가 있는데,
작은 따옴표 내부에 쓰여진 특수문자와 변수가 허용되지 않는 다는 것입니다.
echo '작은 따옴표 안에서는\n 특수문자와 변수가 $name 동작을 안해요.';
의 결과는 작은 따옴표 안에서는\n 특수문자와 변수가 $name 동작을 안해요. 처럼 그대로 표현됩니다.

3. 히어닥 문법

$str = <<<EOD
문자열이라네~
나도 문자열이라네~

EOD;


PHP에서는 0부터 시작하는 숫자형 인덱스와 foo 같이 문자로 구분하는 인덱스 두가지가 있습니다


<?
class Human {  //인간 클래스를 정의 합니다.

        var $Name;
        var $Age;
        var $Height;
        var $Weight;  

        function Eat ( ) { 먹는 행위를 함수로 정의 }
        function Walk ( ) { 걷는 행위를 함수로 정의 }
        function Work ( ) { 일하는 행위를 함수로 정의 }
        function Talk ( $words ) { 말하는 행위를 함수로 정의 }
}    

    $철수 = new Human; //인간 클래스를 이용해 철수 객체를 생성
    $철수->Eat(); // 철수야!! 밥먹어라~!
    $철수->Talk($철수->Age); // 철수야~ 몇살이야? 말해봐!!
?>

php에서는 클래스를 이렇게 정의한다.


상속도 있다.


<?

class Baby Extends Human { //인간 클래스를 상속받아 아기 클래스를 정의 합니다. }

?>


static은 지역 변수 허용,

전역 변수는 전역 위치에 선언하되 지역변수와 혼선시 global $a와 같이 식별가능

define("상수명","상수에 저장될 값");



미리 정의된 변수

변수에는 우리가 만들어 사용할 수 있는 변수와 미리 정의되어진 변수가 있습니다.
우선 미리 정의된 변수는 서버 종류, 버전 등이나 기타 환경에 따라 변하는 변수들입니다.
아파치와 PHP 각각 몇 개의 변수를 지정해 놓은 상태이며 이 변수들은 우리가 인위적으로 값을
수정하거나 일반 변수로 사용할 수 없습니다.

수퍼 전역변수

$_GET

 HTTP GET 방식으로 넘어온 변수

$_POST

 HTTP POST 방식으로 넘어온 변수

$_COOKIE

 HTTP 쿠키 변수

$_FILES

 업로드시 파일 정보 변수

$_SESSION

 세션 변수

$_SERVER

 웹서버와 PHP 환경에서의 환경 설정 변수

외부로 부터의 변수

내부에 선언없이 외부로부터 넘어오는 변수입니다.
예제를 보시면 이해가 가실 겁니다.


출처 : http://www.ezphp.net/lecture/lecture5.php

였었는데..


보던 곳이 <?php 와 <?에 의한 문제 발생이라던가, 코드가 제대로 실행되지 않는 등.. 상태가 좋지 않아 다른 곳으로.


출처 : http://www.apmsetup.com/php.php



논리 연산자




$a and $b
:  $a 와 $b 가 모두 참(true) 이면 참(true)

$a or $b
:  $a 와 $b 중 하나라도 참(true) 이면 참(true)

$a xor $b
:  $a 와 $b 중 하나만 참(true) 이면 참(true)

!$a
:  $a 가 참(true) 이면 거짓(false), 거짓(false) 이면 참(true)

$a && $b
:  $a 와 $b 가 모두 참(true) 이면 참(true)

$a || $b
:  $a 와 $b 중 하나라도 참(true) 이면 참(true)


$_POST[변수명]

$_POST[$변수명] -> PHP 설정 파일 (ini)의 register_globals = on 인 상태에서만 가능하다. 

register_globals를 켜면 변수등을 사용할 때 앞에 _SERER 등을 안 붙이거나 하는 등 전역변수를 편히 쓸 수 있지만.. 안전성이 떨어진다고 한다/



산술 , 대입 연산은 동일하니 생략.


비교 연산은 다음과 같이 한다.

if($a == "hi" && $b == "bye")


switch case도 동일하다. $변수 로 넣어야한다는 것 뿐..

그 외의 경우를 의미하는 default도 그대로다


include 제어문

<header.inc>

<?
$string = "Hello World";
?>


<output.php>

<?
include "./header.inc";

echo("$string");
?>



class는 C와 같으며, 상속은 자바와 같이 extends 를 사용한다.

상위 클래스 접근 시 parent 키워드를 사용할면 된다.


심지어 접근 연산자 (access modifier)도 있다;







'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글

php 기초 실습  (0) 2016.03.13
php 입문 사전 지식  (0) 2016.03.13
html 중급?  (0) 2016.02.21
HTML 기초  (0) 2016.02.21
비즈니스 로직(Business logic)?  (0) 2016.02.14
웹서버(Web Server) / 웹 서버 어플리케이션(WSA)  (0) 2016.02.14
Posted by GENESIS8

댓글을 달아 주세요

Visual Studio 2010 도구상자 문제 해결

어느 날 상용 컴포넌트를 추가 삭제 하다 보니

도구상자가 미친 듯이 로딩되고 글자가 겹쳐서 보이는 등 이상현상이 발생

초기화 방법을 찾다가 발견한 방법이다.

 

* Windows7 기준으로

c:\Users\Administrator\appdata\local\microsoft\VisualStudio\10.0\

폴더에 들어가서  toolbox로 시작하는 파일을 삭제해 주고

Visual Studio 를 다시 실행하면 도구상자를 다시 빌드 해서 표시한다.



'프로그래밍 > C++++ (C#)' 카테고리의 다른 글

도구 상자가 보이지 않는다!!!  (0) 2016.02.26
C#의 where  (0) 2016.01.22
delegate  (0) 2016.01.22
typeof  (0) 2016.01.22
c# using 키워드  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요


속도는 느려지고, 쓰기 위해서 이것 저것 해야해서 불편한 동기화를 대체 왜 해야하는 걸까?


동기화의 이유는 순서 또는 공유 자원 때문이다.

순서는 말 그대로.. A가 처리 된 이후에 B가 처리되어야하는 상황(입금이 되면 상품을 발송할 게 같은.)일 때 두 작업을 처리하는 작업자가 서로 다르다면 순서가 안 맞는 (입금이 안됬어도 상품을 줄게) 상황이 일어날 수 있으므로.. 순서를 맞출 때 쓰는 것이다.


두 작업자가 하나의 자원에 동시 접근(Write / Read)하는 것인데...

그림은 그냥 동시에 접근하는 것 처럼 보이지만 실제로는 한 대가 다닐 수 있는 병목 구간에 두 자동차가 같이 들어가려는 것 같은 상황이다.


사실 컴퓨터가 작업을 동시에 처리하는 능력이 없고, 하나 씩 처리한다는 것에 비춰볼 때.. 순서가 있다면 그렇다면 사실상 '동시 접근' 은 없는 게 아닌가? 하는 생각이 들었다.


동시 접근이 없다? 그런데 왜 문제가?..



OS가 행하는 스케쥴링은 각 작업자에게 시간을 잘게 잘라서(time slice) 분배하는데.. 위 같은 경우 작업자 A가 공유자원을 미처 다 쓰지 못했을 때, B가 바로 들어오게 된다. 그러니까 상황이 이렇게 된다.

빨간 선 간의 간격이 작업을 하게 지급된 퀀텀(quantum)이라고 가정했을 때,

위와 같이 작업을 하러 들어와서 A를 처리하고 B를 처리한다면 공유자원 문제는 절대로 발생하지도 않을 것이고, 모든 동기화 기법들은 장사를 접어야한다.


그런데 현실은 녹록치 않아서 (단위가 무려 천분의 1초인 millisecond를 10 ~ 20초 지급 받는다) 간격은 더럽게 짧고, 해당 간격이 끝났다면 다음 작업자 (B)에게 넘어가는 식이다.

즉 A - B - A - B - A - B 로 작업이 끝나게 된다.


물론 이 상황은 스케쥴러의 정책에 따라 다르다. 라운드 로빈 같은 경우는 다 똑같이 공평한 시간이 분배되고, HRN 같은 경우 긴 작업과 짧은 작업에 차등성을 부여하는 등 차이가 있을 수 있다.



아무튼 문제가 되는 것은

ABAB.. 로 시작되었을 때 이다. 공유자원이 문제라고 했는데..

A -> B -> B 로 돌아오는 이 과정의 사이 사이에는 문맥[상황] 교환(context switching)이 일어나게 된다. 



이처럼 시간이 지날 때마다 CPU는 A - B - A - B로 작업자가 전환되게 된다. 

문제는 작업이 전부 끝나지 않았을 때, 쓰레드에게 모든 했던 처리를 버리라고하면?

인셉션이 된다. A(10%) - [A버림] > B(10%) - [B버림] -> A(다시 10%) ...


당연히 처리해놓았던 것을 저장해두어야하고, 그것을 메모리 내에 저장해두게 된다. 그리고서는 다시 레지스터에 올려 작업을 시작하게 되는 데...


우리가 두 스레드 A , B 를 통해 공유 자원(주로 데이터 영역)을 변경한다면

A B가 작업하고 난 뒤에 우리가 원하는 형태는


A와 B의 작업이 완료된 공유자원. 의 상태일 것이다.



[ 공유자원 ]

[ A의 작업이 반영된 공유자원 ] <- A 작업 끝

[ A의 작업이 반영된 B의 작업이 반영된 공유자원] < - B 작업 끝



하지만 현실은..


[ 공유자원 ]

 < --- 공유 자원을 가져온 A의 작업 중...

    ㄴ 인터럽트 / 스레드 B 실행

       ㄴ A의 상태 저장 (context switching)

[ 공유자원 ]

 < --- 공유 자원을 가져온 B의 작업 중...

    ㄴ 인터럽트 / 스레드 A 실행

      ㄴ B의 상태 저장 (context switching)

 < --- A의 작업을 반영

[ A의 작업이 반영된 공유자원 ]

 < --- B의 작업을 반영

[ B의 작업이 반영된 공유자원 ]



...?!


최종적으로 B의 작업이 반영된 공유자원이 남았다.


이는 B가 [A의 작업이 반영된 공유자원]을 가져간 게 아니기 때문이다.


[ 공유자원 ]

- > 공유자원을 가져온 A의 작업 시작

[ A의 작업이 반영된 공유자원 ] <- A 작업 끝

- > A의 작업이 반영된 공유자원을 가져온 B의 작업 시작

[ A의 작업이 반영된 B의 작업이 반영된 공유자원] < - B 작업 끝


의 구조로 이루어져야하는 절차가


[공유자원 ]

- > 공유자원을 가져온 A의 작업 시작

  ㄴ interrupt / context switching

- > 공유자원을 가져온 B의 작업 시작

[ A의 작업이 반영된 공유자원 ] <- A 작업 끝

[ B의 작업이 반영된 공유자원 ] <- B 작업 끝


와 같이 되기 때문이다.


물론 스레드 예제를 실행시켜보면 알겠지만.
ABABABABABAB 가 아니라.
AAAABBBABABBBAB 라던가 ABAABBAABBBBAA처럼
균일하지 않게 스레드가 실행되므로 위처럼 순서가 지켜지지 않고
B나 A가 연속적으로 처리되는 일도 있을 수 있다.

이런 것을 비 결정론적 성질(버그)이라고 하는데.. 간단히 말해서 할 때마다 다르다는 얘기다.

우리가 원하는 

[ A의 작업이 반영된 B의 작업이 반영된 공유자원 ] 이라는 상태는

AAA BBB 해서 작업이 끝나버린다면 완벽하게 반영될 것이고... 

이는 오류 없음 의 결과를 도출하게 된다.


그렇지만 스케쥴링이 ABABAB 라던가 AABBBA 같이 된다면 결과는 예측할 수 없게 된다.


비단 멀티 스레드만이 아니라 멀티 프로세스 환경 등에서도 일어날 수 있다. 공유자원을 두고 둘 이상의 작업자가 진입하면 일어날 수 있는 현상인 것이다. 이를 경쟁 상태(race condition)이라고 한덴다...


아무튼 그래서 둘 이상의 작업자가 공유자원에 접근하게 되는 환경에서는 연산이 섞이는 일이 없도록 원자적 연산(atomic operation)을 보장해주거나 [이 경우 값 넣고 있는 동안은 세트로 묶여서 섞이지 않는 범위 까지 연산을 보장해준다]


동기화 기법을 쓰게 되는 것이다.







Posted by GENESIS8

댓글을 달아 주세요

  1. juicyjerry 2020.12.16 00:42 신고  댓글주소  수정/삭제  댓글쓰기

    정리를 잘 해주셔서 잘 읽었습니다.
    유익한 정보 잘 보고갑니다~ :)