⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usersort.c

📁 openPBS的开放源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    /*     * "Seed" the linked list by pointing to a bogus initial element.     * Since the jobtail->next pointer will always be valid (either it     * hangs off the seed or a real job) this simplifies the following     * list operations considerably.     */    joblist = &list_seed;    jobtail = &list_seed;    jobtail->next = NULL;    /* Walk the running jobs and place them on the list. */    for (i = 0; i < nJRs; i++)	jobtail = jobtail->next = runningJobs[i];    /* Walk the normal jobs and place them on the list. */    for (i = 0; i < nnormalQ; i++)	jobtail = jobtail->next = normalQ[i];    /* Place any remaining jobs on the end of the list. */    for (i = 0; i < notherQ; i++)	jobtail = jobtail->next = otherQ[i];    /* Terminate the last element on the list with a NULL next pointer. */    jobtail->next = NULL;    /* Free any storage allocated for the lists. */    if (runningJobs)	free(runningJobs);     if (normalQ)	free(normalQ);    if (otherQ)	free(otherQ);    /* And reset all the values. */    runningJobs = normalQ = otherQ = NULL;    nJRs = nJQs = nnormalQ = notherQ = 0;    /*     * The first element on joblist is the pointer to the list_seed.  It's     * next pointer points to the head of the real list - return that.     */    return (joblist->next);}void create_job_schedule(){    char   *id = "create_job_schedule";    Job    *job_ptr;    int     i;    /*     * Destroy any previously created list.     */    if (JobSchedule)	free(JobSchedule);    JobSchedule  = NULL;    nJobSchedule = 0;    /*      * Walk the list of "running" jobs, adding Start and End entries     * to the global JobSchedule table along the way.     */    for (i = 0; i < nJRs; i++) {	/* Start Entry */	++nJobSchedule;	JobSchedule = realloc(JobSchedule, nJobSchedule * sizeof *JobSchedule);	if (!JobSchedule) {	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER,	        id, "realloc(JobSchedule)");	    return;	}	JobSchedule[nJobSchedule -1].event    = 'S';	JobSchedule[nJobSchedule -1].time     = runningJobs[i]->mtime;	JobSchedule[nJobSchedule -1].cpu      = runningJobs[i]->ncpus;	JobSchedule[nJobSchedule -1].mem      = runningJobs[i]->memory;	JobSchedule[nJobSchedule -1].walltime = runningJobs[i]->walltime +2*60;	strcpy(JobSchedule[nJobSchedule -1].qname, runningJobs[i]->qname);	strcpy(JobSchedule[nJobSchedule -1].group, runningJobs[i]->group);	strcpy(JobSchedule[nJobSchedule -1].arch, 	    get_queue_arch(runningJobs[i]->qname));	/* End Entry */	++nJobSchedule;	JobSchedule = realloc(JobSchedule, nJobSchedule * sizeof *JobSchedule);	if (!JobSchedule) {	    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER,	        id, "realloc(JobSchedule)");	    return;	}	JobSchedule[nJobSchedule -1].event 	= 'E';	JobSchedule[nJobSchedule -1].time 	= 		schd_TimeNow + runningJobs[i]->time_left + 2*60;	JobSchedule[nJobSchedule -1].cpu 	= runningJobs[i]->ncpus;	JobSchedule[nJobSchedule -1].mem 	= runningJobs[i]->memory;	JobSchedule[nJobSchedule -1].walltime 	= 0;	strcpy(JobSchedule[nJobSchedule -1].qname, runningJobs[i]->qname);	strcpy(JobSchedule[nJobSchedule -1].group, runningJobs[i]->group);	strcpy(JobSchedule[nJobSchedule -1].arch, 	    get_queue_arch(runningJobs[i]->qname));    }    /* now sort the table into chronological order */    qsort(JobSchedule, nJobSchedule, sizeof *JobSchedule, compare_qtime);    schd_print_schedule();    return;}void schd_print_schedule(){    int i;    /* print Schedule for sanity check */#if 0    printf("DEBUG: (job schedule)\n");    for (i=0; i<nJobSchedule; i++) {	printf("%c %ld %s %d cpus %ld(b)memory %ld\n", JobSchedule[i].event,		JobSchedule[i].time, JobSchedule[i].qname, JobSchedule[i].cpu,		schd_byte2val(JobSchedule[i].mem), JobSchedule[i].walltime);    }#endif}void schd_dump_schedule(QueueList *qlist){    int i, avail_cpu;    size_t avail_mem;    Queue  *queue, *best_queue;    QueueList *qptr;    FILE *fptr;    fptr = fopen(schd_PREDICTED_SCHEDULE, "w");    if (fptr == NULL) {	;    }    for (qptr = qlist; qptr != NULL; qptr = qptr->next) {        queue = qptr->queue;	if (queue->rsrcs == NULL)	    continue;	avail_cpu = queue->rsrcs->ncpus_total;	avail_mem = queue->rsrcs->mem_total;        for (i=0; i<nJobSchedule; i++) {	    if (!strcmp(queue->qname,JobSchedule[i].qname)) {		if (JobSchedule[i].event == 'S') {		    avail_cpu -= JobSchedule[i].cpu;		    avail_mem -= JobSchedule[i].mem;		}		if (JobSchedule[i].event == 'E') {		    avail_cpu += JobSchedule[i].cpu;		    avail_mem += JobSchedule[i].mem;		}	        fprintf(fptr, "%s %s %ld %d cpus %ld mem\n",		    queue->rsrcs->arch, queue->qname, JobSchedule[i].time,		    avail_cpu, avail_mem);	    }	}    }    fclose(fptr);}void schd_update_schedule(Job *job, Queue *queue, time_t start, char *reason){    char   *id = "update_schedule";    char   tmpstring[500];    char   tmpstring2[500];    char  *pstr;    struct tm *tmptr;    int i;    /* Start Entry */    ++nJobSchedule;    JobSchedule = realloc(JobSchedule, nJobSchedule * sizeof *JobSchedule);    if (!JobSchedule) {        log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER,            id, "realloc(JobSchedule)");        return;    }    JobSchedule[nJobSchedule -1].event       = 'S';    JobSchedule[nJobSchedule -1].time        = start;    JobSchedule[nJobSchedule -1].cpu         = job->ncpus;    JobSchedule[nJobSchedule -1].mem         = job->memory;    JobSchedule[nJobSchedule -1].walltime    = job->walltime + 2*60;    strcpy(JobSchedule[nJobSchedule -1].qname, queue->qname);    strcpy(JobSchedule[nJobSchedule -1].group, job->group);    strcpy(JobSchedule[nJobSchedule -1].arch, 	    get_queue_arch(queue->qname));    /* End Entry */    ++nJobSchedule;    JobSchedule = realloc(JobSchedule, nJobSchedule * sizeof *JobSchedule);    if (!JobSchedule) {        log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER,            id, "realloc(JobSchedule)");        return;    }    JobSchedule[nJobSchedule -1].event       = 'E';    JobSchedule[nJobSchedule -1].time        = start + job->walltime;    JobSchedule[nJobSchedule -1].cpu         = job->ncpus;    JobSchedule[nJobSchedule -1].mem         = job->memory;    JobSchedule[nJobSchedule -1].walltime    = 0;    strcpy(JobSchedule[nJobSchedule -1].qname, queue->qname);    strcpy(JobSchedule[nJobSchedule -1].group, job->group);    strcpy(JobSchedule[nJobSchedule -1].arch, 	    get_queue_arch(queue->qname));    /* now sort the table into chronological order */    qsort(JobSchedule, nJobSchedule, sizeof *JobSchedule, compare_qtime);    /* finially, update the job comment */    if (reason) {        if ((pstr = strstr(reason, "Est.")) != NULL)            strcpy(tmpstring2, reason+16);        else            strcpy(tmpstring2, reason);    } else        sprintf(tmpstring2, "%s (%s)", schd_JobMsg[NO_ARCH], job->arch);      tmptr = localtime(&start);    sprintf(tmpstring, "Est.%0.2d/%0.2d %0.2d:%0.2d] %s",        tmptr->tm_mon+1, tmptr->tm_mday, tmptr->tm_hour,        tmptr->tm_min, tmpstring2);    strcpy(reason, tmpstring);}time_t schd_when_can_job_start(Job *job, Queue *queue, char *reason){    char *id = "when_can_job_start";    int i, count, now_cpu, now_run, can_run, arch_cpu, save_arch_cpu;    size_t now_mem, arch_mem, save_arch_mem;    time_t steptime, lasttime, possible_start;    count   = 0;    now_cpu = 0;    now_mem = 0;    now_run = 0;    arch_cpu = 0;    arch_mem = 0;    save_arch_cpu = 0;    save_arch_mem = 0;    lasttime = 0;    steptime = 0;    possible_start = 0;    /*     * walk schedule looking for a window in time in which we could     * run this job on this queue/exechost     */    for (i=0; i<nJobSchedule; i++) {	/* Count up running jobs for the requested arch; we'll need	 * this info later if we find a matching slot/host.	 */        if ((!strcmp(JobSchedule[i].arch, queue->rsrcs->arch)) &&           (!strcmp(JobSchedule[i].group, job->group))) {            if (JobSchedule[i].event == 'S') {	        arch_cpu += JobSchedule[i].cpu;	        arch_mem += JobSchedule[i].mem;	    }	    if (JobSchedule[i].event == 'E') {	        arch_cpu -= JobSchedule[i].cpu;		if (arch_cpu < 0)		    arch_cpu = 0;		if (arch_mem < JobSchedule[i].mem)		    arch_mem = 0;		else	            arch_mem -= JobSchedule[i].mem;	    }	    if (JobSchedule[i].time <= schd_TimeNow) {		save_arch_cpu = arch_cpu;		save_arch_mem = arch_mem;	    }	}        /* Only look at scheduled events for the requested queue */        if (!strcmp(JobSchedule[i].qname, queue->qname)) {	    count++;            if (JobSchedule[i].event == 'S') {	        now_cpu += JobSchedule[i].cpu;	        now_mem += JobSchedule[i].mem;                now_run ++;	    }	    if (JobSchedule[i].event == 'E') {	        now_cpu -= JobSchedule[i].cpu;	        now_mem -= JobSchedule[i].mem;	        now_run --;	    } 	    can_run = schd_job_could_run(now_cpu, now_mem, now_run,		arch_mem, arch_cpu, job, queue, reason);	    if (JobSchedule[i].time <= schd_TimeNow) {	        if (can_run)	            possible_start = schd_TimeNow;		else	            possible_start = 0;	    }	    if (JobSchedule[i].time > schd_TimeNow)  { /* future time */		if (possible_start) { 	            if (possible_start + job->walltime + 2*60 <		        JobSchedule[i].time)  		        break;		    if (can_run)                        steptime = possible_start;	        } else { 	            if (can_run)                        steptime = JobSchedule[i].time; 	        }    	        if (can_run)	            possible_start = steptime;	        else		    possible_start = 0;	    }	}    }    if (nJobSchedule == 0 || count == 0) {	can_run = schd_job_could_run(0, 0, 0, save_arch_mem, save_arch_cpu,	    job, queue, reason);        if (can_run)	    possible_start = schd_TimeNow;    }    if (possible_start != 0 && possible_start < schd_TimeNow)	    possible_start = schd_TimeNow;    return(possible_start);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -