科研和工程中的编程概述_第1页
科研和工程中的编程概述_第2页
科研和工程中的编程概述_第3页
科研和工程中的编程概述_第4页
科研和工程中的编程概述_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、科研和工程中的编程概述第1页,共19页。课程任务v掌握编程目的和意义v了解代码编写和优化的技巧v掌握科研工程的问题建模方法和步骤v掌握面向空间的设计方法v掌握面向时间的设计方法v实践各种设计方法第2页,共19页。编程目的和意义v目的:用计算机程序完成科研和工程中的实际问题。v意义:和计算机对话,以看到需要的计算结果。v主要平台:通用编程:windows Linux UNIX各版本 macOS其他:各种嵌入式操作系统第3页,共19页。代码的主要目标形式v桌面程序(科研和工程问题解决的主要方式)windowsLinux界面程序(UI)一般进程调用界面库控制台程序(console) 一般进程服务程序

2、(service)守护进程第4页,共19页。代码的主要目标形式v脚本程序以一个特定的桌面程序为宿主平台,一般解释执行,主要有:(1)web应用程序(服务器端脚本,客户端在浏览器中运行的各种脚本程序)(2)办公软件(word, excel之VBA,SQLServer中存储过程等)(3)科学计算程序(matlab, mathematic, mathCAD, AutoCAD, 3DMax, Photoshop等)(4)游戏动画(3D游戏引擎下的如lua等脚本)第5页,共19页。代码的主要目标形式v程序代码最终生成模块(Module),在C#中称为装配件(Assembly)v进程(Process)是操

3、作系统多任务并发执行的一个基本单位,在进程下还可以创建线程(Thread),作为多任务并发执行的补充。Windows以线程为基本调度单位,Linux以进程为基本调度单位。v操作系统创建一个进程时,会装入所需模块,并执行其中的代码。v后续课程操作系统会详述。第6页,共19页。代码的主要目标形式v进程中模块的分类WindowsLinux可执行模块exe (自身代码引用的地址全部已确定)可执行模块(同左)动态链接模块DLL(自身代码引用地址为浮动地址,必要时需要重定位)共享库模块SO.X(同左)驱动程序模块SYS或其他,运行在核心态/用户态驱动程序模块,运行在核心态/用户态第7页,共19页。代码的主

4、要目标形式v进程拥有自己的独立编址的内存空间(称为虚拟内存空间),在32位操作系统下最大达4G,在64位操作系统下更大。进程的虚拟内存空间按多个固定大小的内存页面来组织,分为可交换页和非可交换页两种,模块的代码和数据就是映射到这些页面上,由操作系统根据需要调入物理内存来执行。操作系统直接把进程空间的高地址部分映射到已经装载了驱动模块的那些系统的内存页面上。第8页,共19页。代码的主要目标形式v操作系统根据用户的要求为一个可执行模块创建一个进程,同时根据可执行模块文件内的信息装载它所依赖的动态模块(同样动态模块要是依赖其它动态模块就递归地依次装入)。当然也可以在程序内用API函数动态地装载模块。

5、动态模块内的函数地址被重新定位,使得其他各种类型的模块能调用它们。具体动态链接的过程可看参考书Linker and loader。第9页,共19页。代码的主要目标形式v模块的组成(1)机器代码(2)已初始化全局数据(如全局变量)(3)未初始化全局数据(如方法/函数内的静态局部变量)(4)资源(windows下DLL内,可看作特殊全局数据)(5)模块信息(各种信息及导入/导出函数表)第10页,共19页。代码的主要目标形式v一个进程内含有一个可执行模块(指含主入口的exe模块,也会有其他exe模块被动态装载,此时都算作动态模块)和多个动态模块(不讨论驱动模块)。v动态链接库可以做到机器代码在不同的

6、进程间共享,而全局性数据则为每个进程复制一份独立的拷贝 (有特殊设置可以让全局性数据在不同的进程间共享,但一般不这样作,而用共享内存方法来取代),所以动态库是二进制级别的代码复用方法。vC+程序(类、函数等)则是源代码级别的代码复用方法。显然源代码若修改了整个软件要重新编译*。第11页,共19页。代码的主要目标形式v操作系统如果装载了一个可执行模块的多个实例,即多个进程都装载了同一个exe模块和其依赖的动态模块,那么该可执行模块的机器代码页同样可以被多个进程共享,全局性数据自然是每个进程有一份自己的拷贝。v编写大型工程/算法软件需要进行模块的分划和设计。第12页,共19页。编写代码的一个考虑v

7、全局变量、类的静态成员变量、方法/函数内的静态局部变量(线程局部存储变量除外)都会在模块内有自己唯一的一个地址。如果源代码有这样的变量,并在生成exe模块或者多个dll模块时被使用,那么进程内将有多份这样的全局性变量。v如果算法设计中需要的一个全局性的变量是相对进程来说是唯一的,就不能把含有该全局性的变量的代码做成源代码级别的共享的库,而是做在一个单独的动态链接库内,再通过一系列函数来操作该变量。第13页,共19页。编写代码的一个考虑v由于一个进程可以创建多个线程,而这些线程是可以并行访问同一进程空间内的数据的,因此要注意对可能被多个线程访问和修改的数据进行同步保护。v前述的全局性的变量要特别

8、注意进行多线程保护,特别是方法/函数内的静态局部变量,它是在第一次被调用时初始化的,如果有多个线程同时调用该方法/函数而不注意保护,可能造成该静态局部变量被多次初始化。(该方法/函数是不可重入的)第14页,共19页。编写代码的一个考虑vCRT库中隐含有全局变量。采用动态链接没有问题,但采用静态链接将使每个模块都有一份这样的全局变量。如new,malloc等动态内存平分配函数会使用隐含的全局变量,在一个模块中分配内存,在另一个模块中释放这块内存,会因为使用不同的全局变量标示内部数据结构而导致内存错误。所以编写代码时要在同一个模块内提供内存的分配和释放成对出现的函数。第15页,共19页。编写代码的

9、一个考虑v所以进行算法设计时尽量少用全局变量,包括线程局部存储TLS全局变量(每个线程有一份变量的拷贝),尽量使用类的成员变量来描述问题中的属性、状态等。即使必须要全局性的变量,也要控制在一定范围内,考虑进程范围、线程范围、模块范围的内存占用情况和使用情况,要不要同步保护等。第16页,共19页。例子v一个大型多人RPG联网对战游戏中,记录当前的玩家总数目、每个玩家的ID是一个全局性的变量。对于服务器端的程序,该变量对于进程是唯一的。因此适合编写一个动态库模块,含此变量,并提供引出函数来操纵该变量。该程序的可执行模块和其他动态模块可通过调用引出函数来访问/修改此变量。v也可以设计为单件模式 (Singleton),参看设计模式。第17页,共19页。上机v编写一个解决方案,含有两个工程,一个是动态库模块,含有全局性的玩家表,假设每个玩家的ID长度不超过8个字符,并提供添加、删除、获得总数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论