1. 프로세스의 스케줄링(Scheduling)

: 멀티 프로세스 기반 운영체제에서는 CPU를 프로세스에게 골고루 할당해주는 일이 필요한데, 이는 운영체제의 일부분인 스케줄러가 담당한다.

* 일반 OS와 리얼타임(Real Time) OS의 차이점

: RTOS와 일반 OS의 차이는 응답성(응답속도)에 있다. RTOS는 응답성이 Windows와 같은 일반 OS보다 좋다. 

: OS는 범용적인 목적을 위해 제작되었고, RTOS는 사용되는 목적이 구체적이고 제한적이기 떄문에 보다 단순하게 디자인됐으며 일반 OS에 비해서 훨씬 가볍다.

* Soft RTOS vs Hard RTOS

: 위에서 설명 한 것이 Soft RTOS이다.

: 전통적으로는 RTOS를 Hard RTOS의 개념으로 본다. 이는 일반 OS에 비해서 단순히 응답성이 좋은 것정도로 설명되지 않는다. Hard RTOS에서 중요시 하는 것은 개선된 응답성이 아니라 Dead Line이다.

: 안전, 핵 발전 등 데드라인이 중요한 시스템에서 이를 크리티컬하게 충족시킬 수 있는 능력을 지니는 RTOS를 가리켜 Hard RTOS라고 한다.

: 따라서 이를 디자인하는 것은 쉬운일이 아니며 일반 OS와 다른 알고리즘으로 스케줄러가 디자인된다.

* 선점형(Preemptive) OS 와 비선점형(Non-Preemptive) OS

: OS를 구분할때 OS와 RTOS로 나누는 것 처럼, 프로세스 실행을 다른 프로세스로 넘기는 방식에 따라서 선점형 OS와 비선점형 OS로 구분한다.

- Non-Preemptive OS

: 현재 실행 중인 프로세스보다 높은 우선순위의 프로세스가 등장한다고 해서 실행의 대상을 바로 변경하지 않는다. 현재 실행중인 프로세스가 끝나거나 Blocked 상태에 놓일때까지 기다린다.

: Interactive한 프로그램 구현시 프로그래머 의존도가 높아지는 문제점을 지닌다. 

- Preemptive OS

: 현재 실행 중인 프로세스보다 높은 우선순위의 프로세스가 등장하면 스케줄러에 의한 실행 순서 조정이 적극적으로 가해진다.

: 둘 이상의 프로세스를 동작시키는 멀티 프로세스 기반 OS에 적합하다

: 오늘날은 거이 Preemptive OS를 사용한다.

* Preemptive OS의 대표적인 두가지 알고리즘

- Priority 스케줄링 알고리즘

: 각각의 프로세스마다 우선순위를 부여해서 우선순위가 높은 프로세스를 먼저 실행시키는 방식이다. 

- Round-Robin 스케줄링 알고리즘

: 동일한 우선순위를 가지고 있을 때 정해진 시간 간격만큼만 실행하고 다른 프로세스에게 CPU를 할당하는 방식이다.

: 최소 단위 시간간격을 가리켜 Quantum 혹은 Time Slice라고 하는데 이를 기준으로 CPU할당을 넘기게 된다.

* 스케줄링 알고리즘에 의해서 스케줄링이 진행되는 시점

: Preemptive OS를 디자인한다고 가정한다면, 어느 시점에 스케줄러가 동작하도록 디자인하면 좋을까?

: 세가지 경우의 수이다.

1. Round-Robin 방식의 스케쥴링 알고리즘 관점 

: 정해진 시간이 지날 때마다 ==> 매 타임 슬라이스마다 스케줄러가 동작해야함

2. Priority 방식의 스케줄링 알고리즘 관점

: 우선순위가 높은 프로레스가 무조건 실행되어야함. 즉, 새로운 프로세스가 등장할 때마다, 혹은 현재 프로세스가 종료되었을 때 스케쥴러가 동작해야한다.

3. Blocking 관점

: Blocking 되었을 때 다른 프로세스가 실행되어져야 하므로 스케줄러가 동작해야한다.

* Priority Inversion

: 프로세스의 우선순위가 뒤바뀌는 현상이다.

: 우선순위가 A>B>C 라고 가정할때 밑과 같은 문제가 있다.

: 위의 문제는 A와 C 프로세스가 협업을 하는 도중 A가 C를 기다리기 위해 Blocking 되었을 떄 B가 C를 치고 나와 먼저 실행되는 현상이다.

: 해결방법은 운영체제마다 다르지만 A가 C에게 자신의 우선순위를 위임하고 Blocked 상태로 빠지는 방법이 있다.

2. Windows 프로세스 우선순위

: Windows는 총 6단계의 우선순위 계층을 제공한다.

: 우선순위가 어떤 경우에 사용된다는 평범한 기준은 없지만, 직접 바꾸며 실행해보면서 시스템에 어느정도 영향을 미치는지 보고 경험적으로 결정한다.

3. 명령프롬프트 프로젝트 기능 추가

* Redirection(리다이렉션) 의 이해

: 방향 재지정을 의미한다. 콘솔에서 입력하던것을 파일로부터 입력을 받는 것처럼  입력과 출력을 재지정하는 것이다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


1. 핸들 테이블과 오브젝트 핸들의 상속

: 오브젝트 핸들의 상속과 핸들 테이블에 대한 개념을 소개할 것이다.

: Windows 운영체제를 이해하는데 도움이 되며, 파이프 기반 IPC를 이해하는데 필요하다

* 프로세스의 커널 오브젝트 핸들 테이블

- 핸들과 커널 오브젝트의 리뷰

: 리소스(프로세스)를 관리하기위해 커널 오브젝트가 생성되고 그 결과 이를 가르키는 핸들이 반환된다. 이때 핸들은 특정 주소를 가르키게 되는데 사용자는 핸들 테이블을 참조하여 특정 주소를 참조할 수 있다.

- 프로세스의 핸들 테이블 도입

: 핸들 테이블은 핸들 정보를 저장하고 있는 테이블로써 프로세스 별로 독립적이다.

: 각각의 프로세스가 자신만의 핸들 테이블을 하나씩 구성하고 관리한다.

: 프로세스가 CreateProcess 함수나 CreateMailslot과 같은 함수 호출을 통해서 리소스 생성을 요구한 결과로 핸들 정보를 얻게 될 경우, 프로세스 자신에게 속해 있는 핸들 테이블에 해당 정보가 등록된다.

: 핸들 테이블은 프로세스 별로 독립적이다.

* 핸들의 상속

: CreateProcess 함수 호출시 전달되는 인자 가 무엇이냐에 따라서 부모 프로세스 핸들테이블에 등록되어 있는 핸들 정보가 자식프로세스에게 상속될 수 있다.

- 핸들의 상속에 대한 이해

: 부모 프로세스 핸들 테이블의 상속여부에 따라 자식의 핸들 테이블에 상속이 될지 말지 결정된다. 각 항목의 상속 여부 또한 상속이 되므로 변경하지 않는이상 상속된 항목은 계속 상속된다.

- 핸들의 상속을 위한 전달인자

: CreateProcess의 다섯번째 전달인자인 bIngeritHandle 이 자식 프로세스에게 핸들 테이블에 등록되어 있는 핸들정보를 상속해 줄것인지를 결정한다.

- 핸들의 상속과 커널 오브젝트의 Usage Count

: 프로세스가 핸들을 얻게 되었다는 의미는 핸들 테이블에 해당 핸들에 대한 정보가 갱신 되었음을 의미하는 것이다.

- 상속이 되기 위한 핸들의 조건

: SECURITY_ATTRIBUTES 구조체를 확인하고 내부 상속 속성은 TRUE로 설정해준뒤 CreateMailslot 함수의 인자로(주소값을) 넘겨준다.

: 결국 CreateProcess 함수 호출시 핸들 상속과 관련해서 두가지 사항을 결정해야한다.

1. 부모 프로세스 핸들 테이블의 상속여부

2. 생성된 자식 프로세스 핸들의 상속여부

* 예제를 통해서 확인하는 핸들 정보의 상속

: 자식 프로세스가 부모의 핸들 테이블을 상속하여 메일슬롯을 통해 IPC를 할 수 있다.

: 핸들 테이블은 운영체제에 의해 관리되기 때문에 등록된(상속된) 핸들 정보를 자식 프로세스는 확인할 수 없다.

: 부모 프로세스가 자식 프로세스에게 핸들 정보를 자식 프로세스에게 전달해 줘야만 상속된 핸들이 의미를 지니게 된다.

* Pseudo 핸들과 핸들의 중복(Duplicate)

: GetCurrentProcess 함수를 통해 얻은 자신의 핸들은 가짜(pseudo) 핸들이라고 한다. 이렇게 얻어진 핸들은 핸들 테이블에 등록되어 있지 않은 핸들이기 때문이다.

: DuplicateHandle을 이용하면 진짜 핸들을 얻을 수 있다.

: 가짜 핸들을 복사하여 자신의 핸들 테이블에 등록하는 것이므로, 커널 오브젝트를 가리키는 핸들이 두개가 된다. 그러므로 CloseHandle 함수를 통해 Usage Count를 감소시켜주어야 한다.

* 부모 프로세스의 핸들을 자식 프로세스에게 전달하기

: DuplicateHandle을 이용하여 상속가능한 핸들을 테이블에 등록하면 상속이 된다.

2. 파이프 방식의 IPC

* 메일슬롯에 대한 회고와 파이프의 이해

: Windows의 파이프 메커니즘에는 Anonymous Pipe와 Named Pipe 두가지가 있다.

: 메일슬롯은 서로 관련이 없는 프로세스들 사이에서 통신할 떄 유용한 IPC 기법이다. 브로드 캐스트 방식의 단방향 통신이므로 동시에 여러 프로세스에게 발송이 가능하다.

: Anonymous Pipe는 관계가 있는 프로세스 사이에서 통신하는 경우에 유용하다.

: Named Pipe는 관계가 없는 프로세스들 사이에서도 데이터를 주고 받을 수있으며 양방향 통신이 가능하다. 따라서 간단한 채팅 프로그램을 만들어보기 용이하다.

* Anonymous Pipe

: CreatePipe 함수로 구현하며, 데이터를 읽고, 쓰는 파이프의 주소값을 반환받아 여기에 파일을 읽고, 쓰면 원하는 값을 얻을 수 있다.


* Named Pipe

: Server 프로세스가 CreateNamedPipe 함수를 통해 파이프를 생성한 뒤 ConnectNamedPipe 함수를 호출하여 연결 요청을 기다리는 파이프로 상태를 변경한다.

: Client 가 CreateFile통해 연결 요청을 위한 리소스를 생성하고 연결을 시도한다.

: 자세한 예제는 책을 참고하자

3. 프로세스 환경변수

: 프로세스 생성시 main 함수의 매개변수를 통해 핸들 정보를 전달하는 것이 안전하다.

: 프로세스 별로 별도의 메모리 공간에 문자열 데이터를 저장하고 관리할 수 있도록 되어있다.  [key, value] 형식이며 상속, 부모 프로세스에서 자식의 환경변수 등록 모두 가능하다. 


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


: 커널 오브젝트의 두가지 상태와 핸들 테이블에 대한 개념을 이해하기 위해서 프로세스간 통신 기법을 예로 들것이다.

1. 프로세스간 통신(IPC(Inter-Process Communication))의 의미

: 둘 이상의 프로세스가 데이터를 주고 받는 행위

* 프로세스 사이에서 통신이 이뤄지기 위한 조건

: 서로 통신하고자 하는 프로세스가 서로 만날수 있는 여건 (공유하는 메모리 영역이 존재하는 것을 의미)이 허락되거나,

: 전화나 메신저 같은 보조 수단이 필요하다

* 프로세스들이 서로 만날 수 없는 이유

: 프로세스들은 자신에게 할당된 메모리 공간 이외에는 접근이 불가능하다.

* 프로세스들이 서로 만나지 못하게 디자인한 이유

: 프로세스간 간섭을 차단하여 안전성을 높이기 위함


2. 메일 슬롯 방식의 IPC

* 메일슬롯 원리

: 메일슬롯은 파이프와 더불어 대표적인 IPC기법이다.

: 선형적인 메모리 구조의 특성을 반영하여 메일 박스가 아니라 슬롯이 된 것으로 보인다.

: 데이터를 주고 받기 위해서 프로세스가 우체통을 마련하는 것

: Sender(발송인)는 Receiver(수신인)의 주소를 통해서 Receiver의 메일슬롯을 향해 데이터를 날린다.

: Receiver는 메일 슬롯을 통해 데이터를 얻을 수 있다.

* 메일 슬롯 구성을 위해 필요한 요소

1. Receiver가 준비해야 할 것에 대해서 먼저 살펴보자

: 데이터를 받으려면 우체통 즉, 메일 슬롯을 생성해야 한다.

: CreateMailslot 이 그 함수이다.

2. Sender가 준비해야 할 것에 대해서 살펴보자

: Sender는 Receiver가 만들어 놓은 메일 슬롯의 이름을 알아야한다.

: 메일 슬롯은 파일이 아님에도 불구하고, 파일 입출력 함수를 사용해서 데이터를 주고 받는다. 이는, 메일슬롯이 Windows 파일 시스템을 기반으로 구현되어있기 때문이다.

* 메일슬롯의 고찰과 앞으로의 전개에 대해서

: 단방향 통신만 가능하다

- 메일슬롯과 IPC에 대한 고찰

: 메일 슬롯은 한쪽 방향으로만 메시지를 전달할 수 있다. 따라서 두 프로세스가 서로 메시지를 주고 받을 수 있는 채팅 프로그램을 구현하기 위해서는 두개의 메일 슬롯을 생성해야한다.

: 브로드 캐스팅 방식의 통신을 지원한다. 즉, 하나의 Sender는 한번의 메시지 전송으로 여러 Receiver에게 동일한 메시지를 동시에 전송하는 것이 가능하다.

: 메일슬롯은 Usage Count가 1이다.

* 앞으로의 전개에 대해서 : 중간 집필 후기와 고민거리

: 커널 오브젝트의 상태와 핸들 테이블에 대한 개념에 더 관심을 가져야한다.

: Windows는 내부적으로 생성하는 대부분의 리소스들에 대해서 커널 오브젝트를 생성한다.

3. Signaled vs Non-Signaled

: 커널 오브젝트의 상태에 대한 내용을 설명할 것이다.

* 커널의 두가지 상태

- 상태에 대한 이해

: 상태라는 용어를 쓰는 이유는 상황에 따라 변하기 때문이다.

: Signaled 상태(신호를 받은 상태)와 None-Signaled 상태(신호를 받지 않은 상태)이다.

: 상태를 커널 오브젝트에 저장해둔다. 전자를 True, 후자를 False로 표현하게 된다.

- 프로세스 커널 오브젝트의 상태에 대한 이해

: 프로세스가 Running 상태일때 커널 오브젝트는 Non-Signaled 상태이다

: 프로세스가 Terminated 상태일때 커널 오브젝트는 Signaled 상태이다.

: Non-Signaled 에서 Signaled 상태로 갈 수 있지만, 반대의 경우는 불가능하다. 새로 프로세스가 생겨나기 때문이다.

* 커널 오브젝트의 두가지 상태를 확인하는 용도의 함수

: 커널 오브젝트가 상태를 지니도록 Windows 운영체제가 디자인된 것은 프로그래머에게 다야한 기능을 제공하기 위해서이다.

* 커널 오브젝트의 상태 확인이 필요한 상황의 연출

: 1~5 를 더하는 프로세스와 6~10 을 더하는 프로세스가 끝난 뒤 이 두 결과를 더하는 프로세스를 돌릴때

* 커널 오브젝트에 존재하는 종료코드

: 자식 프로세스의 종료코드는 커널 오브젝트에 저장된다.

: 부모 프로세스는 여기에 접근하여 데이터를 얻을 수 있다.

: IPC 통신을 통해 얻을 수 있다.

* 구현의 문제점

: 프로세스가 종료되지 않은 상태에서 GetExitCodeProcess가 호출되면, 상수 STILL_ACTIVE(259)값이 얻어지게 된다.

: 프로세스가 완전히 종료된 상태에서 호출되어져야 한다.

* WaitForSingleObject 함수의 유용성

: 이 함수를 통해 자식 프로세스의 결과를 자식 프로세스가 끝난 후 얻을 수 있다.

: 자식 프로세스가 Non-Signaled 에서 Signaled로 변했을 때까지 부모프로세스를 Blocked 상태에 머무르게 한다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기





1. 커널 오브젝트에 대한 이해

: 커널이란, 컴퓨터를 운영하는데 있어서 중심이 되는 운영체제 핵심 부분을 뜻하는 것이다.

: 일반적으로 커널과 운영체제는 같은 의미로 사용되어지기 때문에 명확히 구분하지 않아도 된다.


* 커널오브젝트의 이해

: 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록을 가리켜 커널 오브젝트라 한다.

: 프로세스의 생성, 소멸, 상태변화 등 모든 일들을 운영체제가 관리하게 된다. 이때, 스케쥴러에 의해 관리되어질려면 갱신되는 혹은 고정적인 정보가 있어야 한다.

: 이러한 정보를 모아 두기 위해 Windows 운영체제 개발자들은 구조체 하나를 정의하게 되었고 프로세스가 생성될때마다 이 프로세스 관리 구조체 변수가 하나씩 생성된다. 이것이 바로 커널 오브젝트의 정체이다.

: 커널 오브젝트는 프로그래머가 직접 생성하거나 조작할 수 없기 때문에 이정도 이해면 충분하다.

* 그 이외의 커널 오브젝트들

: 프로세스 내에서 프로그램 흐름을 구성하는 쓰레드를 생성할때에도, IPC(Inter Process Communication)때 사용되어지는 파이프나 메일 슬롯을 생성할 때에도 만들어진다.

: 파일을 생성할 때에도 생성된다. 이 또한 Windows 커널에 의한 관리 대상이기 때문이다.

: 커널 오브젝트의 종류에 따라서 다른 구조체를 기반으로 생성된다.

Windows 운영체제는 프로세스, 쓰레드 혹은 파일과 같은 리소스들을 원활히 관리하기 위해 필용한 정보를 저장해야 한다. 이때 데이터를 저장하는 메모리 블록을 가리켜 커널 오브젝트라 한다.

* 오브젝트 핸들을 이용한 커널 오브젝트의 조작

: 커널 오브젝트를 함수 호출에 의한 간접적인 조작은 가능하다.

- 프로세스의 우선순위 변경

- 커널 오브젝트에 할당되는 숫자 핸들(Handle)

- 핸들 정보는 어디서?

: 프로그램 내부 함수에서 호출할 수 있다.

: 함수가 호출되어 실행되는 중간에는 절대로 CPU의 할당 시간을 다른 프로세스에게 넘겨주지 않을것이다 라는 오해를 범하지 말자!

: 중간중간에 넘겨질수있음.


2. 커널 오브젝트와 핸들의 종속 관계

* 커널 오브젝트의 종속관계

: 커널 오브젝트는 Winodws 운영체제에 종속적이다.

: 커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트의 소멸시점은 운영체제에 의해서 결정된다.

: 커널 오브젝트는 프로세스에 종속적인 것이 아니라 운영체제에 종속적인 관계로 여러 프로세스에 의해서 접근 가능하다

* 핸들의 종속관계

: 핸들(핸들 테이블)은 운영체제에 종속적이지 않고 프로세스에 종속적이다.

: 두개의 프로세스가 하나의 커널오브젝트에 순서대로 접근하여 우선순위를 변경하는 것이 가능하다.

: 핸들을 얻는 방법은 커널 오브젝트의 종류와 상황에 따라서 다양하다.

* 프로세스핸들, 쓰레드 핸들, 프로세스 ID, 쓰레드 ID

: 프로세스 핸들은 프로세스 커널 오브젝트를 가리키기 위한 것이고, 프로세스 ID는 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위한 것이다.

3. 커널 오브젝트와 Usage Count

: 커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트 소멸시기는 운영체제에 의해서 결정된다.

* CloseHandle 함수에 대한 정확한 이해

: 프로세스가 생성되면 이를 위한 커널 오브젝트가 생성되고, 이때 커널 오브젝트는 완전히 프로세스를 대표하게 된다.

: 프로세스가 소멸된다고 해서 커널 오브젝트가 소멸된다고 말할 수 없다.

: 해당 프로세스에 대해서 더이상 관여할 바가 아니니, 해당 프로세스 핸들을 반환하라는 뜻.

: 프로세스가 소멸된다는 뜻이 아님.

* CloseHandle 함수와 프로세스 종료코드

: 운영체제는 커널 오브젝트 소멸시점을 어떻게 결정 짓는가?

: 프로세스가 종료되어야 한다.

* 커널 오브젝트와 Usage Count

: 자식 프로세스의 종료코드는 자식의 커널 오브젝트에 저장된다.

: 자식 프로세스가 종료될때 커널 오브젝트도 동시에 소멸된다면 부모 프로세스는 종료코드를 얻을 수 없게 된다.

: 그러므로 프로세스가 종료되었다고 해서 커널 오브젝트까지 동시에 소멸시키지는 안흔다.

: 해당 커널 오브젝트를 참조하는 대상이 하나도 없을 때 소멸시키는 것이 가장 이상적이고, 이것이 Windows가 커널 오브젝트 소멸시기를 결정하는 방법이다.

: Windows 는 Usage Count(참조횟수)를 통해 0이되는 순간 해당 커널 오브젝트를 소멸시킨다.

: 커널 오브젝트에 접근 가능한 대상이 늘어날 때마다 Usage Count가 하나씩 증가한다.

* Usage Count와 CloseHandle

: 자식의 커널 오브젝트는 부모와, 자식 둘다 접근하고 있으므로 자식의 프로세스가 종료된다고 하더라도 부모의 프로세스가 접근하고 있기 때문에 Usage Count가 1이 된다.

: 이 때 CloseHandle 함수를 호출하면 자식의 커널 오브젝트에 더이상 접근하지 않게 되면서 Usage Count가 하나 감소하여 0이된다.

: CloseHandle함수는 핸들을 반환하면서 커널 오브젝트의 Usage Count를 하나 감소시키는 기능을 한다.

: 바탕화면에서 파일을 실행시키게 되면 바로 CloseHandle함수를 호출하여 핸들을 반환해버리기 때문에 Cusage Count가 1이게 된다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기



1. 프로세스의 이해

: 오늘날의 운영체제를  멀티 프로세스 운영체제 라고 부른다. 프로세스가 여러개 존재할 수 있는 운영체제라는 뜻이다.

: 프로세스는 무엇이고 프로세스라는 것이 여러개 존재할 수 있는것일까?    

* 프로세스란 무엇인가?

: 프로세스란 실행 중에 있는 프로그램을 의미한다

: 메모리 공간으로 올라간 프로그램이 프로세스라고 볼 수 있다.

* 프로세스를 구성하는 요소

- Execution of "C"Program

: 프로그램이 실행될 때 구성되는 메모리 공간

Data 영역 : 전역변수나 static 변수의 할당을 위함

Stack 영역 : 지역변수 할당과 함수 호출시 전달되는 인자값 저장

Heap 영역 : 동적할당(malloc, calloc 함수) 

Code 영역 : 실행파일을 구성하는 명령어들이 올라가는 메모리 영역

: 위의 사진은 프로세스 생성시 만들어지는 메모리 구조를 보여주고 있는데, 이 자체를 그냥 프로세스라고 표현하기도 한다.

: 명령어들이 올라와 있는 상태이고 필요한 메모리 공간이 할당되어 있는 상태이기 때문이다.

* Register Set

: 프로그램 실행을 위해서는 Register들이 절대적으로 필요하기 때문에, 프로세스를 구성하는 요소로 더불어 생각해보아야 한다.

: 그러므로 Register의 상태까지도 프로세스의 일부로 포함시켜 말할 수 있다.


2. 프로세스의 스케줄링과 상태 변화

: "CPU는 하나인데, 어떻게 여러개의 프로그램이 동시에 실행 가능한 것인가?"

* 프로세스의 스케줄링

: 하나의 CPU가 여러개의 프로세스를 번갈아 가면서 실행해야한다.

: CPU는 매우 빠르기 때문에 여러개의 프로그램을 고속으로 번걸아가면서 실행시킬 경우, 사용자는 동시에 여러개의 프로그램이 실행된다고 느껴진다.

- 스케줄링의 기본 원리

: 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일을 가르켜 스케줄링이라 하며 이때 사용되는 알고리즘을 스케줄링 알고리즘이라고 한다.

: 이를 적용해서 프로세스를 관리하는 운영체제 요소(모듈)을 가리켜 스케쥴러라고 한다

- 멀티 프로세스는 CPU를 바쁘게 한다.

: A,B,C의 프로세스가 실행되는 형태

1. 고전적

: 순차적 실행방법 => A시작종료, B시작종료, C시작종료

2. 동시 실행

 : A,B,C를 모두 실행시키고 스케쥴러에 의해 프로세스들이 관리되도록 함

: 이 두가지 방법의 차이는 프로그램 특성에 따라 달라진다.

: 일반적으로 프로세스는 입력/출력 과정(인터넷에서 사이트를 다운받거나, 메모리에서 불러올 때)에서 시간이 많이 소요된다. 이떄 CPU는 아무일을 하지 않고 대기하게 된다.

: A프로세스가 I/O에 관련된 일을 할 때 B 프로세스가 CPU에 의해 실행된다면 얼마나 효율적일까?


* 프로세스의 상태 변화

: 프로세스 각각의 상태는 시간 흐름에 따라 변화한다.

상황 1. S(start)에서 Ready 상태로의 전이를 보여준다.

: 프로세스가 생성되고 Ready상태로 들어간다.

: CPU에 의해 실행되기를 기다린다.

상황 2. Ready 상태에서 Running 상태로의 전이를 보여준다.

: Ready 상태에 있는 프로세스들은 스케줄러에 의해 관리되는 프로세스들이다.

: 스케줄러는 Ready 상태에 있는 프로세스 중 하나를 알고리즘에 의해 선택해서 실행한다.

상황 3. Running 상태에서 Ready 상태로의 전이를 보여준다.

: 프로세스들은 생성시 중요도에 따라서 우선순위가 매겨진다.

: 우선수위가 높은 프로세스를 Ready에서 Running 상태로 끌어 올리고 종료 후 다른 프로세스를 실행한다.

상황 4. Running 상태에서 Blocked 상태로의 전이를 보여준다.

: 일반적으로 데이터 입.출력에 관한 일을 할때 발생된다

: 실행 중에 있는 프로세스가 실행을 멈추는 상태로 들어가게 된다.

: 대신 Ready 상태에 있는 프로세스 하나를 실행시켜  CPU를 효율적으로 사용한다.

상황 5. Blocked 상태에서 Ready 상태로의 전이를 보여준다

: Blocked 상태는 스케줄러에 의해서 선택될 수 없는 상태를 의미한다.

: 입출력이 완료되었을 때에 Ready 상태로 전이된다.

* 프로세스의 상태변화, 시나리오로 다시 이해하기

: 책 참고.

3. 컨텍스트 스위칭 (Context Switching)

: 멀티 프로세스 운영체제의 기본 원리에 대해서 이야기 했는데, 이는(실행 중인 프로세스의 변경) 사실 시스템에 많은 부하를 가져다 주기도한다.

"CPU 내에 존재하는 레지스터들은 현재 실행 중에 있는 프로세스 관련 데이터들로 채워진다"

: 따라서 프로세스가 변경될 떄에는 현재 레지스터들이 지니고 있는 데이터를 어딘가에 저장해야, 나중에 이전 프로세스를 실행했을 때 작업을 이어서 할 수 있다. 

: 새롭게 시작되는 프로세스도 이미 저장된 레지스터 데이터들이 있을 수 있으므로, 복원시켜주어야만 한다.

: 이 작업을 일컬어 Context Switching 이라고 한다.

: 레지스터 개수가 많은 시스템일 수록 이는 더 복잡해지며, 멀티 프로세스 운영체제의 단점이다.

: 즉, I/O 과정에서 발생하는 CPU손실과 Context Switching 과정에서 발생하는 손실을 비교하여 어느 것이 성능향상에 도움이 되는지 고려해야한다.

: 이는 프로그램마다 다르게 나타나므로, 감각을 키워나가야 한다.

4. 프로세스의 생성

* 프로세스의 생성

: 프로그램이 다른 프로그램을 실행시켜도 이는 프로세스가 생성된 것이므로, 다른 프로그램을 실행시키는 프로그램을 만들어보자.

* CreateProcess 함수의 이해

: Windows에서 프로세스 생성을 돕기 위해 제공하는 함수이다.

: 새로운 프로세스간에 부모-자식 프로세스 관계가 형성된다.

* 예제를 통한 CreateProcess 함수의 이해


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


: 가상의 컴퓨터를 만들어서 이를 이해하는 방식으로 진행된다.

1. 컴퓨터 구조의 접근방법

: 컴퓨터 구조에 대한 근본적인 이해는, 이후 공부하게될 프로세스와 쓰레드를 이해하는데 큰 도움이 된다.


* 컴퓨터를 디자인하자

: CPU를 디자인해보자

: ALU와 Control Unit은 이미 있다고 가정하고 Register Set만을 대상으로 디자인해보자.

: 시스템 프로그래머 입장에서는 CPU를 보는 관점이 대부분 Register에 집중되기 때문이다.

* 레지스터를 디자인하자

: 중요요소

1. 레지스터를 몇 비트로 구성할 것인가?              

2. 몇 개 정도로 레지스터를 구성할 것인가?

3. 레지스터 각각을 무슨 용도로 사용할 것인가?


- 1. 16bit로 구성 (64bit는 불편)

- 2. 8개로 제한 (이름은 r0 ~ r7로 한다)

- 3. 그림참고

 : 위 레지스터 구조는 ARM코어를 참조하였다. 다른 CPU보다 하드웨어 구성과 명령어 구조가 간단하기 때문인데, 이런 이유로 전력소비가 작아 핸드폰에 많이 사용된다.

: ir 은 다음번에 실행하게 될 명령어를 미리 가져다 놓는 용도로 사용된다.


* 명령어 구조 및 명령어를 디자인하자

: CPU 구성형태(register 구성형태)에 따라서 명령어 구조가 달라진다.

: 레지스터 길이가 16bit이므로 명령어 길이도 16bit로 정하자.

: 16bit모두를 명령어로 쓴다면, 총 65536 종류의 명령이 가능하겠지만, 비효율 적이므로 16bit의 부분부분을 나누어 다양한 용도로 사용한다면 더 효율적인 프로그래밍이 가능할 것이다.

- 연산자 : 8종류 면 충분하다

- 저장소 : 레지스터가 8개 이므로 3bit가 적절하다

- 피연산자1,2 : 임의로 결정했다. (피연산자가 나타내는 것이 숫자인지, register 주소값인지 모르므로, 왼쪽 첫 bit에 따라 의미를 달리 두자.)

- 예약 : 나중에 어떻게 사용할지 모르니, 예비로 두었다.

: 이처럼 명령어의 형태에 따라서 Control Unit의 논리회로가 결정되어진다.

: 실제 상에서는 명령어의 형태에 일정 부분 제약을 두기도 한다.

: 모든 피연산자에는 메인 메모리의 주소값이 올 수 없다. (숫자와 레지스터만 가능)

: CPU의 종합적인 측면(성능, 비용...)이 고려되는 가운데서 제약사항이 정해진다.


* RISC vs SISC

: CISC(Complex Instruction Set Computer)

: 복잡한 명령어 체계를 가지는 컴퓨터

: 인털도 16bit CPU까지는 이와 같은 구조를 가지고 있엇다

: 명령어수가 수백개일 정도로 많고, 그 크기가 일정치 않아 복잡하다

: 이는 성능향상에 제한을 두는 부정적인 영향을 끼친다.

: RISC

: CISC구조에서 CPU가 실제로 사용하는 명령어가 10%도 안된다는 것에 착안해서 만들어진 구조이다.

: 명령어를 대폭 줄이고 명령어 길이를 일정하게 디자인하였다

: 인텔뿐만아니라 임베디드 CPU의 대부분이 이 구조를 취한다.

: 명령어 길이가 일정하여 클럭당 2개 이상의 명령어도 처리할 수 있다.(Pipelining 기법)  - 가장 큰 장점!!


2. LOAD & STORE 명령어 디자인

: LOAD와 STORE의 기능과 관련된 명령어 디자인을 해보자

* LOAD & STORE 명령어의 필요성

: 메인 메모리에 존재하는 데이터를 레지스터로 이동하여 처리하고 반환해야한다.


3. Direct 모드와 Indirect 모드

* Direct  모드의 문제점과 Indirect 모드의 제안

: 하나의 명령어에 여러 정보를 담다 보니 표현하는 데이터 크기에 제한이 따른다는 문제점이 발생하였다.

: 여태까지 source 부분이 메모리 주소값을 직접 나타내었는데 여기서 사용할 수 있는 주소의 길이제한이 발생한다.

: 이를 Direct모드라고 부르는 메모리 접근방법의 한계이다.

: 이를 극복하기 위해 Indirect모드가 나타났다.

* Indirect 모드의 이해

: 해당 레지스터에 저장된 주소값을 참조해서 값을 읽어오는 것.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기




: 64비트 기반 프로그래밍에 대한 이해를 갖도록 한다.


1. WIN32 vs WIN64

* 64비트와 32비트

: I/O버스를 통해 한번에 전송 및 수신할 수 있는 데이터의 크기 & 한번에 처리할 수 있는 데이터 크기에 따라서 32비트 시스템과 64비트 시스템이 나뉘게 된다.

* 프로그래머 입장에서의 64비트 컴퓨터

: 프로그래머 입장에서보면, 표현할 수 있는 주소값의 범위가 넓으면 넓을수록 좋다. 메모리 공간만 충분하다면 주소값의 범위가 넓은 만큼 더 넓은 메모리 공간을 활용할 수 있기 때문이다.

: 주소값을 표현하기 위해서 4비트가 사용된다면, 메모리에 할당할 수 있는 주소값의 개수는 2의 4승에 해당하는 16개(16바이트)가 전부이다. 따라서 16바이트가 사용할 수 있는 최대 메모리 크기가 된다.

2. 프로그램 구현 관점에서의 WIN32 vs WIN64

: windows 64는 32와의 호환성을 중요시했다.


* LLP64 vs LP64

: Windows 에서는 LLP64 모델을 채택하고 있고 UNIX 에서는 LP64 모델을 채택하고 있다.

: LLP64는 long이 4byte이고 LP64는 long이 8byte이다.

: 포인터는 둘다 8byte를 사용한다.

: 이는 windows64에서 32와 동일하게 long을 4byte를 사용함으로써 호환성을 중요시 여겼다는 것을 알 수 있다.


* 64bit와 32bit 공존의 문제점

: 64bit에서 포인터를 int형으로 형변화 시킬 경우 8byte가 4byte로 변환됨에 따라 데이터 손실이 발생하게 된다.

: 64bit에서는 포인터를 형변환 하지 말자.

* Windows 스타일 자료형

: 다른 시스템으로의 이식성을 고려한다면 기본 자료형 보다 새로운 이름으로 자료형을 정의하는 것이 보다 좋은 방법이다.

: windows에는 기존 32bit 자료형에 더하여 64bit 자료형을 만들어 두었다. 따로 수정하지 않고 추가적으로 만들었기 때문에 호환이 된다. 즉, 유니코드와 아스키코드가 호환되면서 64비트 시스템에서 새롭게 정의된 자료형을 사용하지않는 64비트 프로그램을 만들 수 있다.

: 하지만, 포인터가 사용되어진다면, WIN64 상황에 적절히 대응할 수 있는 조건부 컴파일을 해야한다.

* Windows 자료형 확인하기

: 선언된 곳을 찾아 들어가자, 보통 바로 찾아 들어갈 수 있도록 프로그래밍 툴내에 제공하는 기능들이 있다.

* Polymorphic 자료형

: WIN64로 넘어가면서 Polymorphic 자료형을 정의하고 있다. 다양한 모습이 있는, 다형적이라는 뜻이다.

: 조건부 컴파일을 사용하여 32bit 시스템에서는 32bit로 64bit시스템에서는 64bit로 자동 선언되게 하는 것.

3. 오류의 확인

* GetLastError 함수와 에러코드

: Windows 시스템 함수들은 오류가 발생했을 때 NULL을 반환한다.

: 오류가 발생했을 때 GetLastError 함수를 실행시키면 Error 코드를 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 
    GetLastError.cpp
*/
#include <stdio.h>
#include <windows.h>
 
int _tmain(void)
{
    HANDLE hFile = 
        CreateFile(
           _T("ABC.DAT"), GENERIC_READ, FILE_SHARE_READ,
              NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
        );
    
    if (hFile == INVALID_HANDLE_VALUE) 
    { 
        _tprintf( _T("error code: %d \n"), GetLastError() );
        return 0;
    }
    return 0;
}
 
cs

result : error code : 2


: 오류확인은 오류가 발생한 직후에 바로해야 한다.


4. System Programming Project Design

* 명령 프롬프트 프로젝트의 제안과 EXIT 명령어의 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
    CommandPrmpt_One.cpp
    프로그램 설명: 명령 프롬프트의 골격.
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h> 
 
#define STR_LEN    256
#define CMD_TOKEN_NUM  10
 
TCHAR ERROR_CMD[] 
 = _T("'%s'은(는) 실행할 수 있는 프로그램이 아닙니다. \n");
 
int CmdProcessing(void);
TCHAR * StrLower(TCHAR *);
 
int main(int agrc, TCHAR * argv[])
{
    // 한글 입력을 가능케 하기 위해.
    _tsetlocale(LC_ALL, _T("Korean")); 
    
    DWORD isExit;
    while(1)
    {
        isExit = CmdProcessing();
        if(isExit == TRUE)
        {
            _fputts(_T("명령어 처리를 종료합니다. \n"), stdout );
            break;
        }
    }
 
    return 0
}
 
 
TCHAR cmdString[STR_LEN];
TCHAR cmdTokenList[CMD_TOKEN_NUM][STR_LEN];
TCHAR seps[]   = _T(" ,\t\n");
 
int CmdProcessing(void)
{
    _fputts( _T("Best command prompt>> "), stdout );
    _getts(cmdString);
 
    TCHAR * token = _tcstok(cmdString, seps);
 
    int tokenNum = 0;
    while(token != NULL)
    {
        _tcscpy (
            cmdTokenList[tokenNum++], StrLower(token)
        );
        token = _tcstok(NULL, seps);
    }
    
    if!_tcscmp(cmdTokenList[0],_T("exit")) )
    {
        return TRUE;
    }
    else if ( !_tcscmp(cmdTokenList[0],_T("추가 되는 명령어 1")) )
    {
    }
    else if ( !_tcscmp(cmdTokenList[0],_T("추가 되는 명령어 2")) )
    {
    }
    else
    {
        _tprintf(ERROR_CMD, cmdTokenList[0]);
    }
 
    return 0;
}
 
 
TCHAR * StrLower(TCHAR *pStr)
{
    TCHAR *ret = pStr;
 
    while(*pStr)
    {
        if(_istupper(*pStr))
            *pStr = _totlower(*pStr);
        pStr++;
    }
 
    return ret;
}
 
 
 
cs


- 1. 명령어를 추가할 때 변경되는 부분

- 2. 명령어의 대,소문자를 구분하지 않기 위해서 고려된 부분

- 3. 명령어 EXIT가 입력되었을 때 프로그램 종료방식

: 다음에는 이를 구현해볼 것이다.


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


: main이 아닌 다른 이름의 프로그램 시작점이나, 기본 자료형이 아닌 다른 이름의 자료형을 보고 있자면 마음에 부담을 느끼는 사람이 있다. 그러나 이를 알고보면 프로그래머의 편의를 위해서 제공되는 것들이다. 이를 이해하기 위해서는 우선 UNICODE에 대한 지식을 갖추어야 한다.

1. Windows에서의 유니코드(UNICODE)

: 컴퓨터 분야에 있어서 문자열을 표현하고 처리하는 일은 오래전부터 골칫거리에 속해왔다

: 운영체제가 문자열을 표현하는 방법에서부터 이야기를 진행해보자.


* 문자셋(Character Sets)의 종류와 특성

- 아스키 코드

: 미국에서 정의하고 있는 표준이다.

: 알파벳 + 확장 문자를 포함해도 256개를 넘지 않는다

: 그로므로 아스키 코드는 1byte를 가지고 충분히 표현할 수 있다.

- 유니코드

: 영어가 아닌 다른 국가에서 사용하는 문자들을 표현하기 위해 등장했다.

: 2byte의 길이를 가지며 65,536개의 문자의 종류를 가진다.

: 영어, 한글, 전세계의 언어 모든 문자, 기호를 표현할 수 있다.


- 문자셋

: 문자들의 집합, 약속된 문자의 표현방법을 뜻한다.

: 세가지 형태를 가진다

SBCS(Single Byte Character Set)

: 문자를 표현하는데 있어서 1byte만을 사용한다. 

: 대표적으로 ASCII Code가 이에 속한다

MBCS(Multi Byte Character Set)

: 문자를 1byte와 2byte를 혼용해서 표기한다.

: 아스키코드를 표현할 때에는 1byte로, 그 이외의 문자는 2byte로 표기한다.

: 효율적이지 모르겠지만 구현하는데 세심한 주의가 필요하다

WBCS(Wide Byte Chracter Set)

: 모든 문자를 2byte로 처리하는 문자 셋이다.

: UNICODE가 이에 해당된다.


* MBCS 기반의 문자열

: 영문은 1byte로, 한글은 2byte로 처리되며 배열의 크기는 NULL문자(1byte)를 더 포함하게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
    MBCS1.cpp
*/
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str[]="ABC한글";
    int size=sizeof(str);
    int len=strlen(str);
 
    printf("배열의 크기 : %d \n"size);
    printf("문자열 길이 : %d \n", len);
 
    return 0;
}
cs

ex)

sizeof("ABC한글") == 8

strlen("ABC한글") == 7

* WBCS 기반의 프로그래밍

- char을 대신하는 wchar_t

: typedef unsigned short wchar_t; 로 선언되어져 있는 자료형이다.

- "ABC"를 대신하는 L"ABC"

: L 이후에 등장하는 문자열을 유니코드 기반(WBCS)로 표현하라라는 뜻

: 문자열의 끝을 의미하는 NULL 도 2byte로 처리된다.

- strlen을 대신하는 wcslen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 
    WBCS1.cpp
*/
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    wchar_t str[]=L"ABC";
    int size=sizeof(str);
    int len=wcslen(str);
 
    printf("배열의 크기 : %d \n"size);
    printf("문자열 길이 : %d \n", len);
 
    return 0;
}

cs

: 지금까지 공부해왔던 문자열 조작 함수들은 MBCS기반 문자열을 처리하기 위한 함수였다는 것을 알 수 있다.

: 이처럼 SBCS 함수와 WBCS기반의 문자열 조작함수는 다르므로 경우에 따라 찾아서 활용하는게 바람직하다.

: 다음은 유니코드 기반의 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 
    WBCS4.cpp
*/
#include <stdio.h>
 
int wmain(int argc, wchar_t* argv[])
{
    int i;
    for(i=1; i<argc; i++)
    {
        fputws(argv[i], stdout);
        fputws(L"\n", stdout);
    }
 
    return 0;
}
cs


2. MBCS와 WBCS의 동시지원

: 프로그램은 한번만 구현하고 별다른 변경없이 MBCS기반, WBCS기반으로 돌아가는 형태로 컴파일이 가능하다면 아주 효율적일 것이다.


* #include<windows.h>

: windows 기반 프로그래밍을 하는데 있어서 기본적으로 항상 포함하는 헤더이다.

* Windows 에서 정의하고 있는 자료형

: windows 에 MBCS기반, WBCS기반의 자료형이 다르게 존재하고 있다.

* 왜 기본 자료형까지도 프로그래머들과 Windows는 자신의 스타일로 재 정의하고 사용할까?

1. 선언의 편리성이다. 

: 복잡한 선언을 단순하게 해준다.

2. 확장의 용이성

: 변경이나 사용이 다르게 되었을때 확장성이 좋아진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 
    WinString.cpp
*/
#include <stdio.h>
#include <windows.h>
 
int wmain(int argc, wchar_t* argv[])
{
    LPSTR str1="SBCS Style String 1";
    LPWSTR str2=L"WBCS Style String 1";
 
    CHAR arr1[]="SBCS Style String 2";
    WCHAR arr2[]=L"WBCS Style String 2";
 
    LPCSTR cStr1=arr1;
    LPCWSTR cStr2=arr2;
 
    printf("%s\n", str1);
    printf("%s\n", arr1);
 
    wprintf(L"%s\n", str2);
    wprintf(L"%s\n", arr2);
 
    return 0;
}
 
cs

* MBCS와 WBCS를 동시에 지원하기 위한 매크로

: <tchar.h> 를 통해서 이미 정의된 매크로를 사용하면, UNICODE를 사용하겠다고 선언한 것의 여부에 따라 자동으로 자료형, 함수를 UNICODE 형태 혹은 아닌 형태로 변경하여준다.


결론

: main = MBCS방식

: wmain = 유니코드 방식

: _tmain = 혼합방식


뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기


1장 컴퓨터 구조

1. 시스템 프로그램이의 이해와 접근

    • windows 시스템 프로그래밍이란?
      • windows 운영체제 기반의 컴퓨터에게 일을 시키기 위한 프로그램을 구현하는 것
      • 이를 위해서는 windows가 제공하는 라이브러리를 이해해야하고, 이를 이해하기 위해서는 운영체제, 컴퓨터 구조에대한 기본지식이필요하다.
      •  따라서 하드웨어적인 이해부터 공부해보자.
    • 컴퓨터 시스템의 주요 구성요소
      • CPU-Cache : 컴퓨터 구조 과목에서 다룸
      • main memory - hard disk : 운영체제 과목에서 다룸

2. 컴퓨터 하드웨어의 구성

* CPU

: 중앙처리 장치로써 연산을 담당한다.

: 컴퓨터의 머리

* Main Memory

: RAM이라는 저장장치로 구성되는 메인 메모리는 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역이다.

: 프로그램 실행을 위해 존재하는 메모리

* input/output Bus (입출력 버스)

: 컴퓨터를 구성하는 구성요소 사이에서 데이터를 주고 받기 위해 사용되는 경로

: Address Bus, Data Bus, Control Bus 세가지로 구분된다.

: 하드디스크, CPU, 메인메모리등 모두가 버스에 연결되어있어 전송, 입출력을 가능하게 한다.


3. CPU에 대한 이해

* ALU(Arithmetic Logic Unit)

: CPU에서 연산을 담당하는 블록

: 산술연산(덧셈, 뺄셈...)과 논리연산(AND, OR...)의 처리를 담당

* Control Unit

: CPU가 처리해야할 명령어들을 해석

: ALU가 동작할 수 있도록 실행파일의 명령어를 해석해주는 블록

- ALU는 단순해서 명령어를 해석할 수 없고 명령에 따른 연산만 담당한다.

: CPU의 총 사령관

* Register Set

: Control Unit이나 ALU가 필요로 하는 명령어 및 데이터들을 저장해두는 공간

: 임시적으로 저장하는 아주 작은 메모리

: CPU에 따라서 16bit, 32bit, 64bit 정도의 크기를 가지게 되고, CPU 내부에 여러개가 존재하며, 각각의 레지스터의 용도는 일반적으로 정해져있다.

* Bus Interface

: I/O BUS

:컴퓨터 안에는 CPU, Hard Disk, RAM, Sound Card, GPU 등등이 있는데, 이들이 서로 데이터를 주고받으면서 동작할 수 있도록 하는 통로

: Bus Interface는 I/O 버스가 어떻게 데이터를 전송하는지에 대한 프로토콜 혹은 통신방식을 알고 있는 블록

: I/O버스와 연결되는 각각의 기기들은 연결하기위한 자신만의 Interface가 필요하다.

* Clock Pulse (클럭)

: CPU를 구성하는 요소는 아니지만, Timing 을 제공하기 위해서 필요하다. 

: 1.6Mhz인 CPU는 1초에 1백 6십만번의 연산을 하게 된다. 즉, CPU의 클럭속도가 높으면 초당 처리하는 명령어의 개수가 많아지므로 컴퓨터의 전체적인 성능은 좋아지게된다.

: 왜? 클럭신호에 맞추어서 CPU는 동작해야하는가?

: 다른 장치, 블록과의 동기화를 위해서 필요하다. 뒤처지거나 밀리는 작업이 없도록 가장 느린 장치의 속도에 맞추어 진행하면 밀리지 않는다.


4. 프로그램의 실행과정

* 위대한 수학자 폰 노이만

: 오늘날 우리가 사용하고 있는 컴퓨터의 기본 모델을 제시한 사람

: 이전까지 프로그램이란 단순히 진공관 회로의 스위치 구성을 의미하는 것이었다. 하지만, 폰 노이만은 프로그램이 컴퓨터 내부에 저장되는 구조를 생각해내었다.

: CPU <-> Memory  <== LOAD == Program

: 폰 노이만 구조의 가장 큰 특징은 '실행되어야 할 프로그램이 컴퓨터 내부에 저장된다는 것'

: 그래서 Stored Program Concept이라고 불리기도 한다.

* 프로그램 실행과정

- 실행파일의 생성단계

: 전처리기 => 컴파일러 => 어셈블리 => 링커             


1단계 : 전처리기에 의한 치환 작업

: #include나 #define과 같은 #지시자에 따라 소스코드를 적절히 변경한다

2단계 : 컴파일러에 의한 번역

: 여전히 C언어로된 소스코드가 컴파일러에 의해 어셈블리 코드로 번역된다.

: 어셈블리 코드란, CPU에 일을 시키기 위한 명령어를 조합해 만들어진 프로그램 코드이다.

: 이게 없다면 직접 명령어체계를 익혀서 명령해야했을 것이다.

3단계 : 어셈블러에 의한 바이너리 코드 생성

: 1과 0으로만 구성되는 코드, 어셈블리와 매칭되는 바이너리 코드로 변환된다.

4단계 : 링커에 의한 연결과 결합

: 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는 작업

: 이 작업이 끝나면 실행파일이 생겨난다. (실행파일은 바이너리 코드로 구성된다.)

- 시나리오

: 실행파일에는 컴퓨터에게 일을 시키기위한 바이너리 코드 형식의 명령어가 있다.

: 이를 실행시키면 메모리 공간에 올라간 다음 CPU에 의해서 순차적으로 CPU내부에서 실행되기 시작한다

단계 1. Fetch

: 메모리상의 명령어를 CPU로 가져오는 작업

단계 2. Decode

: 가져온 명령어를 CPU가 해석하는 단계

: 그림을 참조하면, 명령어 A가 덧셈!으로 해석되어지는 것을 볼 수 있다,

단계 3. Execution

: 해석된 명령어대로 CPU가 실행하는 단계


: Fetch > Decode > Execution 으로 실행되어지고 있다. 이는 중요한 개념이다.

5. 하드웨어 구성의 재접근

* 폰노이만의 컴퓨터 구조 vs 오늘날의 컴퓨터 구조

: Fetch 는 어떠한 이동경로를 통해 이루어지는가? 

- I/O BUS

: 명령어를 CPU 내부로 가져다 놓을 때 어디에 저장되는가?

- Register Set

: Decode는 누구에 의해 실행되어지는가?

- Control Unit

: Execution은 누구에 의해 실행되어지는가?

- ALU

이는 다음과 같은 그림으로 요약된다.


* 데이터 이동의 기반이 되는 버스(BUS) 시스템

: 데이터를 이동하는데 있어서 사용되는 전송 경로를 가리켜 버스 시스템이라고 한다.

- Data Bus

: 데이터를 이동시키기 위한 버스

: 명령어, 피연산자 등이 속한다.

- Address Bus

: 주소값을 이동하기 위한 버스

: 주소값을 통해 해당 주소에 있는 데이터를 반환할 수 있다.

- Control Bus

: CPU가 원하는 바를 메모리에 전달할 때 사용한다


ex) 

CPU : 데이터 보내! (contorl bus)

메모리 : 알았어 어디 있는걸 줄까?

CPU : 0x1200 에 있는거 (Address Bus)

메모리 : 자 데이터 받아! (Data Bus)



총 정리




뇌를 자극하는 윈도우즈 시스템 프로그래밍
국내도서
저자 : 윤성우
출판 : 한빛미디어 2007.03.30
상세보기














         캔들에서 심리를 읽어낼 수 있다는 것은 대단한 매집이 진행되는 것인지 아니면 이탈이 준비되고 있는 것인지를 구분하게 해줄 것이며, 누군가의 인생을 바꾸었던 중요한 어느 날처럼 큰 의미를 가진 캔들들ㅇ르 찾아내고 공격하는 안목을 가지게 될 것입니다.


        **************************************************************************

        1. 똑같은 캔들이지만 차트의 위치에 따라 다른 성격을 지닌다

        2. 장대 음봉이라고 다 같은 장대 음봉이 아니다

        3. 무럭무럭 자라는 양봉이 있다

        4. 작은 캔들이라고 무시하지 마라

        **************************************************************************

        1. 똑같은 캔들이지만 차트의 위치에 따라 다른 성격을 지닌다

         똑같이 생긴 캔들이지만, 위치나 매물대 이동평균선 그리고 세력의 의도 등에 따라 각기 다르게 적용이 됩니다.

         지나간 캔들을 그럴듯하게 분석하는게 아니라, 캔들을 올바르게 파악하고 대응하는 방법들을 소개할 것이다.

         이것이 매집이 준비되는 것인지? 이탈이 준비되는 것인지? 안목을 갖추어야 한다. 그렇게 된다면, 마음 편히 매수에 가담할 수 있으며, 약간의 손실도 버틸 수 있는 기준을 가질 수 있고 저점 추가 매수의 기회로도 삼을 수 있으며, 매수를 하고 난 다음 여행이나 낚시 등의 여가를 즐길수 있게 될 것이다.


        2. 장대 음봉이라고 다 같은 장대 음봉이 아니다

         조용히 흐르던 종목에 거래량이 급격히 느는 현상을 '수급이 붙었다' 라고 표현한다. 수급이 붙었다는 말은 누군가의 강력한 개입이 시작되었다는 뜻이며 흔히 세력이라고 일컫는다. 이러한 거래량 번화는 누군가의 개입으로 의심하는 중요한 차트 분석 방법입니다.

         "고가권에서 대량 거래를 동반한 장대 음봉이 떨어졌을 경우 다 팔고 토껴라" 라는 격언을 정리하면, 바닥권에서 매집을 하고 어느정도 물량이 확보되면 주도 세력이 주가를 상승시킵니다. 그러면 주가가 수익권으로 쭉 올라가겠죠?, 주가가 올라가게 되면 주가와 이동평균선 사이에 간격이 생기게 되는데 이것을 "주가와 이격도가 커졌다" 라고 표현합니다.  이는 캔들의 종가와 이평선들이 많이 벌어진 것을 가르킵니다. 벌어진 만큼 누군가는 수익이 나겠죠? 

         주가 이격도나 이동평균선 이격도를 통틀어서 이격도가 벌어지면 주가는 고가권으로 치솟아 있을 테고 그 고가권에서 대량 거래가 나온다면 그 의미는 바닥에서 매집된 물량을 고가권까지 뽑은 다음 누군가가 수익을 보고 많은 물량을 팔았다라고도 볼 수 있습니다. 이 때 주도 세력은 수익을 챙기고 이탈했을 수도 있다라는 의미가 되겠죠.

         이처럼 간단한 격언이라도 이해를 제대로 하여 어떤 차트에서 어떻게 적용시킬지 연구해야 합니다. 많은 매매와 복기를 통해서 확인해 나가는 과정이 필요하고 그것이 모이게 되면 여러분은 수익을 꾸준히 내는 상위 5%안에 들게 될 것입니다.

         "차트를 일부분만 보는 것은 죽음이다"

         매매를 지도하다 보면 일봉 30개나 50개 또는 100개 많으면 200개 이렇게 보시는 분들이 계시는데 이는 우물안에서 우물 밖 세상을 논하는 것과 같습니다.

         예를 들어 세력은 1년을 매집 기간으로 보고 있는데 여러분이 일봉 50개만 보고 있다면 그것은 석달 치도 되지 않습니다. 그러니 1년 동안 매집하겠다라고 달려든 세력 형님들의 마음을 읽어낼 수가 없지요. 세력 형님들이 매집이 잘 안되니까 개인 투자자들에게 수익 좀 주고 비싸게 라도 매집하려고 상한가 한두방을 연출하더라도 그것은 매집이 하고 싶은 것이지 본격적인 상승 랠리로 들어가려고 하는 것이 아닙니다.

         세력의 마음을 읽어내야만 단타, 스윙, 장기로 대응할지 판단할 것이고 목표가를 어디로 설정할지 판단할 수 있습니다. 이것이 차트 분석의 시작입니다.

         차트에서 캔들의 심리나 속성을 파악하기 위해 가장 중요한 것은 현재 주가가 어느 위치인지를 파악하여야합니다. 현 주가의 위치가 모두가 수익이 난 위치인지 모두가 손실이 난 위치인지 또는 모두가 본전인 위치인지에 따라서 투자에 참여하고 있는 투자자들의 심리 상태는 전혀 다를 테니 말입니다.

         차트의 유형은 어떠하며 현 주가의 위치는 어디인가?

        현재 주가의 캔들에 고점과 저점의 가로선을 긋는 것

         7배 거래랑을 터트렸ㄷ면 그것은 분명 일반 투자자들이 만들어낸 거래량이나 캔들이 아닙니다. 고가권에서 아주 큰 변동 폭으로 몇차례 이상 요동을 치면 많ㅇ느 대기 매수세가 유입된 것으로 판단하고 세력이 물량을 일부 처분했을 가능성에 점수를 주며 추가 상승보다는 하락에 점수를 주는 것

         매물대란 많은 거래량이 일어난 위치를 말합니다.

         개인 토자자가 호재를 접하는 태도는 주가가 이제 오르겠구나 라고 생각을 하는 것이고, 반대로 세력의 태도는 아~ 이제 물량 좀 팔 수 있겠구나~ 라고 생각을 하게 되는것 입니다. 호재뉴스는 기관이나 세력 형님들이 덩치 물량을 한꺼번에 던질 수 있는 아주 좋은 방법 중의 하나 입니다.


        무럭무럭 자라는 양봉이 있다

         이번에 살펴볼 내용은 매도할 수 밖에 없는 심리로 몰아세운 다음 양봉으로 일반 투자자의 물량을 뺏어가는 방법입니다. 

         캔들이 10%이상의 강한 변동성을 보이며 거래량이 갑자기 늘기 시작한다면 누군가 물량을 내다팔았거나 물량을 매집하였거나 등의 목적을 가지고 있습니다. 그렇기 때문에 캔들의 위아래 폭이 커지면서 거래량이 늘어나게 되며 그것은 주가가 상방향이나 하방향으로 가기 위한 마지막 준비 운동을 하고 있는 것입니다.

         세력이 매집을 시작했다고 해서 주가가 급등하는 것이 아니라 필욯한 물량만큼 가져야만 주가를 부양시킬수있습니다. 통제 되지 않는 주에 대한, 그리고 매수세도 보장되지 않고, 다른 세력이 매도할 수 있다는 위험성때문입니다. 이렇듯 박스권으로 횡보를 하게 되면, 이제 매집이 진행되고 있구나라고 해석을 하며 그 박스권의 거래량이 늘어나기 시작하면 매집이 어느정도 끝난 상황에 가까워 지거나 매집 구간의 단가에서 나올 물량은 다 나온 것으로 이해를 합니다.

         반대로, 그 박스권에서 횡보를 오래하다가 갑자기 거래가 늘어나기 시작하고 주가가 요동을 치면 그것이 하락의 시작인 경우도 있습니다. 주가가 10만원에서 1만원까지 가는 상황을 보고 있을 경우, 5만원에서 하락하는걸 저지하면서 바닥잡는 듯이 요동치다가 5만원에서 물량을 다 던지고 1만원으로 직행할 수도 있습니다. 

         따라서 주가가 횡보하다가 거래량이 늘어나게 되면 상승 아니면 하락으로 가기위한 마지막 움직임으로 보시면 됩니다. 이때 방향성이 어느 쪽인지 확인을 하고 대응하시면 됩니다.

         필자는 보조지표가 아니라 세력의 심리를 읽어야 된다고 생각합니다. 

         차트 분석에서 이미 결론을 내놓고 대응하지 말자,

         떡잎 캔들을 알아내자


        작은 캔들이라고 무시하지 마라

        매물대의 정중앙이라는 것은 일반 투자자들이 물려있는 구간이다.

        강한 매물대 = 팔아먹기엔 어려운 위치임을 의미한다

        거래량이 줄어들며 = 너도나도 물린 자리라서 손절 물량이나 저점 매수한 물량만 받아도 어느정도 거래량은 나오는 자리다. 너도나도 물린 자리에서 거래량 줄어들며 팔아먹긴 어렵다

        캔들이 작아지고 있다 = 팔아치울 때는 캔들이 요동치는데 캔들이 작아지는 것은 팔아먹는 것이 아니라 오히려 매집일 수 있다.

        막 손절이나 수익실현에 도달했을 떄 작은 음봉이 등장한다면, 이는 매집하는 것이라고 볼 수 있다. 이 때 들어간다면, 좋은 성과를 얻을 것이다.

        ----------------------------------------------------------------------------------------------------------------------------------------------------------------<출처>

        - 바보스탁 산호님의 주식 바로보기 <정성훈 지음>

         

        + Recent posts