Beispiel #1
0
void 
lasvm_kcache_swap_ri(lasvm_kcache_t *self, int r1, int i2)
{
	xminsize(self, 1+max(r1,i2));
	xswap(self, self->r2i[r1], i2, r1, self->i2r[i2]);
}
Beispiel #2
0
void 
lasvm_kcache_swap_ii(lasvm_kcache_t *self, int i1, int i2)
{
	xminsize(self, 1+max(i1,i2));
	xswap(self, i1, i2, self->i2r[i1], self->i2r[i2]);
}
Beispiel #3
0
/*
 * Create a new process-- the internal version of
 * sys fork.
 * It returns 1 in the new process.
 * How this happens is rather hard to understand.
 * The essential fact is that the new process is created
 * in such a way that appears to have started executing
 * in the same call to newproc as the parent;
 * but in fact the code that runs is that of swtch.
 * The subtle implication of the returned value of swtch
 * (see above) is that this is the value that newproc's
 * caller in the new process sees.
 */
newproc()
{
    int a1, a2;
    struct proc *p, *up;
    register struct proc *rpp;
    register *rip, 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 < 0) {
        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)
            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_flag = SLOAD;
    rpp->p_uid = rip->p_uid;
    rpp->p_ttyp = rip->p_ttyp;
    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;

    /*
     * make duplicate entries
     * where needed
     */

    for(rip = &u.u_ofile[0]; rip < &u.u_ofile[NOFILE];)
        if((rpp = *rip++) != NULL)
            rpp->f_count++;
    if((rpp=up->p_textp) != NULL) {
        rpp->x_count++;
        rpp->x_ccount++;
    }
    u.u_cdir->i_count++;
    /*
     * Partially simulate the environment
     * of the new process so that when it is actually
     * created (by copying) it will look right.
     */
    savu(u.u_rsav);
    rpp = p;
    u.u_procp = rpp;
    rip = up;
    n = rip->p_size;
    a1 = rip->p_addr;
    rpp->p_size = n;
    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;
        savu(u.u_ssav);
        xswap(rpp, 0, 0);
        rpp->p_flag =| SSWAP;
        rip->p_stat = SRUN;
    } else {
        /*
         * There is core, so just copy.
         */
        rpp->p_addr = a2;
        while(n--)
            copyseg(a1++, a2++);
    }
    u.u_procp = rip;
    return(0);
}
Beispiel #4
0
void 
lasvm_kcache_swap_rr(lasvm_kcache_t *self, int r1, int r2)
{
	xminsize(self, 1+max(r1,r2));
	xswap(self, self->r2i[r1], self->r2i[r2], r1, r2);
}
Beispiel #5
0
/*
 * 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.
 * Although it is not remarkably evident, the basic
 * synchronization here is on the runin flag, which is
 * slept on and is set once per second by the clock routine.
 * Core shuffling therefore takes place once per second.
 *
 * panic: swap error -- IO error while swapping.
 *	this is the one panic that should be
 *	handled in a less drastic way. Its
 *	very hard.
 */
sched()
{
    struct proc *p1;
    register struct proc *rp;
    register a, n;

    /*
     * find user to swap in
     * of users ready, select one out longest
     */

    goto loop;

sloop:
    runin++;
    sleep(&runin, PSWP);

loop:
    spl6();
    n = -1;
    for(rp = &proc[0]; rp < &proc[NPROC]; rp++)
        if(rp->p_stat==SRUN && (rp->p_flag&SLOAD)==0 &&
                rp->p_time > n) {
            p1 = rp;
            n = rp->p_time;
        }
    if(n == -1) {
        runout++;
        sleep(&runout, PSWP);
        goto loop;
    }

    /*
     * see if there is core for that process
     */

    spl0();
    rp = p1;
    a = rp->p_size;
    if((rp=rp->p_textp) != NULL)
        if(rp->x_ccount == 0)
            a =+ rp->x_size;
    if((a=malloc(coremap, a)) != NULL)
        goto found2;

    /*
     * none found,
     * look around for easy core
     */

    spl6();
    for(rp = &proc[0]; rp < &proc[NPROC]; rp++)
        if((rp->p_flag&(SSYS|SLOCK|SLOAD))==SLOAD &&
                (rp->p_stat == SWAIT || rp->p_stat==SSTOP))
            goto found1;

    /*
     * no easy core,
     * if this process is deserving,
     * look around for
     * oldest process in core
     */

    if(n < 3)
        goto sloop;
    n = -1;
    for(rp = &proc[0]; rp < &proc[NPROC]; rp++)
        if((rp->p_flag&(SSYS|SLOCK|SLOAD))==SLOAD &&
                (rp->p_stat==SRUN || rp->p_stat==SSLEEP) &&
                rp->p_time > n) {
            p1 = rp;
            n = rp->p_time;
        }
    if(n < 2)
        goto sloop;
    rp = p1;

    /*
     * swap user out
     */

found1:
    spl0();
    rp->p_flag =& ~SLOAD;
    xswap(rp, 1, 0);
    goto loop;

    /*
     * swap user in
     */

found2:
    if((rp=p1->p_textp) != NULL) {
        if(rp->x_ccount == 0) {
            if(swap(rp->x_daddr, a, rp->x_size, B_READ))
                goto swaper;
            rp->x_caddr = a;
            a =+ rp->x_size;
        }
        rp->x_ccount++;
    }
    rp = p1;
    if(swap(rp->p_addr, a, rp->p_size, B_READ))
        goto swaper;
    mfree(swapmap, (rp->p_size+7)/8, rp->p_addr);
    rp->p_addr = a;
    rp->p_flag =| SLOAD;
    rp->p_time = 0;
    goto loop;

swaper:
    panic("swap error");
}