'운영체제'에 해당되는 글 1건

  1. 2009.12.17 스케줄링 (라운드 로빈)
  
- 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 아몰라
이전버튼 1 이전버튼