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 아몰라