计算有两个特点:第一,计算是确定的,即只要输入相同,程序执行后得到的结果总是一样的;第二,程序在任意时刻只做一件事,不能同时做多件事。这是传统程序的典型特征。
不属于典型形式的计算形式:一种是能够处理随机现象的模拟方法,一种是能够同时做多件事的多线程并发。这两种计算形式的共同特点是不确定性,即针对同样的输入,同一程序可能有不同的执行过程和结果。
9.1 模拟
9.1.1 计算机建模
- 利用计算机解决现实中的问题,首先需要在计算机中将问题表示出来,这个过程称为建模(modeling),即建立描述现实问题的一个模型(model)。
- 混沌现象,是指在确定性系统中发生的看上去随机、不规则的运动,即用确定性理论描述的系统却表现出不确定的行为。混沌现象的特征是不可预测性和对初始条件的极端敏感性。
9.1.2 随机问题的建模与模拟
- 随机数生成函数
- Python语言提供了一个标准库模块random,该模块中定义了若干种伪随机数生成函数。random模块中用得最多的随机数生成函数是randrange和random。
- randrange函数生成一个给定范围内的整型伪随机数,范围由randrange的参数指定,具体格式和range函数一样。
- random函数可用来生成浮点型伪随机数,确切地说,该函数生成[0,1)区间中的浮点数。random不需要提供参数。
- 模拟
9.1.3 编程案例:乒乓球比赛模拟
- 球员技术水平的表示
- 模拟一回合比赛与得分
- 模拟一局比赛
- 模拟一场比赛
- 完整程序
9.2 原型法
- 原型法的思想是,先开发一个简单版本,即功能少、界面简单的版本,然后再对这个简单版本逐步进行改善(添加或修改功能),直至完全满足用户需求。初始精简版程序称为原型(prototype)。应用原型法来进行软件开发的步骤大致如下:
- 确认基本需求
- 创建原型
- 向用户演示或交付用户试用,获得反馈意见
- 改善原型:回到(3),重复(3)(4),直至用户最终认可。
9.3 并行计算
9.3.1
- 计算机执行程序时,如果采用按顺序执行的方式,即仅当一个程序执行完毕,下一个程序才能开始执行,则称为串行(serial)执行。
- 多个相互独立的程序交叉执行的方式称为并发(concurrent)执行。并发执行的多个程序的起止时间是交叉重叠的,而不是串行执行方式下的前后相继。
- 如果计算机系统中有多个处理器,那么就可以做到真正的多个程序“同时”执行,因为各CPU可以在同一时刻执行各自的指令,为了与单一CPU上的并发相区别,我们称这种执行方式为并行(parallel)执行。
9.3.2 进程与线程
- 操作系统控制处理器在多个程序之间切换执行的过程称为调度。传统的多任务操作系统是以进程为单位进行调度的。
- 进程(process)是指程序的一次执行所形成的实体,每当程序开始执行,就会创建个进程。
- 每个进程都程序代码以及一些状态信息(如进程数据的当前值和当前执行点等)组成,状态信息也称为进程的上下文。
- 线程与进程既类似又有明显区别。系统中的多个进程一般是由执行不同程序而创建的,而多个线程是同一程序(进程)的多个执行流;多个进程的状态是各自独立的,而多线程可以共享地址空间(代码和上下文);调度进程时上下文切换比多线程的上下文切换开销大;进程间通信比较麻烦,而线程之间通过共享内存很容易通信。
9.3.3 多线程编程的应用
9.3.4 Python多线程编程
- Python提供了两个支持线程的模块,一个是较老的thread模块,另一个是较新的threading模块。其中threading采用了面向对象实现,功能更强。
- thread模块的用法
- 任何程序一旦开始执行,就构成了一个主线程。在主线程中随时可以创建新的子线程去执行特定任务,并且主线程是并发执行的。
- 每个线程的生命期包括创建、启动、执行和结束四个阶段。
- threading模块的用法
- 并发计算中的同步问题
9.3.5 小结
9.4 练习
书籍下载地址:https://download.csdn.net/download/qq_37590544/10959608