]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Add prng(9) API
authorcem <cem@FreeBSD.org>
Thu, 13 Aug 2020 20:48:14 +0000 (20:48 +0000)
committercem <cem@FreeBSD.org>
Thu, 13 Aug 2020 20:48:14 +0000 (20:48 +0000)
commitaac895409acfe3f6c758ea323e0d29bfb0cbea47
tree1555e019838dfb5459fdcfad310285ab48d7f879
parent6370d3a20f3c426777ed10cc471a859fba29cbfe
Add prng(9) API

Add prng(9) as a replacement for random(9) in the kernel.

There are two major differences from random(9) and random(3):

- General prng(9) APIs (prng32(9), etc) do not guarantee an
  implementation or particular sequence; they should not be used for
  repeatable simulations.

- However, specific named API families are also exposed (for now: PCG),
  and those are expected to be repeatable (when so-guaranteed by the named
  algorithm).

Some minor differences from random(3) and earlier random(9):

- PRNG state for the general prng(9) APIs is per-CPU; this eliminates
  contention on PRNG state in SMP workloads.  Each PCPU generator in an
  SMP system produces a unique sequence.

- Better statistical properties than the Park-Miller ("minstd") PRNG
  (longer period, uniform distribution in all bits, passes
  BigCrush/PractRand analysis).

- Faster than Park-Miller ("minstd") PRNG -- no division is required to
  step PCG-family PRNGs.

For now, random(9) becomes a thin shim around prng32().  Eventually I
would like to mechanically switch consumers over to the explicit API.

Reviewed by: kib, markj (previous version both)
Discussed with: markm
Differential Revision: https://reviews.freebsd.org/D25916
share/man/man9/Makefile
share/man/man9/prng.9 [new file with mode: 0644]
sys/conf/files
sys/contrib/pcg-c/include/pcg_variants.h
sys/kern/subr_prng.c [new file with mode: 0644]
sys/libkern/random.c
sys/sys/prng.h [new file with mode: 0644]