亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? slp.c

?? unix v7是最后一個廣泛發布的研究型UNIX版本
?? C
字號:
#include "../h/param.h"#include "../h/systm.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/proc.h"#include "../h/text.h"#include "../h/map.h"#include "../h/file.h"#include "../h/inode.h"#include "../h/buf.h"#define SQSIZE 0100	/* Must be power of 2 */#define HASH(x)	(( (int) x >> 5) & (SQSIZE-1))struct proc *slpque[SQSIZE];/* * Give up the processor till a wakeup occurs * on chan, at which time the process * enters the scheduling queue at priority pri. * The most important effect of pri is that when * pri<=PZERO a signal cannot disturb the sleep; * if pri>PZERO signals will be processed. * Callers of this routine must be prepared for * premature return, and check that the reason for * sleeping has gone away. */sleep(chan, pri)caddr_t chan;{	register struct proc *rp;	register s, h;	rp = u.u_procp;	s = spl6();	if (chan==0)		panic("zero wchan");	rp->p_stat = SSLEEP;	rp->p_wchan = chan;	if (chan==0)		panic("Sleeping on wchan 0");	rp->p_pri = pri;	h = HASH(chan);	rp->p_link = slpque[h];	slpque[h] = rp;	if(pri > PZERO) {		if(issig()) {			rp->p_wchan = 0;			rp->p_stat = SRUN;			slpque[h] = rp->p_link;			spl0();			goto psig;		}		spl0();		if(runin != 0) {			runin = 0;			wakeup((caddr_t)&runin);		}		swtch();		if(issig())			goto psig;	} else {		spl0();		swtch();	}	splx(s);	return;	/*	 * If priority was low (>PZERO) and	 * there has been a signal,	 * execute non-local goto to	 * the qsav location.	 * (see trap1/trap.c)	 */psig:	resume(u.u_procp->p_addr, u.u_qsav);}/* * Wake up all processes sleeping on chan. */wakeup(chan)register caddr_t chan;{	register struct proc *p, *q;	register i;	int s;	s = spl6();	i = HASH(chan);	p = slpque[i];	q = NULL;	while(p != NULL) {		if(p->p_wchan==chan && p->p_stat!=SZOMB) {			struct proc *sp;			if (q == NULL)				sp = slpque[i] = p->p_link;			else				sp = q->p_link = p->p_link;			p->p_wchan = 0;			setrun(p);			p = sp;			continue;		}		q = p;		p = p->p_link;	}	splx(s);}/* * when you are sure that it * is impossible to get the * 'proc on q' diagnostic, the * diagnostic loop can be removed. */setrq(p)struct proc *p;{	register struct proc *q;	register s;	s = spl6();	for(q=runq; q!=NULL; q=q->p_link)		if(q == p) {			printf("proc on q\n");			goto out;		}	p->p_link = runq;	runq = p;out:	splx(s);}/* * Set the process running; * arrange for it to be swapped in if necessary. */setrun(p)register struct proc *p;{	register caddr_t w;	if (p->p_stat==0 || p->p_stat==SZOMB)		panic("Running a dead proc");	/*	 * The assignment to w is necessary because of	 * race conditions. (Interrupt between test and use)	 */	if (w = p->p_wchan) {		wakeup(w);		return;	}	p->p_stat = SRUN;	setrq(p);	if(p->p_pri < curpri)		runrun++;	if(runout != 0 && (p->p_flag&SLOAD) == 0) {		runout = 0;		wakeup((caddr_t)&runout);	}}/* * Set user priority. * The rescheduling flag (runrun) * is set if the priority is better * than the currently running process. */setpri(pp)register struct proc *pp;{	register p;	p = (pp->p_cpu & 0377)/16;	p += PUSER + pp->p_nice - NZERO;	if(p > 127)		p = 127;	if(p < curpri)		runrun++;	pp->p_pri = p;	return(p);}/* * The main loop of the scheduling (swapping) * process. * The basic idea is: *  see if anyone wants to be swapped in; *  swap out processes until there is room; *  swap him in; *  repeat. * The runout flag is set whenever someone is swapped out. * Sched sleeps on it awaiting work. * * Sched sleeps on runin whenever it cannot find enough * core (by swapping out or otherwise) to fit the * selected swapped process.  It is awakened when the * core situation changes and in any case once per second. */sched(){	register struct proc *rp, *p;	register outage, inage;	int maxsize;	/*	 * find user to swap in;	 * of users ready, select one out longest	 */loop:	spl6();	outage = -20000;	for (rp = &proc[0]; rp < &proc[NPROC]; rp++)	if (rp->p_stat==SRUN && (rp->p_flag&SLOAD)==0 &&	    rp->p_time - (rp->p_nice-NZERO)*8 > outage) {		p = rp;		outage = rp->p_time - (rp->p_nice-NZERO)*8;	}	/*	 * If there is no one there, wait.	 */	if (outage == -20000) {		runout++;		sleep((caddr_t)&runout, PSWP);		goto loop;	}	spl0();	/*	 * See if there is core for that process;	 * if so, swap it in.	 */	if (swapin(p))		goto loop;	/*	 * none found.	 * look around for core.	 * Select the largest of those sleeping	 * at bad priority; if none, select the oldest.	 */	spl6();	p = NULL;	maxsize = -1;	inage = -1;	for (rp = &proc[0]; rp < &proc[NPROC]; rp++) {		if (rp->p_stat==SZOMB		 || (rp->p_flag&(SSYS|SLOCK|SULOCK|SLOAD))!=SLOAD)			continue;		if (rp->p_textp && rp->p_textp->x_flag&XLOCK)			continue;		if (rp->p_stat==SSLEEP&&rp->p_pri>=PZERO || rp->p_stat==SSTOP) {			if (maxsize < rp->p_size) {				p = rp;				maxsize = rp->p_size;			}		} else if (maxsize<0 && (rp->p_stat==SRUN||rp->p_stat==SSLEEP)) {			if (rp->p_time+rp->p_nice-NZERO > inage) {				p = rp;				inage = rp->p_time+rp->p_nice-NZERO;			}		}	}	spl0();	/*	 * Swap found user out if sleeping at bad pri,	 * or if he has spent at least 2 seconds in core and	 * the swapped-out process has spent at least 3 seconds out.	 * Otherwise wait a bit and try again.	 */	if (maxsize>=0 || (outage>=3 && inage>=2)) {		p->p_flag &= ~SLOAD;		xswap(p, 1, 0);		goto loop;	}	spl6();	runin++;	sleep((caddr_t)&runin, PSWP);	goto loop;}/* * Swap a process in. * Allocate data and possible text separately. * It would be better to do largest first. */swapin(p)register struct proc *p;{	register struct text *xp;	register int a;	int x;	if ((a = malloc(coremap, p->p_size)) == NULL)		return(0);	if (xp = p->p_textp) {		xlock(xp);		if (xp->x_ccount==0) {			if ((x = malloc(coremap, xp->x_size)) == NULL) {				xunlock(xp);				mfree(coremap, p->p_size, a);				return(0);			}			xp->x_caddr = x;			if ((xp->x_flag&XLOAD)==0)				swap(xp->x_daddr,x,xp->x_size,B_READ);		}		xp->x_ccount++;		xunlock(xp);	}	swap(p->p_addr, a, p->p_size, B_READ);	mfree(swapmap, ctod(p->p_size), p->p_addr);	p->p_addr = a;	p->p_flag |= SLOAD;	p->p_time = 0;	return(1);}/* * put the current process on * the Q of running processes and * call the scheduler. */qswtch(){	setrq(u.u_procp);	swtch();}/* * This routine is called to reschedule the CPU. * if the calling process is not in RUN state, * arrangements for it to restart must have * been made elsewhere, usually by calling via sleep. * There is a race here. A process may become * ready after it has been examined. * In this case, idle() will be called and * will return in at most 1HZ time. * i.e. its not worth putting an spl() in. */swtch(){	register n;	register struct proc *p, *q, *pp, *pq;	/*	 * If not the idle process, resume the idle process.	 */	if (u.u_procp != &proc[0]) {		if (save(u.u_rsav)) {			sureg();			return;		}		if (u.u_fpsaved==0) {			savfp(&u.u_fps);			u.u_fpsaved = 1;		}		resume(proc[0].p_addr, u.u_qsav);	}	/*	 * The first save returns nonzero when proc 0 is resumed	 * by another process (above); then the second is not done	 * and the process-search loop is entered.	 *	 * The first save returns 0 when swtch is called in proc 0	 * from sched().  The second save returns 0 immediately, so	 * in this case too the process-search loop is entered.	 * Thus when proc 0 is awakened by being made runnable, it will	 * find itself and resume itself at rsav, and return to sched().	 */	if (save(u.u_qsav)==0 && save(u.u_rsav))		return;loop:	spl6();	runrun = 0;	pp = NULL;	q = NULL;	n = 128;	/*	 * Search for highest-priority runnable process	 */	for(p=runq; p!=NULL; p=p->p_link) {		if((p->p_stat==SRUN) && (p->p_flag&SLOAD)) {			if(p->p_pri < n) {				pp = p;				pq = q;				n = p->p_pri;			}		}		q = p;	}	/*	 * If no process is runnable, idle.	 */	p = pp;	if(p == NULL) {		idle();		goto loop;	}	q = pq;	if(q == NULL)		runq = p->p_link;	else		q->p_link = p->p_link;	curpri = n;	spl0();	/*	 * The rsav (ssav) contents are interpreted in the new address space	 */	n = p->p_flag&SSWAP;	p->p_flag &= ~SSWAP;	resume(p->p_addr, n? u.u_ssav: u.u_rsav);}/* * Create a new process-- the internal version of * sys fork. * It returns 1 in the new process, 0 in the old. */newproc(){	int a1, a2;	struct proc *p, *up;	register struct proc *rpp, *rip;	register n;	p = NULL;	/*	 * First, just locate a slot for a process	 * and copy the useful info from this process into it.	 * The panic "cannot happen" because fork has already	 * checked for the existence of a slot.	 */retry:	mpid++;	if(mpid >= 30000) {		mpid = 0;		goto retry;	}	for(rpp = &proc[0]; rpp < &proc[NPROC]; rpp++) {		if(rpp->p_stat == NULL && p==NULL)			p = rpp;		if (rpp->p_pid==mpid || rpp->p_pgrp==mpid)			goto retry;	}	if ((rpp = p)==NULL)		panic("no procs");	/*	 * make proc entry for new proc	 */	rip = u.u_procp;	up = rip;	rpp->p_stat = SRUN;	rpp->p_clktim = 0;	rpp->p_flag = SLOAD;	rpp->p_uid = rip->p_uid;	rpp->p_pgrp = rip->p_pgrp;	rpp->p_nice = rip->p_nice;	rpp->p_textp = rip->p_textp;	rpp->p_pid = mpid;	rpp->p_ppid = rip->p_pid;	rpp->p_time = 0;	rpp->p_cpu = 0;	/*	 * make duplicate entries	 * where needed	 */	for(n=0; n<NOFILE; n++)		if(u.u_ofile[n] != NULL)			u.u_ofile[n]->f_count++;	if(up->p_textp != NULL) {		up->p_textp->x_count++;		up->p_textp->x_ccount++;	}	u.u_cdir->i_count++;	if (u.u_rdir)		u.u_rdir->i_count++;	/*	 * Partially simulate the environment	 * of the new process so that when it is actually	 * created (by copying) it will look right.	 */	rpp = p;	u.u_procp = rpp;	rip = up;	n = rip->p_size;	a1 = rip->p_addr;	rpp->p_size = n;	/*	 * When the resume is executed for the new process,	 * here's where it will resume.	 */	if (save(u.u_ssav)) {		sureg();		return(1);	}	a2 = malloc(coremap, n);	/*	 * If there is not enough core for the	 * new process, swap out the current process to generate the	 * copy.	 */	if(a2 == NULL) {		rip->p_stat = SIDL;		rpp->p_addr = a1;		xswap(rpp, 0, 0);		rip->p_stat = SRUN;	} else {		/*		 * There is core, so just copy.		 */		rpp->p_addr = a2;		while(n--)			copyseg(a1++, a2++);	}	u.u_procp = rip;	setrq(rpp);	rpp->p_flag |= SSWAP;	return(0);}/* * Change the size of the data+stack regions of the process. * If the size is shrinking, it's easy-- just release the extra core. * If it's growing, and there is core, just allocate it * and copy the image, taking care to reset registers to account * for the fact that the system's stack has moved. * If there is no core, arrange for the process to be swapped * out after adjusting the size requirement-- when it comes * in, enough core will be allocated. * * After the expansion, the caller will take care of copying * the user's stack towards or away from the data area. */expand(newsize){	register i, n;	register struct proc *p;	register a1, a2;	p = u.u_procp;	n = p->p_size;	p->p_size = newsize;	a1 = p->p_addr;	if(n >= newsize) {		mfree(coremap, n-newsize, a1+newsize);		return;	}	if (save(u.u_ssav)) {		sureg();		return;	}	a2 = malloc(coremap, newsize);	if(a2 == NULL) {		xswap(p, 1, n);		p->p_flag |= SSWAP;		qswtch();		/* no return */	}	p->p_addr = a2;	for(i=0; i<n; i++)		copyseg(a1+i, a2+i);	mfree(coremap, n, a1);	resume(a2, u.u_ssav);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本在线播放一区二区三区| 欧美日韩一本到| 色婷婷综合久久| 日韩视频免费直播| 亚洲欧美一区二区三区极速播放| 天天综合色天天综合| 成人开心网精品视频| 日韩一区二区在线看| 亚洲精品中文字幕在线观看| 国产精品1区2区| 欧美电影一区二区| 亚洲最色的网站| 国产伦精品一区二区三区视频青涩 | eeuss影院一区二区三区| 国产视频一区二区在线观看| 精品福利在线导航| 亚洲国产毛片aaaaa无费看| 国产一区二区三区不卡在线观看 | 国产成人午夜99999| 91精品国产综合久久精品麻豆| 久久五月婷婷丁香社区| 日韩精品免费专区| 欧美少妇性性性| 1区2区3区欧美| 国产成人亚洲综合a∨婷婷| 日韩精品一区二区三区在线播放 | 欧美一区二区三区思思人| 亚洲三级小视频| 成人av一区二区三区| 久久亚洲综合色一区二区三区| 免费成人在线网站| 制服丝袜日韩国产| 天天操天天色综合| 制服丝袜在线91| 日韩精品亚洲一区二区三区免费| 欧美日韩一区国产| 亚洲成人三级小说| 欧美精品亚洲一区二区在线播放| 亚洲高清视频的网址| 欧洲一区二区三区在线| 一区二区三区美女| 欧美日韩亚洲综合一区二区三区| 一区二区三区在线高清| 91污在线观看| 一区二区高清视频在线观看| 日本电影亚洲天堂一区| 亚洲午夜精品17c| 欧美私模裸体表演在线观看| 天天操天天干天天综合网| 欧美日本在线视频| 美腿丝袜亚洲色图| 337p粉嫩大胆噜噜噜噜噜91av| 韩国精品久久久| 国产偷国产偷精品高清尤物| av不卡一区二区三区| 一区二区三区四区蜜桃| 欧美艳星brazzers| 日韩精品一区第一页| 精品国产髙清在线看国产毛片| 韩国三级中文字幕hd久久精品| 国产片一区二区三区| 97se亚洲国产综合在线| 亚洲一二三区在线观看| 日韩欧美一区中文| 成人免费高清在线观看| 亚洲午夜国产一区99re久久| 日韩一区和二区| 成人国产精品免费观看动漫| 亚洲图片有声小说| 精品少妇一区二区三区在线视频| 粉嫩av亚洲一区二区图片| 一区二区三区精品在线| 日韩一区二区三区视频在线| 成人免费观看男女羞羞视频| 天堂影院一区二区| 国产人成亚洲第一网站在线播放| 日本韩国欧美国产| 国产麻豆精品95视频| 亚洲综合成人在线| 久久综合色之久久综合| 欧洲色大大久久| 国产一区二区三区最好精华液| 夜夜嗨av一区二区三区四季av| 欧美tickling挠脚心丨vk| 91免费国产在线| 久久国产日韩欧美精品| 亚洲综合在线电影| 久久精品水蜜桃av综合天堂| 欧美精品一卡二卡| 91蜜桃婷婷狠狠久久综合9色| 日本在线不卡视频| 亚洲一区二区影院| 国产精品三级电影| 日韩一区和二区| 欧美性受xxxx| av在线不卡网| 国产毛片精品一区| 美女爽到高潮91| 亚洲动漫第一页| 亚洲欧美偷拍另类a∨色屁股| 精品不卡在线视频| 日韩视频免费观看高清完整版在线观看 | 26uuu亚洲婷婷狠狠天堂| 中文字幕第一区第二区| 亚洲黄色小说网站| 国产午夜亚洲精品羞羞网站| 亚洲成人激情综合网| 激情综合色丁香一区二区| 26uuu精品一区二区在线观看| 极品销魂美女一区二区三区| 色综合天天综合在线视频| 久久精品国产亚洲一区二区三区| 不卡一区二区在线| 日精品一区二区三区| 91啦中文在线观看| 91搞黄在线观看| 国产精品小仙女| 亚洲国产日韩a在线播放性色| 亚洲gay无套男同| 91污片在线观看| 日本一区二区动态图| 久久麻豆一区二区| 久久久美女毛片| 国产天堂亚洲国产碰碰| 26uuu成人网一区二区三区| 日韩三级视频在线看| 欧美一区二区日韩一区二区| 欧美一区二区视频在线观看2020| 51精品国自产在线| 日韩欧美国产一区在线观看| 欧美成人一区二区三区| 精品国产第一区二区三区观看体验| 精品少妇一区二区三区在线播放| 26uuu成人网一区二区三区| 国产网站一区二区三区| 亚洲乱码国产乱码精品精的特点 | 亚洲高清不卡在线| 日韩二区三区在线观看| 男男视频亚洲欧美| 国产v日产∨综合v精品视频| 国产精品1区2区| 色呦呦网站一区| 91.麻豆视频| 精品久久久久99| 国产精品久久久久影院色老大 | 国产日韩欧美在线一区| 国产精品免费人成网站| 亚洲一区二区三区四区中文字幕| 天堂影院一区二区| 高清在线不卡av| 欧美性色黄大片| 精品国产91洋老外米糕| 国产精品成人免费| 日韩精品每日更新| 成人午夜又粗又硬又大| 欧美亚洲尤物久久| 久久奇米777| 亚洲国产你懂的| 国产成人在线看| 欧美色网一区二区| 久久人人爽人人爽| 亚洲观看高清完整版在线观看| 精品夜夜嗨av一区二区三区| 91久久人澡人人添人人爽欧美 | 欧美在线免费播放| 欧美电影免费观看高清完整版在| 中文字幕日本乱码精品影院| 久久国产精品露脸对白| 色婷婷av一区二区三区之一色屋| 日韩免费视频一区二区| 亚洲人成网站影音先锋播放| 国产专区欧美精品| 欧美日韩国产中文| 亚洲三级免费观看| 精品一区二区av| 欧美色手机在线观看| 欧美国产激情一区二区三区蜜月| 婷婷成人综合网| 一本大道综合伊人精品热热| 久久久久久毛片| 午夜成人在线视频| 99re免费视频精品全部| 国产午夜精品在线观看| 免费观看在线色综合| 日本久久一区二区| 国产精品麻豆网站| 国产真实乱偷精品视频免| 欧美一级片在线看| 丝袜a∨在线一区二区三区不卡| 91丨九色丨蝌蚪富婆spa| 国产亚洲成aⅴ人片在线观看 | 欧美日韩精品综合在线| 国产精品久久久久婷婷二区次| 精品写真视频在线观看| 日韩西西人体444www| 三级在线观看一区二区| 欧美日韩综合一区| 性做久久久久久免费观看欧美| 91麻豆蜜桃一区二区三区| 国产精品久久夜|