前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从多进程到多线程

从多进程到多线程

原创
作者头像
xujjj
修改2019-07-01 10:23:30
4120
修改2019-07-01 10:23:30
举报
文章被收录于专栏:IT界的泥石流

从多进程到多线程

为了说明白为什么引入线程这个概念,我们将线程和进程进行一个对比,这个问题就很清晰明了了。

现在我们先来看一下系统中运行有两个进程的情况。

可以知道,进程1运行时候,有一行代码是为一个变量分配内存,如果分配到内存的地址刚好为100,而进程2的运行代码又处于内存地址为100的地方,那么这个变量的二进制值就会覆进程2的运行代码,造成进程2的运行错误。

那么解决办法是什么呢?

就是对于进程1,限制它对内存地址100的读写,为多进程实行地址空间分离的策略(这是内存管理的主要内容,这里先大概有个初步理解,后续我们进行详细讲解,有兴趣的同学也可以自行查阅资料)

具体来讲,就是为每一个进程分配一张内存映射表,让每个进程拥有自己的独立内存区域。

如图,进程1代码和进程2代码中的100为逻辑地址,他们都不是物理内存中真实的物理地址,每个进程有它独特的内存映射表,进程1将100映射为760,进程2将100映射为1260,这样就实现了多进程的地址空间分离,就不会发生上述的进程1写数据把进程2代码给覆盖的错误了,因为真正来说,进程1是在内存地址760中写数据,而进程2的代码地址是在内存地址为1260的位置。

由上可得,每个进程都用拥有自己的进程资源(比如进程映射表,还有其他的一些资源),此外还有进程的代码进程的数据,所以在多进程中,进程的切换是很麻烦的,因为你又要为下一个进程分配以上的这些资源。此时,人们会思考:可不可以依然保留着并发的优点,又能避免进程切换的代价呢?

从此,线程的概念由此诞生。

线程就是在同一个进程内执行的一段段指令,保留着并发优点又可以避免进程切换的代价。实质上就是进程的内存映射表不变而PC指针(指向当前执行代码)变化。

好了,现在为止,多线程的概念也说清楚了,简单来说,它就是既要像多进程那样并发执行,又能避免进程的切换代价。

上图也很好地说明了线程和进程的区别,进程拥有很多资源,而进程里面有一个或以上的线程,这些线程共享进程的资源和数据,线程是程序执行的最小单位。其实,真正底层是CPU去调度线程执行的。

我们最后举一个简单的例子说明一下进程和线程,我们平时上网用的谷歌浏览器就是一个进程,进程内有很多线程,线程A用来从服务器接受数据,线程B用来显示文本,线程C用来处理图片,线程D用来显示图片。这些线程并发执行,因为网络传输是很耗时的IO操作,例如服务器内的图片很大而文本很小,当前正在下载服务器上的图片,如果浏览器此时下载很大的图片然后再去下载很小的文本然后再显示的话,而下载图片资源是比较久的,那么在图片下载完毕之前的网页是空白白的一片的,这样既效率低而且用户体验极差!因此它里面有许许多多的线程在并发执行。这些线程都要共享资源,这些资源是属于进程的资源,比如,把接收到的数据放到地址为100处,显示数据的时候又要从100处读出来,又比如,所有的文本、图片显示在同一个屏幕上,因此线程也共享了属于该进程的显存资源。

这一节,我们讲述了多进程的问题、从多进程到多线程的诞生、多线程的概念。而线程又分用户级线程和内核级线程,用户级多线程的实现和内核级线程的实现又有所不同。

各位读者大人若有问题,欢迎后台留言交流提问,我们将第一时间回复!IT界的泥石流与你们共成长!

下一节,我们将先为大家讲述用户级线程的概念、用户级多线程切换的底层。

欢迎关注我们的微信公众号:IT界的泥石流

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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