「UEFI」第24话 进程和线程的本质

作者: 谭玉刚分类: 计算机技术 发布时间: 2022-05-05 22:50:34 浏览:9978 次

「UEFI」第24话 进程和线程的本质

阿卡夏zero:
进程和线程其实对于cpu而言没有太大区别,都是一个task,真正有区别的地方是对于操作系统 两者最大的区别在于进程内存各自独立,操作系统给了他们看似独立的地址空间,而线程fork的时候不会对地址空间做复制,只会给每个线程一个独立的栈。在应用层看起来,就是一个进程A拥有全局变量a,如果fork产生进程B,那么A去将a+1,B中的a是不受影响的。而线程则不一样,两个线程其中任意一方对于非栈变量的操作,都会影响到另一方。操作系统只会给线程一个独立的栈,其余的内存都是共享的。 这带来的结果就是:1.线程开销更小,因为减少了很多的复制动作,会占用更少的操作系统的资源。如果有很多小任务,比如简单的打开下文件,那么创建和销毁线程需要的资源和时间更少 2.线程间同步更加简单,因为内存共享很多进程间难以做到的事情线程做起来很简单。 3.线程做复杂工作会带来意想不到的问题,根因还是线程间没隔离好,一个线程工作可能会影响到其他线程,而开发者可能很难关注到。 4.大型任务尤其是mem/IO相关任务,线程会带来意想不到的开销。线程共享地址空间,而内核中对于地址空间的操作必然是有序的,也就是说同一时间仅有一个线程能够完成。比如读取文件到缓冲区,这个对于操作系统而言步骤可能如下:获取地址空间锁,读取文件内容到buffer,释放锁。试想下如果有几千个线程都在频繁的做这种操作,那么锁的竞争就会格外激烈。 而且实际上进程的开销并没有那么大,操作系统会把进程间用户态的公有数据部分做共享处理,即多个进程实际使用的还是同一份,只有一个进程开始更改了这部分数据,那就把改动的部分复制一份给它,其先进程依旧使用原来的部分 内核态所有进程都是共享地址空间的,也就是说内核态只有线程没有进程 总体而言大家平时理解的线程是轻量级的进程这个说法并没有太大错误,线程和进程各有优势,线程开销小互相不做完全隔离,进程开销大一点隔离更好 要想了解更多可以看看内核fork的实现以及缺页处理部分

【回复】大佬,最近在学操作系统,学的很艰难,能推荐下学习方法么?
【回复】回复 @滑稽的小泡泡 :找一些边从零开始实际编写操作系统代码并且有配套讲解的书籍,边学边做,有了基本的概念后,再继续看一些理论的书和更大操作系统的代码;别看国内的书籍
此乃朕的江山:
无关的东西太多,希望能把篇幅用在关键的知识点上吧

【回复】回复 @懒人喜欢冬天 : 我听得不能再懂了,我自己就写了个OS,我只是在说我的感受而已
【回复】没有吧,都是必要的铺垫和比喻,你听不懂罢了,或者你就不是目标用户。
【回复】回复 @此乃朕的江山 :所以你不是目标听众啊
伐异:
进程是给操作系统 描述程序 所占用的资源(内存,程序资源)、 调度优先 等信息的存在内存的一块数据结构,线程是操作系统实际规划 执行载入内存的代码 的主体(也是存在内存的一块数据结构),操作系统基本上根据这两块数据结构的各类地址去执行和管理程序。 进程和线程还有很多区别,对于没把多线程编程搞懂的人来说,我觉得up这种类比的方式是很难让人理解的,我们用类比的方式去跟别人沟通,是建立自己本身已经接触并且掌握实际的多线程编程或者实际的操作系统代码逻辑的经验之上才成立的,如果没有实际的实践经验,再完美的类比,对于听者而言也只是模糊的纸上谈兵。计算机这个领域的技术,是那种必须接触实际代码的实践,有了切切实实的实践经验后,才能够去理解构建它本身的理论的领域。希望up的讲解,不要花太多时间讲类比(这种只有up自己和已经懂得的人才能够理解的类比),而是实际的代码展示和运行的效果,这样对初学者比较友好。

懂事先生:
前面电影片段看着看着跑神的有没有,完全不知道刚老师在说啥了~~

【回复】电影片段太长了,听着听着就看电影去了[辣眼睛]
夏且Official:
进程是分配系统资源的单位,线程是运行和CPU调度(分配CPU时间片这一资源)的单位

半条猫三条命:
进程和线程对于软件开发者都是模型,操作系统提供创建进程和线程的接口,程序员调用来让几坨代码同时跑,我的理解就是这样。进程模型是人抽象出来的,在linux中他们是结构体。 至于后来发展出来的线程间同步什么的是为了弥补线程间切换产生的数据不安全打的补丁,是需要看线程的底层,即时间片流转才能解释的。所以,进程只是个模型,理解的差不多就行了。能帮助你掌握并发程序的设计思路。 综上,我认为进程和线程模型只是帮助开发者更好地利用操作系统提供的接口实现并发的概念,它们本质是是几坨同时跑的代码(或者快速切换的),能够便于程序员管理他们软件用到的资源(内存,打开的文件什么的)。 非科班出身,编程只是爱好,有说的不对的地方请大家批评

三小只熊:
说了很多说不到点上,进程就是运行中程序的抽象, 一个线程就是该进程的其中一个栈和相关寄存器

GlasgowJSzhang:
封面:为了不让嘴巴运行流口水这个线程,搞了个抽烟的线程占用[妙啊]

计算机 C语言 操作系统 我的学习记录 EDK2 UEFI OS 编程开发 校园分享官第3期

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读