前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux笔记(17)| 线程基础

Linux笔记(17)| 线程基础

作者头像
飞哥
发布2020-11-25 10:12:35
4160
发布2020-11-25 10:12:35
举报
文章被收录于专栏:电子技术研习社

读者朋友们大家好,今天和大家分享的是Linux中的线程。线程有时也称为轻量级进程,是执行程序流的最小单元。

之前我们讲过Linux中的进程,那么线程和进程有什么联系和区别呢?如果是去面试Linux软件开发的岗位,很有可能会被问到这个问题,看你对进程和线程的了解。

有一句话叫做进程是资源分配的最小单位,线程是系统调度的最小单位。在操作系统里面,可以认为是有很多个任务(task)在“并行”执行,从宏观上来看是并行的,但是从微观上来看其实还是串行的,当然,这是对于单核来说。之前我们的单片机开发,写好代码之后就一直执行里面的代码,里面所有的代码都是按顺序依次执行的(当然,中断另当别论),比如我们有三件事情要做,那么肯定是先做第一件事,再做第二件事,最后做第三件事。

如果第一件事要花费的时间很长,那么就会一直占用CPU,导致另外两件事得不到及时响应。而在操作系统中是不一样的,由操作系统进行调度,每件事或者说每个任务只会执行一小段时间,可能是几个毫秒,然后CPU被分配给了其他任务,在快速切换中,看起来就像是几个任务在同时运行一样,而且各个任务可以很好地得到响应。当然,具体是怎么调度的这是一件比较复杂的事情,需要具体去分析。

讲了这么多,是想说其实线程和进程都是一个个任务(task),所以在操作系统看来,没有什么区别,在Linux当中,并没有严格区分进程和线程。但是他们还是有区别的。其中一个区别就是对于各个进程他们的资源是独立的,而各个线程之间资源是共享的。

比如说先定义了一个全局变量,然后调用fork函数创建一个子进程,然后在子进程里面对这个全局变量进行修改,然后分别在父进程和子进程中打印这个全局变量的值,就会发现在父进程里面还是原来的值,而子进程里面就是修改后的值。

之所以是这样,是因为刚开始fork出来的子进程确实和父进程几乎是一样的,子进程继承了父进程的东西,如果在子进程中只是访问原来父进程的资源,是没什么影响的,但是如果子进程企图修改父进程中原来的东西,那么就会发生写时拷贝(Copy On Write,简称cow),子进程拷贝一份副本,然后在副本上修改,也就是说不会修改原来父进程里的东西。从效果上来看,可以认为子进程刚开始和父进程一样,但是后来做的所有修改都和父进程没有关系,他们是相对独立的两个进程。

而线程不一样,主线程创建一个子线程后,子线程和父线程资源是共享的,其实是在他们的task_struct结构体里面,指针指向了同样的数据,因此,在一个线程里进行了数据的修改,在其他线程中访问的也是修改后的数据。

这就是进程和线程的一大区别。

总的来说呢,就是进程也好,线程也好,他们都是一个个的task_struct,对于操作系统调度来讲,它只管这个结构体,因此,操作系统并不是很区分进程和线程,它只是在各个task_struct之间调度。但是因为进程与进程之间资源不是共享的,线程与线程之间资源是共享的,我们可以根据这一点来选择使用多进程还是多线程来处理问题。

当然,他们还有一些区别,比如说从系统开销来说,fork是一个开销很大的系统调用,启动一个新的进程必须分配给其独立的地址空间。进程之间的通信比较麻烦,需要依靠一定的手段。线程在这些方面有一些优势。

这里只粗略的讲了线程的一些概念,以及和进程的关系和区别。到下一节里再来讲解一下线程里的更详细的一些知识。

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

本文分享自 电子技术研习社 微信公众号,前往查看

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

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

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