'yong's'에 해당되는 글 154건

  1. 2010.01.18 OSI 모델 And Ip계층
  2. 2010.01.15 Hooking
  3. 2010.01.13 서비스
  4. 2010.01.12 IPC란?
  5. 2010.01.12 동기화
  6. 2010.01.04 디폴트 함수
  7. 2010.01.04 API (원 가지고 놀기)
  8. 2010.01.04 API란?
  9. 2010.01.04 객체지향이란?
  10. 2009.12.17 스케줄링 (라운드 로빈)

응용계층

프리젠테이션계층

세션계층 - 컴퓨터내의  응용에게 보내준다.

전송계층 - 어떠한 방식으로 보낼건지 (TCP, UDP)
네트워크계층 - 누가누구한테 보내는지 

데이터링크계층 - 디바이스드라이버 (운영체제에서 디바이스에게...)

물리계층 - 패킷은 회선을 이용한다



1.  Layer - Based 통신 모델    - 계층적 구조

- Layer N 

   (N-1)계층에서 제공하는 서비스를 사용

   동일 계층의 instance와의 통신

 

- Protocols

    동일 계층간에 통신을 위해 미리 정해놓은 규약

 - Service

    계층 N이 (N+1)계층에게 제공하는 기능

    Service Interface라고도 불린다.

 - Instance

   한 개의 계층이 제공하는 통신 프로토콜과 서비스를 구현한 것

 

 

통신 흐름

 

 2. ISO/OSI Reference Model

-특징

   시스템 간의 통신을 위한 추상화 모델을 제시

   개방형 통신 시스템을 위해 표준안 개발 체제 제공 

   통신 시스템의 기능을 논리적으로 분해하는 측면에서 중요하게 인식하고 있다.

   복잡성 때문에 실질적으로 구현하는 입장에서 보면 실패한 모델

 

- Physical Layer (물리 계층)

   구조화되어 있지 않은 비트 시퀀스를 물리적인 신호로 변환하여 매체를 통해 전송하는 계층

 

- Data Link Layer (데이터 링크 계층)

   송신부에서는 데이터를 프레임으로 만들어 전송한다.

   수신부에서는 과부하가 걸리지 않도록 데이터의 흐름을 조정한다. 

   에러 검출 및 재 전송을 한다.

   Protocol : SLIP, PPP, HDLS,...

 

- Network Layer (네트워크 계층)

  통신망에서 System간의 연결성을 제공한다.

   Routing, Fragmenting을 담당한다.

   Protocol : IP, ICMP, IGMP,...

 

- Transport Layer (전송 계층)

   Application간의 데이터 전송 제공

   데이터의 정확성과 순서를 안전하게 하기 위해 존재한다. 

   Protocol: TCP, UDP,...

 

- Session Layer (세션 계층)

   전송 계층을 통한 구조화된 메시지 교환을 핸들링한다.

 

- Presentation Layer (프리젠테이션 계층)

  터미널 시스템 사이의 데이터 흐름을 제어한다.

  통신하고 있는 컴퓨터 시스템들에 의존적이지 않은(독립적인) 데이터 전달을 규정한다.

  예: ASCII vs Unicode , Big endian vs Little endian

 

- Application Layer (응용 계층) 

  

3. TCP/IP Reference Model

 

- Interface Layer

   네트워크 아답터들과 그들의 드라이버들을 다룬다.

 

- Internet layer

   IP

   ICMP - 제어 및 에러 정보 전송

   IGMP - 통신 그룹 관리

 

- Transfer layer

   터미널 시스템의 용용들 간의 전송담당

   TCP - 연결지향, 신뢰성,STREAM

   UDP - 비 연결지향, 가벼운 스택, DGRAM

             복잡한(무거운) TCP에 비해 선호하는 경우가 늘고 있다.(멀티미디어와 같은 전송에서)

 

- Application layer

   응용 프로그램과 관련된 모든 태스크들의 계층(ISO/OSI 모델의 5~7 계층)

   Telnet, FTP, SMTP, DNS, HTTP

출처 - http://cafe.daum.net/sbehclub


라우터 - 3계층까지만 이용

세대별 통신

1G - 아날로그 통신(PSTN망)

2G - 디지털 통신

3G- 개인단말

4G- 차세대통신


Circuit Switching망( 독점)  = Packet Flooding망

Packet Flooding - 전체 망에 뿌려지면서 해당 대상까지 간다.

패킷이 어떠한 망을 사용하는지



IP 프로토콜 

   RFC 791에 정의되어 있는 모든 IP 기반 네트워크에 사용되는 데이터 트래픽에 대한 기본 서비스를 제공 

   데이터그램 기반으로 만들어졌다. 

   전화망의 circuit-switching방식과 달리 packet-switching방식을 사용한다. 

   - 롤

    데이터 전송 계층의 차이를 감추고 상이한 네트워크 기술(LAN, SLIP, PP, 모뎀, ISDN 등)에 대한 일관된 표현을 제공한다. 

   IP Address family를 통해 Uniform address scheme를 제공

   큰 데이터 패킷은 fragmentation하여 작은 패킷 크기로 전송

   (통신에 거치는 모든 네트워크 기술들의 MTU중 최소 MTU에 맞춰서 fragmentation한다.)

 

 

통신 기술 

 

 

IPv4 스택 

 

 

Version

   현재는 v4(0x800)와 v6(0x86DD)만 정의되어 있다.

 

IHL

   패킷 헤더의 길이

   옵션을 사용하면 패킷 헤더의 길이는 5옥텟(1옥텟은 4바이트)를 넘을 수 있다.  최대 15옥텟(60바이트) 

 

Codepoint

    ToS라고 불렀었던 것을 RFC2474에서 Differentiated Services Codepoint라고 이름을 변경하였다.

    IP에 사용되는 forwarding behavior를 나타낸다.

 

Total Length

   패킷 전체의 길이, 최대 64K

   RFC791에 의하면 576바이트인 데이터 패킷을 처리할 수 있어야 한다고 명시(길이가 더 큰 패킷도 처리할 수 있다.) 

 

Fragment ID - 상위에서 날라온 데이터의 구분자 역할을 한다.

    원래 하나였던 패킷을 fragmenation을 했을 때 모든 fragments는 동일한 fragment id를 갖는다.

 

Flags

    DF : 데이터그램이 fragment되지 말아야 함을 나타낸다.

    MF: fragment가 되었음을 나타냄, 마지막 fragment에는 표시되지 않는다.

 

Fragment Offset

    Fragment의 일련번호

    수신부에서 원래의 데이터그램으로 재구성하기 위해 필요하다.

 

TTL -  Keep Alive   에 해당 되는 부분

   IP 패킷의 수명을 제한하기 위하여 사용

   패킷이 라우터를 거칠 때마다 1감소되며 0이되면 패킷은 제거된다.

   라우터에서 버퍼링을 위해 1이상 감소시키는 경우도 있다. 

 

Protocol

    전송 계층의 구분

    TCP(6), UDP(17), IGMP(2)

 

Checksum

   IP 패킷 허더 필드들에 대한 checksum

   라우터를 거쳐가면서 TTL이 감소하기 때문에 매번 다시 계산된다.

   Checksum필드를 제외한 부분을 16비트 단위로 1의 보수의 합을 계산한 값이다.

   유효한 패킷인지 확인하기 위한 용도로 있는 필드이다.


 Sorce address - 192.168.34.442 송신자아이피  



 Destination address - 192.168.34.442 수신자아이피


여기에서는 옵션과 ICMP, IGMP등을 다루지 않으니 각자가 확인하여 학습하길 바란다.   

'API & MFC > 네트워크프로그래밍' 카테고리의 다른 글

EventSelect란?  (0) 2010.02.05
ASyncSelect 예제  (1) 2010.02.04
소켓통신의 라이브러리 사용 선택 시 고려사항  (0) 2010.02.02
소켓함수 예제(로그인서버)  (0) 2010.01.25
소켓통신(함수정리)  (1) 2010.01.18
Posted by 아몰라
Hooking - 이미 작성되어 있는 코드의 특정 지점을 가로채서 동작 방식에 변화를 주는 일체의 기술


훅 프로시저 설치 함수
HHOOK SetWindowHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadld);

int idHook - 어떠한 이벤트에 대해서 후킹을 할것인가
HOOKPROC lpfn - 키보드 이벤트를 받을 훅 프로시저 명
HINSTANCE hMod - 누가 이 훅 체인을 등록할것인지
DWORD dwThreadld - 어느 스레드한테 후킹할것인가


LRESULT CALLBACK keyboardProc(int code, WPARAM wParam, LPARAM lParam);

code - 메시지를 어떤 처리를 할 것인가를 결정
wParam, lParam - 전달된 메시지에 대한 추가 정보

메시지를 훅 체인의 다음 훅 프로시저에게 전달해주는 함수
LRESULT CallNextHookEx(HHOOK hhk, int cCode, WPARAM, wParam, LPARAM, lParam);

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

Dll이란?  (0) 2010.01.24
파이프 추가내용  (0) 2010.01.20
서비스  (0) 2010.01.13
IPC란?  (0) 2010.01.12
동기화  (0) 2010.01.12
Posted by 아몰라
서비스 - 백그라운드에서 실행되는 프로그램 (유닉스식으로 표현하면데몬)

1. WIN32 서비스 - SDK영역
 
2. 드라이버 서비스 - DDK영역(저수준이고 익히는 사람도 드물다)
WinMain
{
윈도우생성 X
}

서비스 하나 만들기 위한 세 가지 프로그램

  • 서비스 프로그램 - 실제로 서비스 코드를 제공하는 프로그램
  • 서비스 설정 프로그램 - 서비스 설치와 제거에 대한 작업을 수행하는 프로그램
  • 서비스 제어 프로그램 - 사용자로부터 명령을 받아 서비스에게 명령을 전달하는 프로그램

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

파이프 추가내용  (0) 2010.01.20
Hooking  (0) 2010.01.15
IPC란?  (0) 2010.01.12
동기화  (0) 2010.01.12
디폴트 함수  (0) 2010.01.04
Posted by 아몰라

Ipc 는 두 프로그램이 상호 통신하며 정보를 교환하는 방법이다.


- 메세지

- 파이프

- 메일슬롯

- 소켓

파일매핑 - 프로세스간에 자원공유

등이 있다.


CreateNamedPipe(파이프명(\\.\pipe\파이프명, Access모드(읽고 쓰기), 파이프유형, 5(같은 파이프 이름 최대의 인스턴스 개수, 4096, 4096, 0(접근을 하기위한 대기시간), 보안기술자); 


메세지 보내는 유형
Stream - 파일같은거 보낼 때  PIPE_TYPE_BYTE 

Dgram   -리얼타임보장 예) 방송   PIPE_TYPE_MESSAGE


CreatenamedPipe()
----------------(1) 이 사이에 클라이언트 접속시 ConnectenamedPipe False로 반환된다.
ConnectenamedPipe(핸들, 0);

if(!Check)&&(GetLastError() == ERROR_PIPE_CONNECTED)) //(1) 상황일시 발생
{
Check = true;
}
if(Check)
{

}

FlushFileBuffer(hfile); //ffulsh와 유사, Disconected 를 해도 문제가 생기는데 운영체제에서 버퍼가 남는 문제가 생길수있다.

직렬화 - 객체정보를 화일에 전송

역직렬화 - 생성자

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

Hooking  (0) 2010.01.15
서비스  (0) 2010.01.13
동기화  (0) 2010.01.12
디폴트 함수  (0) 2010.01.04
API (원 가지고 놀기)  (0) 2010.01.04
Posted by 아몰라
동기화 - 스레드간의 실행 순서를 제어 할 수 있는 기술


Loop  : 자원 사용중
(1) ConTex Switching 이 발생? Atomic Operation
자원을 비 신호 상태로
               ---------------------------
Doit                                   임계구간(Critical Section) - Race condition을 방지
               ---------------------------
자원을 신호 상태로

ConTex Switching를 허용안하는 방법 -  타임인터럽트를 Disable하면 되지만 사용자 수준에서는 변경이 힘들다.


CRITICAL_SECTION cs;

Initialize CriticalSection(&cs);  //프로그램시작시

while(1)
{
-----------------
if(flag)
{
flag = false;                        Atomic 하게 만들었다.
doit();
------------------
flag=true;
break;
}
}
                                                
DeleteCriticalSection(&cs) //종료시
 



Mutax(상호배제)


신호상태 - 커널객체를 사용 할 수있는 상태
비신호상태  - 커널객체를 사용 할 수없는 상태

WaitForSingleObject(HANDLE hHAndle, DWORD dwMilliseconds);  //hHandle 이 지정하는 하나의 동기화 객체가 신호상태가 되기를 기다린다.

두번째 인자를 INFINITE로 지정하면 무한정 기다린다.


HANDLE CreateMutex(null, bool, lpName (뮤텍스를 구분하기위함)); //통상 프로그램 시작시

OpenMutex

CloseHandle(handle); //죵료시

비신호상태로 만들겠다 내가 점유하지 않은상태에서 만들겠다.

if(GetLastError() == ERROR_ALREADY_EXISTED)  // 이면 이미 프로그램이 가동중이다.

HANDLE hMu = CreateMutex(null, false, "hello");
{
if(get)
{
closeHandle(hMu)     //시작시 한번 들어오고 다음 스레드는 여기서 해제시킨다.
return;
}
}


세마포어 - 제한된 일정 개수를 가지는 자원을 보호하고 관리(뮤텍스와 유사하나 다수의 갯수를 관리)


HANDLE CreateSemaphore(보호기술자, 5(최대사용개수), 5(count초기값), 세마포어를 구분하기위한 문자열);
// 세마포어 카운트가 다 차야 비신호 상태가 된다.

이벤트

HANDLE CreateEvent(보안기술자,  ManualReset(자동이냐 수동이냐), bInitialState ,  
WaitForSingleObject(handle, INFINITE);
{
dout();
SetEvent(handle);
}
// ManualReset - True 이면 Set을 안한다!무한정 기다리기만 한다.
// SetEvent(hwnd); 이 필요
SetEvent()     //이벤트를 신호상태로
ResetEvent() //이벤틀를 비신호상태로





 

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

서비스  (0) 2010.01.13
IPC란?  (0) 2010.01.12
디폴트 함수  (0) 2010.01.04
API (원 가지고 놀기)  (0) 2010.01.04
API란?  (0) 2010.01.04
Posted by 아몰라


#include <windows.h>


LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch( msg )
 {
 case WM_LBUTTONDOWN:
  return 0;
 case WM_RBUTTONDOWN:
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return DefWindowProc(hwnd, msg, wParam, lParam);
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpCmdLine, int nShowCmd)
{
 // 1. 윈도우 클래스 만들기
 WNDCLASS wc;
 wc.cbWndExtra   = 0;
 wc.cbClsExtra   = 0;
 wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
 wc.hCursor    = LoadCursor(0, IDC_ARROW);
 wc.hIcon    = LoadIcon(0, IDI_APPLICATION);
 wc.hInstance   = hInstance;
 wc.lpfnWndProc   = WndProc;   // DefWindowProc;
 wc.lpszClassName  = "First";
 wc.lpszMenuName   = 0;
 wc.style    = 0;

 // 2. 등록(레지스트리에)
 RegisterClass(&wc);

 // 3. 윈도우 창 만들기
 HWND hwnd = CreateWindowEx( 0,     // WS_EX_TOPMOST
     "first",    // 클래스 명
     "Hello",    // 캡션바 내용
     WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT , 0, CW_USEDEFAULT, 0, // 초기 위치
     0, 0,   // 부모 윈도우 핸들, 메뉴 핸들
     hInstance,  // WinMain의 1번째 파라미터 (exe 주소)
     0);   // 생성 인자

 

 // 4. 윈도우 보여주기
 ShowWindow(hwnd, SW_SHOW);
 UpdateWindow(hwnd);
 

 // 5. Message
 MSG msg;
 while( GetMessage( &msg, 0, 0, 0 ) )
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return 0;
}

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

서비스  (0) 2010.01.13
IPC란?  (0) 2010.01.12
동기화  (0) 2010.01.12
API (원 가지고 놀기)  (0) 2010.01.04
API란?  (0) 2010.01.04
Posted by 아몰라


HDC hdc;       //DC의 핸들 HDC 만들기
 PAINTSTRUCT ps;  //그림 그리기에 필요한 여러가지 데이터
 static int x;
 static int y;
  
 switch(iMessage)
 {
 case WM_DESTROY: PostQuitMessage(0); return 0;
 
 case WM_LBUTTONDOWN:
  x=LOWORD(IParam);
  y=HIWORD(IParam);      
  InvalidateRect(hWnd, NULL, TRUE);  //첫번째 인자: 무효화할 윈도우 
                                                      //두번째 인자: 무효화할 사각영역을 지정하되, NULL일 경우 전 영역 
                                                     //세번째 인자: 무효화되기 전에 배경을 모두 지운 후 다시 그릴 것인지 아니면   배경을 지우지 않고 그릴 것인지를 지정한다. 이 값이 TRUE 이면 배경을 지운 후 다시 그리고 FALSE이면 배경을 지우지 않은 채로 다시 그린다.

  return 0;

 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);  // 윈도우 핸들과 페인트 정보 구조체
  Ellipse(hdc, x-100, y-100, x+100, y+100); //원그리기
  EndPaint(hWnd, &ps); 
  return 0; 

 case WM_KEYDOWN:
  switch(wParam)
  {
  case VK_LEFT:
   x-=10;
   break;
  case VK_RIGHT:
   x+=10;
   break;
  case VK_UP:
   y-=10;
   break;
  case VK_DOWN:
   y+=10;
   break;
  }
  InvalidateRect(hWnd, NULL, TRUE);
 }

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

서비스  (0) 2010.01.13
IPC란?  (0) 2010.01.12
동기화  (0) 2010.01.12
디폴트 함수  (0) 2010.01.04
API란?  (0) 2010.01.04
Posted by 아몰라
API 는 Application Programming Interface의 약자로서 윈도우 상에서 응용프로그램들을 만들기 위한 함수들의 집합이라고 할 수 있고 API는 운영체제의 한 부분이며 운영체제 그 자체라고도 할 수 있다.(가장 저수준의 라이브러리)

[API의 Positioning] Application - MFC - API - Windows Kernel - HardWare


API는 운영체제가 직접 사용하는 라이브러리이다.(가장 저 수준의 프로그래밍 방법임)


GDI Module

gdi32.dll

화면이나 프린터 같은 장치의 출력을 관장하며 메시지를 관리 (pen, brush, font, bitmap)

UI(User) Module

User32.dll

사용자 인터페이스 객체들을 관리 (window, dialog, menu, cursor, icon, caret)

Kernel Module

Kernel32.dll

Windows OS의 핵심, 메모리관리, 파일 입출력, 프로그램의 로드와 실행 등 운영체제의 기본기능 수행(Process, thread, memory, I/O, Synchronizatoin)




윈도우의 장점

(보조자료)

프로그램 - 코드들의 집합 
프로세스 - 프로그램이 주메모리에 상주
스레드 - 프로세스를 여러개의 스레드들이 실행시킨다.
(Primary thread)


1. 멀티태스킹 - 다수의 프로세스가 메모리상에 상주

2. 멀티스레딩 - 동시에 여러 스레딩이 가능, 멀티스레딩은 멀티태스킹을 포함한다고 생각 할 수도 있다.

3. GUI 환경이다.

4. 동적 연결이라는 개념을 중심으로 동작한다.

5. 프로그램은 시스템에 연결되어 있는 장치의 종류를 몰라도 된다.

'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글

서비스  (0) 2010.01.13
IPC란?  (0) 2010.01.12
동기화  (0) 2010.01.12
디폴트 함수  (0) 2010.01.04
API (원 가지고 놀기)  (0) 2010.01.04
Posted by 아몰라
객체란 사물이다.

실제세계에서 볼수 있는 모든 것들 예를 들어 사람, 컴퓨터, MP3 전부 객체가 될 수 있다.

각 객체는 객체마다 속성과 행동이 있다.  객체들끼리는 서로 철저하게 독립적이며  객체들끼리는 서로 연관을 가

질수도 있고 아닐 수도 있다. 이러한 간단한 특징을 가진것이 객체이다.


객체지향 개념은 하나의 사고방식이라고 할 수 있다. 다만 이 사고방식이 몇 가지의 기본적인 원리에 뿌리를 두고 있다

는 점이 중요하다. 아래에 객체지향을 이루는 몇가지 개념들을 적어보겠다.


추상화 - 객체를 모델링할때 자신이 필요로 하는 만큼의 속성과 오퍼레이션을 추출해내는 것이다.

상속 - 가전제품 클래스 (슈퍼클래스)
          세탁기, 냉장고, 전자레인지등 (서브클래스)

 가전제품 클래스는 전원 스위치, 전기 배선의 속성과 켜다, 끄다의 오퍼레이션을 가지고 있다. 따라서, "어떤것 이 가전 제품이다"라는 사실만 알면, "가전제품 클래스가 가진 속성과 오퍼레이션을 가지고 있구나"라고 바로 알아 챌 수 있는 것이다.

이러한 관계를 상속이라고한다.

다형성 - 동일한 이름의 오퍼레이션이라도 그 오퍼레이션이 일어나는 클래스에 따라 각기 다른 행동을 수행하도록 한다.
            (open - open door, open window, open account)

캡슐화 - 객체는 자신이 수행하는 모든 행동의 과정과 속성을 다른 객체와 외부 세계에 보이지 않도록 한다.(이래서 캡슐화를 정보 은닉이라고도 부른다.) 하지만, 모든 것을 숨긴다면 객체는 아무 의미가 없기때문에 다른 객체들에게 얼굴만을 보이게하고 인터페이스를 제공한다. 인터페이스 예를 들자면 TV객체같은경우는 TV본체에 조작 버튼과 리모콘이 해당된다.

연관 - 객체는 다른 객체와 연관 관계를 가질 수 있다. 연관은 여러 가지 형태로 이루어지며, 하나의 객체는 다중성에 의해 한 개 이상의 객체와 연관될 수 있다. 또 집합연관은 연관 관계의 일종이다. 집합체는 컴포넌트 집합으로 구성된다. 복합연관은 집합연관의 특별한 종류로서, 복합체에서 컴포넌트는 복합체의 일부로써만 존재할 수 있다.
Posted by 아몰라
  
- FCFS에서 짧은 프로세스가 피해보는 현상 완화방법
  : 시간을 정해놓고 프로세스가 일정 시간 이상을 넘어가는 순간 실행을 강제로 중단시킴
-프로세스 실행시간측정방법
  : 클럭(clock) 인터럽트(또는 타이머 인터럽트)
  : 클럭인터럽트는 일정간격으로 주기적으로 발생
-시간할당량(time slicing)기법이라고 함

 






- 시간할당량의 크기(q)가 라운드로빈
   :시간할당량이 너무 작다면  문맥교환 오버헤드 증가
   :시간할당량이 너무 크다면  FCFS와 비슷해짐
- 시간할당량이 얼마나 되어야 하는가?
   :프로세스가 사용자와 최소한 한번 이상 대화하기 충분하거나
   :프로세스 내의 어떤 함수 정도는 실행을 마칠 수 있는 충분한 길이


FCFS(선입선출 방식) 연습코드



void Scheduler::Install()  //프로세스 생성
{
 harddisk.push_back(new Process("A",20,4)); 
 harddisk.push_back(new Process("B",15,5));
 harddisk.push_back(new Process("C",18,3));
 harddisk.push_back(new Process("D",23,4));
}
void Scheduler::SimulationInit()
{
 miter seek = harddisk.begin(); //처음 프로세스 지정
 miter end = harddisk.end();  //마지막 프로세스 지정

 for( ; seek != end; ++seek)
 {
  readyqueue.push(*seek);  //큐에 프로세스 하나 삽입
  (*seek)->IdleToReady();  //삽입한 프로세스를  IdleToReady 로 보냄
 }
 
}

프로세스 클래스

class Process 
{
 char *pname;
 const int tjob; //전체 작업량
 const int cjob; //cpu점유시 수행 가능 최대 작업량
 int ntjob; //현재 남은 작업량
 int ncjob; //현재 cpu점유시 수행 가능 최대 작업량
public:
 Process(const char *_pname,int _tjob,int _cjob);
 virtual ~Process();
 void IdleToReady();
 int Running();
 void EndProgram();
private:
 void InitProcess(const char *_pname);
 
};




void Process::IdleToReady()
{
 ntjob = tjob; //총 작업량을 현재 작업량으로 바꿔놓고 레디상태로!
}


int Process::Running()
{
 ncjob = cjob; 

 while(ntjob!=0 && ncjob!=0) //총 작업량 또는 총 cpu 점유시 총 실행가능시간이 0이되면 프로세스 교체한다
 {
  eout<<pname;
  eout.TimeFlow(4);
  ncjob--;
  ntjob--;
 }
 eout<<endl;
 return ntjob;    //남은 총 작업량을 반환
}


스케쥴 클래스


void Scheduler::Install()  //프로세스 생성
{
 harddisk.push_back(new Process("A",20,4)); 
 harddisk.push_back(new Process("B",15,5));
 harddisk.push_back(new Process("C",18,3));
 harddisk.push_back(new Process("D",23,4));
}
void Scheduler::SimulationInit()
{
 miter seek = harddisk.begin(); //처음 프로세스 지정
 miter end = harddisk.end();  //마지막 프로세스 지정

 for( ; seek != end; ++seek)
 {
  readyqueue.push(*seek);  //큐에 프로세스 하나 삽입
  (*seek)->IdleToReady();  //삽입한 프로세스를  IdleToReady 로 보냄
 }
 
}



void Scheduler::Simulation()
{
 while(!readyqueue.empty())  //큐가 비면 끝낸다
 {
  Process * temp = readyqueue.front(); //큐에 맨앞에 있는 프로세스를 가르킨다.
  readyqueue.pop();      //위에서 가르킨 프로세스를 빼온다.

  if(temp->Running())      //운영체제가 빼온 프로세스를 실행시킨다.
  {
   readyqueue.push(temp);    //큐에 프로세스를 다시 삽입한다.
  }
 }
}


스케줄링 - 큐 대기시간이 적을수록 성능이 좋다!

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
퀵 정렬  (0) 2009.12.16
Posted by 아몰라