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

📄 vm_sched.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
	 * Decide how deserving this guy is.  If he is deserving	 * we will be willing to work harder to bring him in.	 * Needs is an estimate of how much core he will need.	 * If he has been out for a while, then we will	 * bring him in with 1/2 the core he will need, otherwise	 * we are conservative.	 */	deservin = 0;	divisor = 1;	if (outpri > maxslp/2) {		deservin = 1;		divisor = 2;	}	needs = p->p_swrss;	if (p->p_textp && p->p_textp->x_ccount == 0)		needs += p->p_textp->x_swrss;	needs = imin(needs, lotsfree);	if (freemem - deficit > needs / divisor) {		deficit += needs;		if (swapin(p))			goto loop;		deficit -= imin(needs, deficit);	}hardswap:	/*	 * Need resources (kernel map or memory), swap someone out.	 * Select the nbig largest jobs, then the oldest of these	 * is ``most likely to get booted.''	 */	inp = p;	sleeper = 0;	if (nbig > MAXNBIG)		nbig = MAXNBIG;	if (nbig < 1)		nbig = 1;	biggot = 0;	bplist.bp_link = 0;	for (rp = allproc; rp != NULL; rp = rp->p_nxt) {		if (!swappable(rp))			continue;		if (rp == inp)			continue;		if (rp->p_textp && rp->p_textp->x_flag&(XLOCK|XNOSW))			continue;		if (rp->p_slptime > maxslp &&		    (rp->p_stat==SSLEEP&&rp->p_pri>PZERO||rp->p_stat==SSTOP)) {			if (sleeper < rp->p_slptime) {				p = rp;				sleeper = rp->p_slptime;			}		} else if (!sleeper && (rp->p_stat==SRUN||rp->p_stat==SSLEEP)) {			rppri = rp->p_rssize;			if (rp->p_textp)				rppri += rp->p_textp->x_rssize/rp->p_textp->x_ccount;			if (biggot < nbig)				nbp = &bigp[biggot++];			else {				nbp = bplist.bp_link;				if (nbp->bp_pri > rppri)					continue;				bplist.bp_link = nbp->bp_link;			}			for (bp = &bplist; bp->bp_link; bp = bp->bp_link)				if (rppri < bp->bp_link->bp_pri)					break;			nbp->bp_link = bp->bp_link;			bp->bp_link = nbp;			nbp->bp_pri = rppri;			nbp->bp_proc = rp;		}	}	if (!sleeper) {		p = NULL;		inpri = -1000;		for (bp = bplist.bp_link; bp; bp = bp->bp_link) {			rp = bp->bp_proc;			rppri = rp->p_time+rp->p_nice-NZERO;			if (rppri >= inpri) {				p = rp;				inpri = rppri;			}		}	}	/*	 * If we found a long-time sleeper, or we are desperate and	 * found anyone to swap out, or if someone deserves to come	 * in and we didn't find a sleeper, but found someone who	 * has been in core for a reasonable length of time, then	 * we kick the poor luser out.	 */#ifdef mips	XPRINTF(XPR_VM,"sched: at sleeper if\n",0,0,0,0);#endif mips	if (sleeper || desperate && p || deservin && inpri > maxslp) {#ifdef mips		(void) splhigh();#endif mips#ifdef vax		(void) spl6();#endif vax#ifndef ultrix		lock(LOCK_RQ);		if (p->p_stat == SRUN) {			for (cpuindex = 0; cpuindex < activecpu; cpuindex++) {				if (p == cpudata[cpuindex].c_proc &&				   	   cpudata[cpuindex].c_noproc == 0) {					break;				}			}			if (cpuindex < activecpu) {				unlock(LOCK_RQ);				(void) spl0();				goto doneit;			} else	remrq(p);		} 		p->p_flag &= ~SLOAD;		unlock(LOCK_RQ);#else 		p->p_flag &= ~SLOAD;		if (p->p_stat == SRUN) 			remrq(p);#endif !ultrix		(void) spl0();		if (desperate) {			/*			 * Want to give this space to the rest of			 * the processes in core so give them a chance			 * by increasing the deficit.			 */			gives = p->p_rssize;			if (p->p_textp)				gives += p->p_textp->x_rssize / p->p_textp->x_ccount;			gives = imin(gives, lotsfree);			deficit += gives;		} else			gives = 0;	/* someone else taketh away */		if (swapout(p, p->p_dsize, p->p_ssize,					   p->p_smsize)	/* SHMEM */					   		 == 0)			deficit -= imin(gives, deficit);		goto loop;	}	/*	 * Want to swap someone in, but can't	 * so wait on runin.	 */doneit:#ifdef mips	XPRINTF(XPR_VM,"sched: at doneit\n",0,0,0,0);#endif mips#ifdef mips	(void) splhigh();#endif mips#ifdef vax	(void) spl6();#endif vax	runin++;#ifdef mips	XPRINTF(XPR_VM,"sched: sleeping on runin\n",0,0,0,0);#endif mips	sleep((caddr_t)&runin, PSWP);	(void) spl0();	goto loop;}vmmeter(){	register unsigned *cp, *rp, *sp;#ifdef mips	XPRINTF(XPR_VM,"enter vmmeter",0,0,0,0);#endif mips	deficit -= imin(deficit,	    imax(deficit / 10, ((klin * CLSIZE) / 2) * maxpgio / 2));	ave(avefree, freemem, 5);	ave(avefree30, freemem, 30);	/* v_pgin is maintained by clock.c */	cp = &cnt.v_first; rp = &rate.v_first; sp = &sum.v_first;	while (cp <= &cnt.v_last) {		ave(*rp, *cp, 5);		*sp += *cp;		*cp = 0;		rp++, cp++, sp++;	}	if (time.tv_sec % 5 == 0) {		vmtotal();		rate.v_swpin = cnt.v_swpin;		sum.v_swpin += cnt.v_swpin;		cnt.v_swpin = 0;		rate.v_swpout = cnt.v_swpout;		sum.v_swpout += cnt.v_swpout;		cnt.v_swpout = 0;	}	if (avefree < minfree && runout || proc[0].p_slptime > maxslp/2) {		runout = 0;		runin = 0;		wakeup((caddr_t)&runin);		wakeup((caddr_t)&runout);	}}#ifdef vax#define	RATETOSCHEDPAGING	4		/* hz that is */#endif vax/* * Schedule rate for paging. * Rate is linear interpolation between * slowscan with lotsfree and fastscan when out of memory. */schedpaging(){	register int vavail, scanrate;#ifdef mips	XPRINTF(XPR_VM,"enter schedpaging",0,0,0,0);#endif mips	nscan = desscan = 0;	vavail = freemem - deficit;	if (vavail < 0)		vavail = 0;	if (freemem < lotsfree) {		scanrate =			(slowscan * vavail + fastscan * (lotsfree - vavail)) /				nz(lotsfree);		desscan = ((LOOPPAGES / CLSIZE) / nz(scanrate)) /				RATETOSCHEDPAGING;		wakeup((caddr_t)&proc[2]);	}	timeout(schedpaging, (caddr_t)0, hz / RATETOSCHEDPAGING);}vmtotal(){	register struct proc *p;	register struct text *xp;	int nrun = 0;#ifdef mips	XPRINTF(XPR_VM,"enter vmtotal",0,0,0,0);#endif mips	total.t_vmtxt = 0;	total.t_avmtxt = 0;	total.t_rmtxt = 0;	total.t_armtxt = 0;	for (xp = text; xp < textNTEXT; xp++)		if (xp->x_gptr) {			total.t_vmtxt += xp->x_size;			total.t_rmtxt += xp->x_rssize;			for (p = xp->x_caddr; p; p = p->p_xlink)			switch (p->p_stat) {			case SSTOP:			case SSLEEP:				if (p->p_slptime >= maxslp)					continue;				/* fall into... */			case SRUN:			case SIDL:				total.t_avmtxt += xp->x_size;				total.t_armtxt += xp->x_rssize;				goto next;			}next:			;		}	total.t_vm = 0;	total.t_avm = 0;	total.t_rm = 0;	total.t_arm = 0;	total.t_rq = 0;	total.t_dw = 0;	total.t_pw = 0;	total.t_sl = 0;	total.t_sw = 0;	for (p = allproc; p != NULL; p = p->p_nxt) {		if (p->p_flag & SSYS)			continue;		if (p->p_stat) {			total.t_vm += p->p_dsize + p->p_ssize;			total.t_rm += p->p_rssize;			switch (p->p_stat) {			case SSLEEP:			case SSTOP:				if (p->p_pri <= PZERO)					nrun++;				if (p->p_flag & SPAGE)					total.t_pw++;				else if (p->p_flag & SLOAD) {					if (p->p_pri <= PZERO)						total.t_dw++;					else if (p->p_slptime < maxslp)						total.t_sl++;				} else if (p->p_slptime < maxslp)					total.t_sw++;				if (p->p_slptime < maxslp)					goto active;				break;			case SRUN:			case SIDL:				nrun++;				if (p->p_flag & SLOAD)					total.t_rq++;				else					total.t_sw++;active:				total.t_avm += p->p_dsize + p->p_ssize;				total.t_arm += p->p_rssize;				break;			}		}	}	total.t_vm += total.t_vmtxt;	total.t_avm += total.t_avmtxt;	total.t_rm += total.t_rmtxt;	total.t_arm += total.t_armtxt;	total.t_free = avefree;	loadav(avenrun, nrun);}/* * Constants for averages over 1, 5, and 15 minutes * when sampling at 5 second intervals. */#ifdef vaxdouble	cexp[3] = {	0.9200444146293232,	/* exp(-1/12) */	0.9834714538216174,	/* exp(-1/60) */	0.9944598480048967,	/* exp(-1/180) */};#endif vax#ifdef mips#if (FBITS != 8)# include "Error: need to redefine cexp[] decay constants."#endif FBITSfix     cexp[3] = {        236,            /* (1<<8)*exp(-1/12) */        252,            /* (1<<8)*exp(-1/60) */        255,            /* (1<<8)*exp(-1/180) */};fix     one_cexp[3] = {        20,             /* (1<<8)*(1-exp(-1/12)) */        4,              /* (1<<8)*(1-exp(-1/60)) */        1,              /* (1<<8)*(1-exp(-1/180)) */};#endif mips/* * Compute a tenex style load average of a quantity on * 1, 5 and 15 minute intervals. */loadav(avg, n)#ifdef vax	register double *avg;#endif vax#ifdef mips        register fix *avg;#endif mips	int n;{	register int i;#ifdef mips	XPRINTF(XPR_VM,"enter loadav",0,0,0,0);#endif mips	for (i = 0; i < 3; i++)#ifdef vax		avg[i] = cexp[i] * avg[i] + n * (1.0 - cexp[i]);#endif vax#ifdef mips                avg[i] = MUL_2FIX(cexp[i], avg[i]) + n * one_cexp[i];#endif mips}

⌨️ 快捷键说明

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