Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
7f815e24
提交
7f815e24
2月 26, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Some scheduling clean up
上级
a149ec86
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
83 行增加
和
119 行删除
+83
-119
cpu.hh
include/cpu.hh
+1
-2
kernel.hh
include/kernel.hh
+9
-6
sched.hh
include/sched.hh
+1
-0
condvar.cc
kernel/condvar.cc
+0
-3
console.cc
kernel/console.cc
+0
-1
idle.cc
kernel/idle.cc
+2
-88
sched.cc
kernel/sched.cc
+70
-19
没有找到文件。
include/cpu.hh
浏览文件 @
7f815e24
...
...
@@ -19,8 +19,7 @@ struct cpu {
struct
cilkframe
*
cilkframe
;
int
timer_printpc
;
atomic
<
u64
>
tlbflush_done
;
// last tlb flush req done on this cpu
struct
proc
*
prev
;
struct
proc
*
prev
;
// The previously-running process
// Cpu-local storage variables; see below
struct
cpu
*
cpu
;
...
...
include/kernel.hh
浏览文件 @
7f815e24
...
...
@@ -125,6 +125,9 @@ void ideinit(void);
void
ideintr
(
void
);
void
iderw
(
struct
buf
*
);
// idle.cc
extern
struct
proc
*
idlep
[
NCPU
];
// ioapic.c
void
ioapicenable
(
int
irq
,
int
cpu
);
...
...
@@ -174,7 +177,6 @@ int piperead(struct pipe*, char*, int);
int
pipewrite
(
struct
pipe
*
,
char
*
,
int
);
// proc.c
void
addrun
(
struct
proc
*
);
struct
proc
*
allocproc
(
void
);
struct
proc
*
copyproc
(
struct
proc
*
);
void
exit
(
void
);
...
...
@@ -190,11 +192,6 @@ void yield(void);
struct
proc
*
threadalloc
(
void
(
*
fn
)(
void
*
),
void
*
arg
);
void
threadpin
(
void
(
*
fn
)(
void
*
),
void
*
arg
,
const
char
*
name
,
int
cpu
);
// XXX
void
sched
(
void
);
void
post_swtch
(
void
);
void
scheddump
(
void
);
// prof.c
extern
int
profenable
;
void
profreset
(
void
);
...
...
@@ -206,6 +203,12 @@ int sampintr(struct trapframe*);
void
sampdump
(
void
);
void
sampconf
(
void
);
// sched.cc
void
addrun
(
struct
proc
*
);
void
sched
(
void
);
void
post_swtch
(
void
);
void
scheddump
(
void
);
// spinlock.c
void
acquire
(
struct
spinlock
*
);
int
tryacquire
(
struct
spinlock
*
);
...
...
include/sched.hh
浏览文件 @
7f815e24
...
...
@@ -2,3 +2,4 @@ void delrun(struct proc*);
struct
proc
*
schednext
(
void
);
int
steal
(
void
);
void
addrun
(
struct
proc
*
);
kernel/condvar.cc
浏览文件 @
7f815e24
...
...
@@ -92,10 +92,7 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout)
}
release
(
&
cv
->
lock
);
sched
();
//sti();
// Reacquire original lock.
acquire
(
lk
);
}
...
...
kernel/console.cc
浏览文件 @
7f815e24
...
...
@@ -245,7 +245,6 @@ consoleintr(int (*getc)(void))
switch
(
c
){
case
C
(
'P'
):
// Process listing.
procdumpall
();
scheddump
();
break
;
case
C
(
'E'
):
// Print user-space PCs.
for
(
u32
i
=
0
;
i
<
NCPU
;
i
++
)
...
...
kernel/idle.cc
浏览文件 @
7f815e24
#include "types.h"
#include "kernel.hh"
#include "mmu.h"
#include "amd64.h"
#include "spinlock.h"
#include "condvar.h"
#include "queue.h"
#include "proc.hh"
#include "cpu.hh"
#include "bits.hh"
#include "kmtrace.hh"
#include "sched.hh"
#include "kalloc.hh"
#include "vm.hh"
#include "ns.hh"
static
struct
proc
*
the_idle
[
NCPU
]
__mpalign__
;
extern
void
forkret
(
void
);
void
post_swtch
(
void
)
{
if
(
get_proc_state
(
mycpu
()
->
prev
)
==
RUNNABLE
&&
mycpu
()
->
prev
!=
the_idle
[
mycpu
()
->
id
])
addrun
(
mycpu
()
->
prev
);
release
(
&
mycpu
()
->
prev
->
lock
);
popcli
();
}
void
sched
(
void
)
{
int
intena
;
#if SPINLOCK_DEBUG
if
(
!
holding
(
&
myproc
()
->
lock
))
panic
(
"sched proc->lock"
);
#endif
if
(
mycpu
()
->
ncli
!=
1
)
panic
(
"sched locks"
);
if
(
get_proc_state
(
myproc
())
==
RUNNING
)
panic
(
"sched running"
);
if
(
readrflags
()
&
FL_IF
)
panic
(
"sched interruptible"
);
intena
=
mycpu
()
->
intena
;
myproc
()
->
curcycles
+=
rdtsc
()
-
myproc
()
->
tsc
;
if
(
get_proc_state
(
myproc
())
==
ZOMBIE
)
mtstop
(
myproc
());
else
mtpause
(
myproc
());
mtign
();
struct
proc
*
next
=
schednext
();
if
(
next
)
{
switchit:
pushcli
();
if
(
get_proc_state
(
next
)
!=
RUNNABLE
)
panic
(
"non-RUNNABLE next %s %u"
,
next
->
name
,
get_proc_state
(
next
));
// Switch to chosen process. It is the process's job
// to release proc->lock and then reacquire it
// before jumping back to us.
struct
proc
*
prev
=
myproc
();
mycpu
()
->
proc
=
next
;
mycpu
()
->
prev
=
prev
;
switchuvm
(
next
);
set_proc_state
(
next
,
RUNNING
);
next
->
tsc
=
rdtsc
();
mtpause
(
next
);
if
(
next
->
context
->
rip
!=
(
uptr
)
forkret
&&
next
->
context
->
rip
!=
(
uptr
)
threadstub
)
{
mtresume
(
next
);
}
mtrec
();
swtch
(
&
prev
->
context
,
next
->
context
);
mycpu
()
->
intena
=
intena
;
post_swtch
();
}
else
if
(
get_proc_state
(
myproc
())
!=
RUNNABLE
)
{
next
=
the_idle
[
mycpu
()
->
id
];
goto
switchit
;
}
else
{
set_proc_state
(
myproc
(),
RUNNING
);
mycpu
()
->
intena
=
intena
;
release
(
&
myproc
()
->
lock
);
}
//swtch(&myproc()->context, mycpu()->scheduler);
//mycpu()->intena = intena;
}
struct
proc
*
idlep
[
NCPU
]
__mpalign__
;
void
idleloop
(
void
)
...
...
@@ -105,7 +20,6 @@ idleloop(void)
// mtrace_call_set(1, cpu->id);
//mtstart(scheduler, idlep);
sti
();
for
(;;)
{
acquire
(
&
myproc
()
->
lock
);
...
...
@@ -134,5 +48,5 @@ initidle(void)
snprintf
(
p
->
name
,
sizeof
(
p
->
name
),
"idle_%u"
,
cpunum
());
mycpu
()
->
proc
=
p
;
myproc
()
->
cpu_pin
=
1
;
the_idle
[
cpunum
()]
=
p
;
idlep
[
cpunum
()]
=
p
;
}
kernel/sched.cc
浏览文件 @
7f815e24
...
...
@@ -24,6 +24,76 @@ struct runq {
static
struct
runq
runq
[
NCPU
]
__mpalign__
;
void
post_swtch
(
void
)
{
if
(
get_proc_state
(
mycpu
()
->
prev
)
==
RUNNABLE
&&
mycpu
()
->
prev
!=
idlep
[
mycpu
()
->
id
])
addrun
(
mycpu
()
->
prev
);
release
(
&
mycpu
()
->
prev
->
lock
);
}
void
sched
(
void
)
{
extern
void
threadstub
(
void
);
extern
void
forkret
(
void
);
int
intena
;
#if SPINLOCK_DEBUG
if
(
!
holding
(
&
myproc
()
->
lock
))
panic
(
"sched proc->lock"
);
#endif
if
(
mycpu
()
->
ncli
!=
1
)
panic
(
"sched locks"
);
if
(
get_proc_state
(
myproc
())
==
RUNNING
)
panic
(
"sched running"
);
if
(
readrflags
()
&
FL_IF
)
panic
(
"sched interruptible"
);
intena
=
mycpu
()
->
intena
;
myproc
()
->
curcycles
+=
rdtsc
()
-
myproc
()
->
tsc
;
if
(
get_proc_state
(
myproc
())
==
ZOMBIE
)
mtstop
(
myproc
());
else
mtpause
(
myproc
());
mtign
();
struct
proc
*
next
=
schednext
();
if
(
next
==
nullptr
)
{
if
(
get_proc_state
(
myproc
())
!=
RUNNABLE
)
{
next
=
idlep
[
mycpu
()
->
id
];
}
else
{
set_proc_state
(
myproc
(),
RUNNING
);
mycpu
()
->
intena
=
intena
;
release
(
&
myproc
()
->
lock
);
return
;
}
}
if
(
get_proc_state
(
next
)
!=
RUNNABLE
)
panic
(
"non-RUNNABLE next %s %u"
,
next
->
name
,
get_proc_state
(
next
));
struct
proc
*
prev
=
myproc
();
mycpu
()
->
proc
=
next
;
mycpu
()
->
prev
=
prev
;
switchuvm
(
next
);
set_proc_state
(
next
,
RUNNING
);
next
->
tsc
=
rdtsc
();
mtpause
(
next
);
if
(
next
->
context
->
rip
!=
(
uptr
)
forkret
&&
next
->
context
->
rip
!=
(
uptr
)
threadstub
)
{
mtresume
(
next
);
}
mtrec
();
swtch
(
&
prev
->
context
,
next
->
context
);
mycpu
()
->
intena
=
intena
;
post_swtch
();
}
void
addrun
(
struct
proc
*
p
)
{
// Always called with p->lock held
...
...
@@ -86,7 +156,6 @@ steal(void)
if
(
get_proc_state
(
steal
)
==
RUNNABLE
&&
!
steal
->
cpu_pin
&&
steal
->
curcycles
!=
0
&&
steal
->
curcycles
>
VICTIMAGE
)
{
//delrun(steal);
steal
->
curcycles
=
0
;
steal
->
cpuid
=
mycpu
()
->
id
;
addrun
(
steal
);
...
...
@@ -133,24 +202,6 @@ initsched(void)
}
}
void
scheddump
(
void
)
{
struct
proc
*
p
;
int
i
;
for
(
i
=
0
;
i
<
NCPU
;
i
++
)
{
struct
runq
*
q
=
&
runq
[
i
];
cprintf
(
"%u
\n
"
,
i
);
acquire
(
&
q
->
lock
);
STAILQ_FOREACH
(
p
,
&
q
->
q
,
runqlink
)
{
cprintf
(
" %s
\n
"
,
p
->
name
);
}
release
(
&
q
->
lock
);
}
}
#if 0
static int
migrate(struct proc *p)
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论