Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
5f8ad95c
提交
5f8ad95c
2月 20, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use a strong prng like arc4.
out of ~1000000 invocations: rnd.cc generates 999426 odd and 510 even numbers arc4.hh generates 500412 odd and 499508 even numbers
上级
0e6651e8
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
75 行增加
和
4 行删除
+75
-4
arc4.hh
include/arc4.hh
+53
-0
crange_arch.hh
user/crange_arch.hh
+2
-0
umain.cc
user/umain.cc
+20
-4
没有找到文件。
include/arc4.hh
0 → 100644
浏览文件 @
5f8ad95c
class
arc4
{
public
:
arc4
(
const
u8
*
key
,
size_t
nbytes
)
{
reset
();
for
(
size_t
n
=
0
;
n
<
nbytes
;
n
+=
128
)
addkey
(
&
key
[
n
],
nbytes
>
n
+
128
?
128
:
n
+
128
-
nbytes
);
j
=
i
;
}
u8
getbyte
()
{
uint8_t
si
,
sj
;
i
=
(
i
+
1
)
&
0xff
;
si
=
s
[
i
];
j
=
(
j
+
si
)
&
0xff
;
sj
=
s
[
j
];
s
[
i
]
=
sj
;
s
[
j
]
=
si
;
return
s
[(
si
+
sj
)
&
0xff
];
}
template
<
class
T
>
T
rand
()
{
T
v
;
for
(
u32
i
=
0
;
i
<
sizeof
(
v
);
i
++
)
*
(
u8
*
)
&
v
=
getbyte
();
return
v
;
}
private
:
void
reset
()
{
i
=
0xff
;
j
=
0
;
for
(
u32
n
=
0
;
n
<
0x100
;
n
++
)
s
[
n
]
=
n
;
}
void
addkey
(
const
u8
*
key
,
size_t
nbytes
)
{
size_t
n
,
keypos
;
uint8_t
si
;
for
(
n
=
0
,
keypos
=
0
;
n
<
256
;
n
++
,
keypos
++
)
{
if
(
keypos
>=
nbytes
)
keypos
=
0
;
i
=
(
i
+
1
)
&
0xff
;
si
=
s
[
i
];
j
=
(
j
+
si
+
key
[
keypos
])
&
0xff
;
s
[
i
]
=
s
[
j
];
s
[
j
]
=
si
;
}
}
u8
i
;
u8
j
;
u8
s
[
256
];
};
user/crange_arch.hh
浏览文件 @
5f8ad95c
...
...
@@ -10,6 +10,8 @@ extern "C" {
#include <string.h>
}
typedef
uint8_t
u8
;
typedef
uint16_t
u16
;
typedef
uint32_t
u32
;
typedef
uint64_t
u64
;
typedef
uintptr_t
uptr
;
...
...
user/umain.cc
浏览文件 @
5f8ad95c
...
...
@@ -7,9 +7,11 @@
#include "crange.hh"
#include "atomic_util.hh"
#include "ns.hh"
#include "rnd.hh"
#include "scopedperf.hh"
#include "intelctr.hh"
#include "arc4.hh"
#include "amd64.h"
#include "rnd.hh"
u64
proc_hash
(
const
u32
&
pid
)
...
...
@@ -17,12 +19,25 @@ proc_hash(const u32 &pid)
return
pid
;
}
pthread_key_t
myproc_key
;
pthread_key_t
myproc_key
,
arc4_key
;
cpu
cpus
[
NCPU
];
u32
ncpu
;
u64
ticks
;
xns
<
u32
,
proc
*
,
proc_hash
>
*
xnspid
;
template
<
class
T
>
T
rnd
()
{
arc4
*
a
=
(
arc4
*
)
pthread_getspecific
(
arc4_key
);
if
(
!
a
)
{
struct
seed
{
u64
a
,
b
;
}
s
=
{
rdtsc
(),
pthread_self
()
};
a
=
new
arc4
((
u8
*
)
&
s
,
sizeof
(
s
));
pthread_setspecific
(
arc4_key
,
a
);
}
return
a
->
rand
<
T
>
();
}
static
void
*
proc_start
(
void
*
arg
)
{
...
...
@@ -74,9 +89,9 @@ worker(void *arg)
for
(
u32
i
=
0
;
i
<
iter_total
/
ncpu
;
i
++
)
{
ANON_REGION
(
"worker op"
,
&
perfgroup
);
u64
k
=
1
+
rnd
()
%
(
crange_items
*
2
);
u64
k
=
1
+
rnd
<
u32
>
()
%
(
crange_items
*
2
);
auto
span
=
cr
->
search_lock
(
k
,
1
);
if
(
rnd
()
&
1
)
{
if
(
rnd
<
u8
>
()
&
1
)
{
ANON_REGION
(
"worker del"
,
&
perfgroup
);
span
.
replace
(
0
);
}
else
{
...
...
@@ -145,6 +160,7 @@ main(int ac, char **av)
}
assert
(
0
==
pthread_key_create
(
&
myproc_key
,
0
));
assert
(
0
==
pthread_key_create
(
&
arc4_key
,
0
));
for
(
u32
i
=
0
;
i
<
NCPU
;
i
++
)
cpus
[
i
].
id
=
i
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论