关于进程和线程的若干问题
本帖最后由 z0000p 于 2016-1-6 08:49 编辑线程进程的问题,从哪开始讲?就从百度百科的解释开始吧,因为有人刚好提到了,线程在百度百科中的定义,LWP,light-weight process,就从这里说起吧
Unix和类Unix系统诞生之初只有进程的概念,是没有线程的概念的.就先说进程.进程是个什么东西?当你刚开始学习C语言的时候,有没有写过一个helloworld,当你点击编译运行的时候,屏幕上显示出helloword的时候,就是运行了一个进程,当你回车的时候,或者关闭窗口的时候这个进程就会退出,如果是在Linux下,没有输入语句会直接结束.但是切勿把进程和程序划等号.
当一个进程被执行的时候,系统会给他分配一个PCB(process control block 进程控制块)内存块,这块内存在内核空间中(一般情况下你是访问不到的内存区域),这块内存记录了启动的这个进程的所有信息,比如文件描述符表(STDIN/STDOUT/STDERR三个文件默认打开的,可以手动关闭)等一些参数,当进程结束的时候操作系统负责回收这块内存,除了PCB,系统还会映射地址空间给进程.这个进程能干什么?随意啊,三大控制结构,只要这个进程有权限,你可以做任何你想做的事.
进程可以再开进程吗?答案当然是可以的,这个时候进程间就有了父子关系,但是每个进程都拥有自己的PCB和独立的地址空间,这就意味着,两个进程间的内存空间是不能直接相互访问的,除非通过系统的一些手段,父子进程也是这样吗?是的.
但是,随着对性能的要求越来越高,你想一下,每次启动进程程就要给他分配PCB,这是在内核空间进行的操作,操作系统要有多累?大大降低了性能,于是,线程就有了.
线程是进程的退化版本,产生一个线程的时候,操作系统是不会重新给他分配PCB的,他所用的所有资源都在产生他的这个进程里(一个程序的执行至少得有一个进程),如果这个进程同时产生了很多线程,那么这些线程间的东西都是可以直接访问的,不需要通过系统,所以线程被称作轻量级进程,他比进程的消耗要少很多.
我刚开是说进程不等于程序,因为一个程序可以起很多个进程,也可以起很多个线程,但至少得有一个进程
进程和线程有什么区别?从代码的角度来看,没有区别,都是代码,只不过在操作系统来看,进程归他管,线程归进程管
进程和线程有什么用?一个程序可以有很多个进程或是线程,这就意味着,在多核CPU上同一时刻可以同时执行两部分代码,加快了运算的速度,比如说,你要做一个矩阵运算,两个人同时算总比一个人把全部的数据都搞定要快吧.还有比如说,当你复制文件的时候,多线程会更快一些,因为同一时刻这个进程得到的CPU时间更多,就是抢占了更多的IO资源,这里我为什么没有说进程?你想,你复制同一个文件,总得告诉其他的进程你复制到哪了,免得别的进程再复制一次,对不对?但是,进程间数据同步实在是太麻烦了,每次都得经过操作系统,所以这里用线程比较好
什么时候用进程,什么时候用线程?我的回答是,都可以(我说的是在Linux下),看你的实际问题了
我该怎么用进程?怎么用线程?老老实实学习系统编程吧,别想一口吃成大胖子.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天,在群里突兀的看到有人发表关于进程和线程的若干问题,对对新人进行科普,于是饶有兴致的看下去,
但是问题来了
首先,科普者(下文称作A)提出问题,线程和进程主要是区分在不同环境下表达的同一个意思,问表达的是什么意思?
我(下文称作B)回答,独立运行的代码片断.现在想一下,对于CPU来讲线程和进程有区别吗?确实没有,二进制代码而已
A:是程序在执行的时候,会经过不同的顺序控制流程(一行一行的运行代码,if判断条件,选择条件式的部分执行),程序在执行的时候,会经过不同的顺序控制流程,那在什么地方说线程,什么地方说进程呢?
我没有回答,在这里表达我个人的观点,程序经过不同的控制流程和线程进程有关联?一个线程的程序有不同的控制流程,100和线程的程序同样有不同的控制流程,控制流程是对于程序逻辑来讲的,线程和进程是对于操作系统来讲的,完全不想关的两个部分非要往一起扯,于是我觉得我应该纠正一下.
B:你这样说就有问题了,线程是依赖于进程的,统一(同一)进程的子线程共享同一块内存,子线程间的内存空间是相互可见的
A:如果,你想表达程序在执行的时候,会经过不同的顺序控制流程,这个意思面对的是内存里面的,使用进程,如果,你想表达程序在执行的时候,会经过不同的顺序控制流程,这个意思面对的是将要送往内存执行的软件代码,则使用线程
看到这里我已经完全糊涂了,这哪是哪啊
A:当遇到if等条件判断结构的时候 ,它的运行就产生了变化,这时,程序到底是走哪里,这个走哪里的动作,就可以用线程这个词来表达
此时我算是明白了他想要表达什么意思,于是建议他换个词,把程序的执行流程成为路径,不要用线程这一个词来表达,这样更容易误导新人
A:内存的数据从哪里来,把软件要运行的数据从硬盘搬到内存里面
将要运行到哪个代码就去硬盘找相应的数据,搬到内存里面
那这一块搬到内存里面的代码就叫进程
内存下一步,要搬的代码是什么,就根据软件的线程来搬
也就是软件将要运行的代码
所以说,进程,线程都是同一个意思,一个是CPU将要运算的路径,一个是将要运输数据到内存的路径
此时我算是明白了,A完全不懂线程进程的基本概念,于是我建议他阅读Unix环境高级编程中的线程与进程相关章节,我的意思是希望他加强一下相关知识的理解(后来A说他不懂C只是对PHP有研究)
但是我却得到了回复, 说我不要太自私,共享我的知识,帮忙新人理解瓶颈,我想笑,真的,我已经说了在哪里可以找到非常详细的答案,我为什么还要在去浪费我的时间再去说一次,自己都不想动手去找解决问题的办法,甚至别人都已经告诉了办法在哪里还是不想动手的人,有什么资格让我再浪费我的时间?
此时A已经很不满了,说我打断了他的科普流程,我说,科普要在自己擅长的领域里,并且自己已经很清楚的情况下进行,(否则就是误导,这句话我没说,已经很给他面子了)
A,已经很不,满意了,于是我建议A继续科普,并且保证他科普的时候不再打断,我会把相关知识做成一个帖子,发到论坛上
再往后A就一直再说我的问题,期间我反驳了1次,翻了两页的记录A一直再说我的问题,不翻了
我谈谈对A的认识,心胸狭窄,虚荣心强,控制欲强,高傲.理由如下:我只是指出了他的错误,就事论事,他就很不乐意,面向新人做科普只不过是满足自己的虚荣心罢了,如果自己的知识容不得别人的反问你还讲什么?期间,我还被威胁了,A说,他随便调一些人我就得死,我知道,这个社会上有背景的人多的是,我丝毫不怀疑A说的话(怀疑也没用),但是,我长这么大还没有在别人的威严下低过头,如果你想找我的事,最好一击致命,如果你做不到的话,我劝你什么也别做,你会后悔的.A至少是个懂点技术的年轻人,我也是年轻人,大家都经历的是同一个阶段,各自的想法大同小异,你炫耀技术可以,但是你不要觉得你是权威
本人就是群里的ABC{:soso_e136:} 支持,看起来不错呢! 感谢楼主的分享~ 感谢楼主的分享~ 支持中国红客联盟(ihonker.org) 支持,看起来不错呢! 学习学习技术,加油!
页:
[1]