huawei

 

线程堆栈(Thread Stack)和托管堆(Managed Heap)

 

每个正在运行的程序都对应着一个进程 (process),在一个进程内部,可以有一个或多个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保存自 身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存区域的分配与回收不需要程序员干涉,主要由操作系统管理。所有值类型的变 量都是在线程堆栈中分配的。

 

另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所以又称为“托管堆(managed heap)。

 

托管堆是CLR中自动内存管理的基础。初始化新进程时,运行时会为进程保留一个连续的地址空间区域。这个保留的地址空间被称为托管堆。托管堆维护着一个指针,用它指向将在堆中分配的下一个对象的地址。最初,该指针设置为指向托管堆的基址。

 

进程/线程/应用程序域:

进程是死的,线程是活的。

进程是指在系统中正在运行的一个应用程序的执行实例。比如说,当你双击的Microsoft Word的图标,你就开始运行的Word的进程。

线程是进程之内独立执行的一个单元。线程(thread)的职责是对CPU进行虚拟化,可将线程理解为一个逻辑CPU。

另外,一个过程可以包含多个线程。启动Word时,操作系统创建一个进程并开始执行该进程的主线程。

当系统加载一个CLR的进程,进程里面可能有多个线程,这时候系统会给这个进程创建一个大小为1M的线程堆栈。这个线程堆栈用来存放方法调用的实参,和方法内部定义的局部变量。

在同一进程中的线程共享相同的地址空间,而不同的进程没有。因此线程可以读写同样的数据结构和变量,便于线程之间的通信。相反,进程间通信(IPC)很困难且消耗更多资源。

AppDomain简单的说就是应用程序的边界。可以通过它对相同进程中进行再次隔离

普通桌面程序,一个程序就是一个AppDomain。CLR允许在一个进程中托管多个程序(比如IIS一类程序),一个IIS是可以运行很多网站的,如果这些网站都放在一个AppDomain里,一个网站崩溃了,其他网站也不能访问了。如果每个网站都作为独立的程序,对机器的性能要求又太高,而且没法共享一些资源。所以.net就有AppDomain的概念,一个IIS进程里,给每个网站一个AppDomain,这个每个网站都相互独立。

如何管理内存

分代算法对GC的性能改善效果比较明显

作为一个.NET程序员,我们知道托管代码的内存管理是自动的。.NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻 烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保证一切。好吧,有道理,有一定的道理。问题是,当我们用到非托管资源时.NET就不能自动管 理了。这是因为非托管代码不受CLR(Common Language Runtime)控制,超出CLR的管理范围。那么如何处理这些非托管资源呢,.NET又是如何管理并释放托管资源的呢?

自动内存管理和GC
在原始程序中堆的内存分配是这样的:找到第一个有足够空间的内存地址(没被占用的),然后将该内存分配。当程序不再需要此内存中的信息时程序员需要手动将 此内存释放。堆的内存是公用的,也就是说所有进程都有可能覆盖另一进程的内存内容,这就是为什么很多设计不当的程序甚至会让操作系统本身都down掉。我们有时碰到的程序莫名其妙的死掉了(随机现象),也是因为内存管理不当引起的(可能由于本身程序的内存问题或是外来程序造成的)。

另一个常见的实例就是大 家经常看到的游戏的Trainer,他们通过直接修改游戏的内存达到"无敌"的效果。明白了这些我们可以想象如果内存地址被用混乱了的话会多么危险,我们 也可以想象为什么C++程序员(某些)一提起指针就头疼的原因了。另外,如果程序中的内存不被程序员手动释放的话那么这个内存就不会被重新分配,直到电脑 重起为止,也就是我们所说的内存泄漏。

所说的这些是在非托管代码中,CLR通过AppDomain实现代码间的隔离避免了这些内存管理问题,也就是说一个 AppDomain在一般情况下不能读/写另一AppDomain的内存。托管内存释放就由GC(Garbage Collector)来负责。我们要进一步讲述的就是这个GC,但是在这之前要先讲一下托管代码中内存的分配,托管堆中内存的分配是顺序的,也就是说一个 挨着一个的分配。这样内存分配的速度就要比原始程序高,但是高出的速度会被GC找回去。为什么?看过GC的工作方式后你就会知道答案了。
GC工作方式
首先我们要知道托管代码中的对象什么时候回收我们管不了(除非用GC.Collect强迫GC回收,这不推荐,后面会说明为什么)。GC会在它"高兴"的 时候执行一次回收(这有许多原因,比如内存不够用时。这样做是为了提高内存分配、回收的效率)。目前请记住一个对象只有在没有任何引用的情况下才能够被回收。

垃圾回收(garbage collection)自动发现和回收不再使用的内存,不需要程序员的协助。使开发人员得到了解放,现在不必跟踪内存的使用,也不必知道在什么时候释放内 存。但是,垃圾回收器不可以管理内存中的所有资源,对内存中的类型所代表的资源也是一无所知的。这意味着垃圾回收器不知道怎么执行“摧毁资源的状态以进行 清理”。这部分资源就需要开发人员自己写代码实现回收。在.Net framework中,开发人员通常会把清理这类资源的代码写到Finalize,Dispose和Close方法中。

垃圾回收器的第一阶段是所谓的标记(marking)阶段。

垃圾回收器的第二个阶段是压缩(compact)阶段。

http://www.cnblogs.com/chrisghb8812/p/5572591.html

MVC

http://www.cnblogs.com/iamlilinfeng/archive/2013/04/01/2992432.html

 

*我的是对20个人的成绩排序输出,并且求出超过平均成绩的个数
*10个数字找出最大值(常规方法)
*堆排序(能快速从10个数字找出最大值)


红黑树和B+树两种数据结构
如何查找数组中第二大元素
后台数据库的表是怎么设计的
数据库发生死锁怎么办
如何反转单链表?
如何判断单链表有没有环?

生产者消费者是用于解决什么问题的
数据库索引的作用,哪些字段适合建立索引
如果一个数据库需要非常频繁的更新,那么索引会有什么缺点
读写文件用什么类

数组

链表

哈希表

二叉树

https://www.cnblogs.com/chrisghb8812/p/5986235.html
数据库的约束()

写几个事务

数据库的数据类型强制转黄 Convert

 

Povit和unpovit完成行列转换

关键字:distinct having

Sql 优化

 

 


WebForm: 生命周期 页面之间传值方式 session

 

 

IoC、AOP、Remoting
编程:

 

微软的FTE面试 喜欢问数据矩阵 遍历二叉树(这个我都直接放弃)(有一定难度的)

常用的算法(冒泡排序 递归(用非递归代码实现递归))

http://www.cnblogs.com/eniac12/p/5329396.html

 

有没有写过多线程 如何实现

一个登陆或者订单提交页面当大量用户访问时 如何设计避免死锁奔溃

posted @ 2016-10-24 23:35  Chris_在IT道路上前行  阅读(133)  评论(0编辑  收藏  举报