立项---分析---需求分析--设计--概要设计(系统设计)--详细设计(UI设计、数据库设计、界面设计)---编码---测试----维护
确保一个类只有一个实例,并提供一个全局访问点
设计模式代表了**的实践,通常是被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决文案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的
单件模式、工厂模式、MVC设计模式
堆与栈实际上是操作系统对进程占用的存储器空间的两种管理方式,主要有如下几种区别:
(1)管理方式不同:栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生存储器泄露
(2)空间大小不同:每个进程拥有的栈的大小要远远小于堆的大小。理论上,程序员可申请的堆大小为虚拟存储器的大小,进程栈的大小64bits的windows默认1m,64bits的linux默认10m
(3)生长方式不同:堆的生长方向向上,存储器地址由低到高;栈的生长方向向下,存储器地址由高到低
(4)分配方式不同:堆都是动态分配的,没有静态分配的,栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现
(5)分配效率不同:栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的存储器申请容易产生存储器碎片。显然,堆的效率比栈要低得多
(6)存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行,保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的存储器(eip),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(ebp),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是调用函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的存储器和系统资源,而一个进程又是由多个线程所组成的。

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程,来完成各自的任务。
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其他的线程而不是等待,这样就大大提高了程序的效率
(1)线程也是程序,所以线程需要占用存储器,线程越多占用存储器也越多;
(2)多线程需要协调和管理,所以需要CPU时间跟踪线程;
(3)线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题
(4)线程太多会导致控制太复杂,最终可能造成很多 Bug
多线程程序一般被用来在后台执行耗时的任务。主线程保持运行,并且工作线程做它的后台工作对于Windows Forms程序来说,如果主线程试图执行冗长的操作,键盘和鼠标的操作会变的迟钝,程序也会失去回应。由于这个原因,应该在工作线程中,运行一个耗时任务时添加一个工作线程,即使在主线程上有一个有好的提示“处理中…”,以防止工作无法继续,这就避免了程序出现由操作系统提示的“没有回应”,来诱使用户强制结束程序的进程而导致错误。模式对话框还允许实现“取消”功能,允许继续接收事件,而实际的任务已被工作线程完成。BackgroundWorker恰好可以辅助完成这一功能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/177554.html