您的位置:首页 > 职场人生

让那些做面试官的屌丝lead不再抖脚系列(一)---同步异步探讨->进程和线程

2015-03-09 17:00 465 查看
面对现在越来越多的面试官的浓郁的乡土气息,以及一些欠缺的弱点会被面试官抓着不放的现实,当然还为了不让面试官在你不停思考过程中拼命抖脚,我们值得对一些目前版本的.net中常见面试讨论点以及常用的看上去能把代码变的很高端的问题罗列出来一起讨论讨论~

————写在前面的废话

第一章我们来探讨下同步异步以及一些相关的东西

1. 进程和线程的差别

一个进程肚子里可以有多个线程,这是简单的包含关系,这是最简单的差别,接下来就是:

-> 每个进程都是独占一块内存的,而多个线程是共享一块内存,也就是说系统并没有给线程分配自己的内存,他拥有的只是极小的单位,比如栈,寄存器

也就是说,一个进程炸了,不会造成别的进程有问题,就像任务管理器中展开的那些,no reponding的进程不会影响系统运行;但是一个线程出现锁死什么的时候会造成这一整个进程(应用程序)炸掉,就是导致了无法响应的问题,所以简单来说就是一个线程炸,整块一起炸,而一个进程炸了,邻居没任何影响。

->多进程应用比多线程应用来的强大,因为他不会因为某条路炸了而整体崩溃,但是反过来说,多线程应用所占资源比多进程来的小,进程间切换需要大量资源损耗,对于并发性任务,我们通常选用多线程模式。

->进程通过CLR进行托管

.net中,我们通过System.Diagnostics.Process类来进行进程调用管理,当然除了在Process类中进行进程管理外,我们还可以通过System.Environment类中的Exit(xx)方法直接杀死进程。

不过在很多情况下,我们并不会对进程有太多的扩展以及开发,毕竟我们无法去某个进程内部干些坏事,这就相当于你通过编程实现将qq的提示颜色变为黑色之类的,进程被framework封装,所以我们无法去知道里面有些神马。

2. 线程以及其扩展

首先我们需要知道一个线程里有些什么:

一个线程包含以下内容。

一个指向当前被执行指令的指令指针;
一个栈;
一个寄存器值的集合,定义了一部分描述正在执行线程的处理器状态的值;
一个私有的数据区。

当然上面是从别的地方找来的资源,这些也就是系统给每个线程分配的资源了,真的不能再多了。
接下来讲个有趣的内容,多线程到底是什么,真的是老板说一句话,然后5个员工一起开始干自己的事,然后提高了效率么?

其实并非这样,.net中有个叫抢占式多任务管理的机制,调度器作为Windows内核的一部分,将时间切片,分成一段段的时间片。这些时间间隔以毫秒为精度且长度并不固定。针对每个处理器,每个时间片仅服务于单独一个线程。线程的迅速执行给我们造成了它们在同时运行的假象。我们在两个时间片的间隔中进行上下文切换。该方法的优点在于,那些正在等待某些Windows资源的线程将不会浪费时间片,直到资源有效为止。怎么理解呢?我们用一个简单的东西来解释下:

线程1:1 1 1 1 1 1 1

线程2:1 1 1 1 1 1 11

线程3: 1 1

我们把所有的1全连接起来,你会发现是条直线,其实对于系统来说,他就是111111111111111111111111,这样,但是由于时间片的分布关系,这3个线程执行时候看起来是3个线程,其实在每个时间点,只有一个1在被执行,也就是说到底,一切都是同步的,同步才是大哥。所以这种机制的缺点也很明显了,他必须通过同步的方式来保护资源,不被别人访问。

进程与线程的基本就到这里了,其实都是很好理解的东西,有些太细的我并不觉得我会去了解,毕竟你在战场上拿刀砍人的时候,不会去考虑刀是用什么做的,里面结构是怎么样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: