LINUX随机数的产生
来源:互联网 发布:类似photos的软件 编辑:程序博客网 时间:2024/05/01 12:08
linux内核采用熵描述数据的随机性,熵越大表示系统越混乱。计算机本身是可预测的系统,因此用计算机算法不可能产生真正的随机数。但由于机器中充满了噪声,而这些噪声又很难预测,没有规律可循,因此这些噪声可以作为随机数的产生源。linux内核就是利用噪声来产生随机数的,它维持3个熵池(一级、二级和三级),而这些噪声课分为4类。如下:
1)I/O中断。内核调用add_interrupt_randomness()函数将设备两次中断的时间间隔作为噪声源将随机数据加入熵池,要使用设备的中断作为系统噪声,必须用SA_SAMPLE_RANDOM标志注册其中断服务程序。这样,每当设备发生中断时,中断系统会自动调用 add_interrupt_randomness()将熵加入熵池。
2)键盘:Add_keyboard_randomness()将按键的扫描码和两次按键之间的时间间隔作为噪声源;
3)鼠标:而add_mouse_randomness()则利用鼠标位置和连续两次鼠标中断时间间隔填充熵池;
4)硬盘:最后 add_disk_randomness()函数则以连续两次磁盘操作之间的间隔产生随机数。
为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。上面的函数最终都是通过调用 add_timer_randomness()函数将熵加入熵池的。Add_timer_randomness()首先估算所加数据的熵,再调用 batch_entropy_store()函数将数据加入熵池。为了避免中断的延迟过长影响系统性能,batch_entropy_store()并不直接将熵加入熵池,而是将其加入队列中。当队列长度达到一定长度后,由keventd内核线程通过调用batch_entropy_process()函数将队列中的熵加入池中。Batch_entropy_process()函数枚举队列中的每个熵,对每个熵调用 add_entropy_words()函数将其加入熵池,但它并不更新熵池的熵估算值。为此,batch_entropy_process()对每个熵调用完add_entropy_words()后,立刻调用credit_entropy_store()函数更新熵估算值。
参考:http://article.ednchina.com/Other/20080407090354.htm
- LINUX随机数的产生
- linux qt,产生随机数的一种方法
- linux系统产生随机数的方法
- linux下的真随机数发生器 产生真随机数
- linux产生随机数
- linux产生随机数
- linux下产生随机数
- Linux产生随机数
- Linux产生随机数
- linux产生随机数
- linux产生随机数
- 关于随机数的产生
- 随机数的产生
- 随机数的产生
- 随机数的产生
- 随机数的产生
- dephi 随机数的产生
- 随机数产生的程序
- GL中保留款的概念
- 百度面试题目
- 百度笔试--芯片测试
- 《大话处理器》输出到台湾了
- BigDecimal与科学计数法的问题
- LINUX随机数的产生
- 深入理解linux内核--内存寻址
- hdu 1753
- SEO关键词的核心:从不同层次与角度去捕获目标用户
- loadrunner 9.5 安装出错及解决
- 票据问题(继承与super)
- 搭建个人网站需要的三个步骤
- .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(2)
- 《Linux那些事儿之我是USB》我是U盘(17)冬天来了,春天还会远吗?(三)