前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发编程-并发的简史

并发编程-并发的简史

作者头像
ImportSource
发布2018-04-03 16:39:02
9650
发布2018-04-03 16:39:02
举报
文章被收录于专栏:ImportSourceImportSource

1.1.A(Very)Brief History of Concurrency 并发的简史

在很久以前,计算机没有操作系统;他们只执行一个程序,从头到尾的执行,并且这个程序直接访问机器的所有资源。所以不但编写程序非常的麻烦,因为它运行在裸机上( bare metal),而且一次只运行一个程序,对于昂贵且稀有的计算机资源来说是极大的浪费。

慢慢的到后来,有了操作系统,有了操作系统以后,就可以一次性运行不止一个程序了。在每个process上运行独立的程序:隔离的,独立的执行程序。操作系统会给分配计算机资源,比如内存(memory),文件handles(file handles)以及安全证书(security credentials)。

如果需要的话,你还可以在process间通信,可以交换信息。当然这种交换信息是比较粗糙的,粗粒度的(coarse grained)。使用如socket,signal handler(信号处理器),共享内存(shared memory),信号量(semaphores)以及文件(files)。

为什么要把操作系统开发成支持同时执行多个program 呢?有以下几个原因:

提高资源利用(Resource utilization)。

程序有时候不得不停下来等待一些外部操作,比如input或output,那么在等待的过程中不能干其他的事情。如果在等待的时候,也可以运行其它程序,自然就显得比较高效了,也是对资源的充分利用。

公平性(Fairness)。

很多个user和program,他们对于计算机资源应该享有平等的权利。如果把计算机资源比作皇帝,user和program比做妃子,那么要雨露均沾啊。一种比较好的做法就是通过一种粗粒度的时间分片让他们共享计算机的资源,而不是让一个程序执行完毕之后,再去启动另外一个。

便利性(Convenience)。

很多时候,我们选择编写多个program,然后每个program只负责执行一个任务(task),然后他们之间相互配合。这样做总好过比把所有的任务都写在一个program里。

在早期的times sharing系统(也有叫:分时系统的)中,每个进程(process)相当于一个虚拟的冯.诺伊曼计算机(virtual von Neumann computer);它有个内存空间(memory space),这个内存空间用来存储指令(instructions)和数据(data)。它按照机器语言的语义来顺序的执行指令,通过操作系统的一组I/O原语和外部世界交互。每一个被执行的指令中都清楚的定义了“下一个指令”(next instruction),而且控制通过程序按照指令集的规则来流动。几乎我们现在被广泛使用的所有编程语言都遵循了这样的“串行编程模型”(sequential programming model),就是语言规范中都清晰定义了:在一个给定的操作执行完成后下一步要做什么,what comes next。

串行编程模型(sequintal programming model)是比较符合人类的直觉的,是自然的,因为它模仿了人类工作的方式:一次只做一件事情,大部分时候都是顺序执行的,一件做完再做下一件。

比如你离开床,然后穿上浴衣,然后下楼,然后开始喝茶。

在编程语言中,这些真实世界的每个动作可以进一步被抽象成更细微的动作:打开橱柜,选择一款茶叶,把茶叶放入锅,看茶壶中是否有足够的水,如果水不够,那么加些水进去,然后把茶壶放到燃气炉上,点火,等待水烧开,以及一系列。

最后那一步,在等待烧水的时候,你也可以异步的做一些事情。

在烧水的时候,你可以选择一直干等着,或者在这个时候做一些其它事情,比如开始烤面包片(或其它一些异步的事情)或者取来一张报纸看看,

茶壶和面包机的生产商也知道他们的产品经常会被用在这种异步的情况下,所以他们也会在自己的产品上加个发出“逼逼”声的信号器。这样当任务完成后,就会发出逼逼声。

那些高效的人,能够在串行和异步之间找到很多的平衡,编程也是如此。

上面说的那些原因促使了process的出现,也同时促成了线程的出现。

线程允许多个程序控制流在一个进程中共同存在。

线程们共享着进程很多的资源比如内存(memory)以及文件handles(file handles),但同时每个线程又有自己的程序计数器(counter),栈(stack)以及局部变量(local variables)。

线程还提供了一个自然的分解模式,这种模式可以充分的利用多处理器系统中的硬件的并发性。

在同一个program中的多个线程可以被并行的调度到多个cpu上。

线程(thread)有时候被称为轻量级的进程(process),现在大多数的操作系统都是以线程为调度的基本单元,而不是进程。

在没有明确的协同机制的情况下,线程们都将各自为战,独立的运行。

由于线程们共享他们所属进程的“内存地址空间”(memory address space),一个进程内所有的线程都可以访问到同样的变量(variables),以及从相同的堆(heap)中分配对象,这就需要一种比进程间粒度更细的共享机制。

但是如果没有显式的同步机制来协调的访问共享数据,就可能会出现一个线程修改变量的同时,另外一个线程也正在使用这个变量的情况,这将会导致无法预知的结果

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档