ContextManager *new_ContextManager()
{
      ContextManager *self = (ContextManager*)malloc(sizeof(ContextManager));

	  cl_int err;
      cl_platform_id *cl_platforms;
      cl_uint num_platforms;
      cl_platforms = (cl_platform_id*)malloc(sizeof(cl_platform_id) * MAX_PLATFORMS);
	  err = clGetPlatformIDs(MAX_PLATFORMS, cl_platforms, &num_platforms);
      if(PERR(err == CL_INVALID_VALUE, "Error getting platform IDs"))
            goto bail;

	  self->num_platforms = num_platforms;
	  if(self->num_platforms > 0)
		  self->platforms = (Platform**)malloc(sizeof(Platform*) * num_platforms);
      for(unsigned int i = 0; i < num_platforms; ++i)
            self->platforms[i] = new_Platform(cl_platforms[i]);

	  free(cl_platforms);

	  self->incoming_queue = new_Queue();
	  self->outgoing_queue = new_Queue();

      err = pthread_create(&self->threads[0], NULL, ContextManager_Consumer, (void*)self);
      err = pthread_create(&self->threads[1], NULL, ContextManager_Producer, (void*)self);
	  self->num_threads = 2;

      return self;
bail:
	  delete_ContextManager(self);
	  return NULL;
}
예제 #2
0
int main(void)
{
  Scheduling_Policy simulater[3] = {{"FCFS",FCFS},{"RR",RR},{"HRRN",HRRN}};
  
  Queue *ready_queue = new_Queue();	//준비상태 큐 생성
  Queue *wait_queue = new_Queue();	//대기상태 큐 생성
  
  int i = 0, j = 0;
  int policy_count = sizeof(simulater)/sizeof(Scheduling_Policy);
  int process_count = 5;
 
  Process *head = NULL;	//프로세스 구조체 형의 head 생성, 초기화

  if(ready_queue == NULL || wait_queue == NULL)
    return;
  default_wait_queue(wait_queue);	//초기 대기상태 큐에 프로세스 정책 삽입
 
  time_axis = wait_queue->head->arrival_time;
	//프로세스의 최초 수행시간을 고려하기 위해 첫 프로세스의 수행시작시간을 별도 관리

  // 모든 프로세스  수행 시간
  //초기값 = 큐의 head, null이 아닐동안, 다음 프로세스로 진행
  for(head = wait_queue->head ; head!=NULL; head = head->next)
		  total_service_time += head->service_time;	
  			//큐에 들어온 프로세스의 서비스타임의 총합

  system("clear");
  printf("<Scheduling Simulater>\n");
  printf("policy / time\n");
  
  for(i = 0; i < policy_count ; i++)
  { 
    // 스케줄링 정책 이름
    printf("%s\t",simulater[i].name);
    // 시간 축 출력
    for(j = time_axis; j <total_service_time+time_axis; j++)
      printf("%-8d",j);
    printf("\n");

    for(head = wait_queue->head; head!=NULL; head = head->next)
      printf("%c\n",head->name);    
    printf("\n");
  }
   
  // 스케줄링 정책 모두 실행
  for(i=0; i < policy_count ;i++)
  {
    simulater[i].scheduling(wait_queue, ready_queue);
    default_wait_queue(wait_queue);
  }
  // 커서 제자리에
  setCursorMove(0,25);
}