linux进程和线程的区别,ps -ef 丨 grep怎么看进程号
- 开发语言
- 2023-09-17
- 187
各位老铁们好,相信很多人对linux进程和线程的区别都不是特别的了解,因此呢,今天就来为大家分享下关于linux进程和线程的区别以及ps -ef | grep怎么看进程...
各位老铁们好,相信很多人对linux进程和线程的区别都不是特别的了解,因此呢,今天就来为大家分享下关于linux进程和线程的区别以及ps -ef | grep怎么看进程号的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
linuxtop查看的是进程还是线程
top命令每一行显示的是一个进程,加上-H(Threadstoggle)的后缀显示的才是线程。
linux如何停止线程
杀死线程所在的进程就可以,psaux|grep进程名kill-TERM进程号如果你指的写程序,那就参考manpthread_exit。
《Linux就该这么学》里有相关介绍,建议看看。
linux什么时候调度线程
那情形可多了去了。
正常情况下,定时器中断到来的时候,如果当前进程时间片用尽,就要调度;其他中断到来的时候,要进行调度,陷入内核;进程主动要求调度的时候(如fork新线程、睡眠等等),要进行调度;程序运行产生异常,无法继续运行,内核处理完异常恢复运行也要进行调度。还有其它各种情况,我一时也无法总结全,总之,内核“一言不和”就要进行调度……Unix和Linux操作系统有什么区别
说Unix是操作系统的鼻祖一点都不为过,Linux可以说是在Unix下创新发展而来。他们有很多共同的地方,也有很多不同的地方。
1、Unix和lLinux的历史渊源Unix和Linux两个系统都是起源于个人兴趣爱好,只是时间先后不同而已。
①、Unix系统渊源
Unix操作系统是由肯?汤普森和丹尼斯?里奇这两位大神发明的,他们被称为Unix之父。但是他们发明这个Unix的起因,却让人出乎意料。仅仅是因为自己写的游戏“StarTravel”无法玩了。因为当时贝尔实验室研发Multics系统已经宣告失败。所以,这位大神就找了一台报废很久的老爷机PDP-7小型机。注意,这个报废小型机和我们现在的小型机完全不是一个概念。这个小型机有1个房间那么大。他不仅在这台机器上开发出了操作系统,还将自己的游戏重写了一遍。现在很多年轻人都玩游戏,但是,有多少人像他那么执着呢?为了玩个游戏,自己开发个系统。
至于丹尼斯?里奇则是因为发明了C语言编程工具,终结了汇编编程的时代。于是在1973年,Unix系统用C语言进行重写。使得Unix系统可移植性大大提高。所以才说是这位两位大神创造了Unix系统。
②、Linux系统渊源
而Linux操作系统的起源则和Unix有关系。它是由李纳斯?托瓦兹在读大学的时候编写出来的。他之所以要开发linux系统,是因为它觉得教学用的Unix太难用了。于是就参考unix系统的特点和功能,开发了一个Linux系统。于1991年9月发布,当时只有10000行代码。功能基本和Unix是相似的,但重点是他毫无保留的将自己的成果和大家分享,并邀请大家一起完善Linux。这为Linux后来发展奠定了良好基础。所以
2、Unix和Linux系统的区别要说Unix和Linux的区别,其实从渊源关系就大致能窥探一二。
①、硬件捆绑不一样
Unix系统因为开发较早,在哪个年代的计算机,系统和硬件的捆绑程度都非常高。所以,Unix系统也和硬件捆绑很高。从它衍生的系统就可以看出来:
IBM公司AIX系统,一直发展到现在,依然只能在IBM的Power架构CPU上运行。非常有局限性。这也间接导致了小型机的发展速度跟不上X86。HP公司的HP-UX系统,同样只能在HP的PA-RISC架构的CPU上运行,英特尔为了HP的市场,单独为它开发了一款安腾的CPU系列。但还是因为局限性太高,最后英特尔放弃了安腾cpu。Sun公司的Solaris系统,这算是一个比较厉害的衍生系统。它不仅支持自家公司的SPARC架构的CPU,还支持X86的CPU。当然这是Sun公司为了大家更好的掌握Solaris系统而定制的。本来是个好方法,然而还是抵不过Linux开源发展的快。FreeBSD系统,这个系统算是一个非常稳定的Unix版本,它有点学习Linux的开源方法,它在BSD许可协议下,允许任何人在保留版权和许可协议信息的前提下,随意使用和发行。所以,它至今还衍生了很多优秀的系统出来。比如,苹果公司的OSX就是基于FreeBSD开发而来,而据说,很多网络交换机也是在这个系统基础上开发而来。Linux系统则不同,和硬件捆绑没有那么紧密。不仅可以运行在X86上,也可以运行各大厂家的小型机上。因为主要还是它的开源特性,它让全世界无数的开发人员不断为期改良和扩展新特性。免费使用让很多人愿意去使用它,发现问题,解决问题。最后,也就形成了Linux的快速发展。在linux上也衍生了很多版本的Linux出来,比如大家熟知的:RedHat,Centeros,Ubuntu,安卓等等。
②、开源和闭源的区别
Unix系统一开始就属于闭源系统,从它这里衍生出来的大部分优良操作系统都掌握在大公司IBM、HP、Sun等公司手里,他们开发改进这些Unix系统,并捆绑在硬件上。只为了卖更多钱。除了操作系统卖钱,操作系统上的高可用组件、虚拟化组件等新特性都可以卖钱。还有,操作系统用上后还得用一些生态软件才能保障业务系统运行,这些生态软件又可以卖钱。这些都可以带来巨大的商业利益,所以,早些年IBM、HP、Sun可以说是赚的盆满钵满。用躺着赚钱来形容一点都不为过。
也正是这种躺着赚钱的日子太舒服了,所以,谁都不愿意割自己的肉将自己的系统免费开源出来。这就导致了Unix系统渐渐固步自封,直到Linux和X86飞速发展威胁到生存了,他们才意识到这个问题。IBM开始开放Power架构,组建了OpenPower联盟,但这也只是开放Power架构,Unix依然不舍得开放源代码。
Linux则不同,从它诞生的那一刻起就被李纳斯?托瓦兹开源出来,免费使用,让大家来共同参与改进。到目前为止,Linux内核还属于李纳斯?托瓦兹的代码已经不足2%。大部分都是后期开发者改进优化出来的了。更新换代可谓是日新月异。
Linux系统不仅自己开源,还带动了一大批基于Linux系统的生态软件开源。现在很多开源社区开源软件基本也是基于Linux开源系统的。因为Linux的带动,现在开源软件可以说是百花齐放,基本可以覆盖闭源软件的大部分软件了。这也为Linux生态发展加快了进程。
3、Unix和Linux系统的相同点因为Linux是在Unix系统上发展起来的,它们有很多的共同点。Linux甚至被大家叫做“类Unix系统”。Unix有的功能,Linux都有。他们拥有共同的系统架构。
两家操作系统的架构都是分为3层:内核层、Shell层和应用层。
内核层主要跟硬件打交道,它负责管理和控制计算机系统的所有硬件资源。并为Shell层组织各个命令进程的运行,从而更好的利用硬件资源为用户服务。Shell层则是直接跟用户进行交互的界面。用户只需要打开一个Shell命令行界面(当然系统启动会自动启动一个默认的Shell),就可以和用户计算机进行交互。用户在Shell里输入命令,Shell就会将用户输入的命令准确的解释成机器需要执行的动作。然后交给内核去处理。应用层是额外附加的各种扩展应用软件。在我们装unix或者linux系统时,里面都有不少系统附加组件。这些组件都是应用层的软件。比如对于新手最喜欢装的CDE、Gnome图形桌面都属于应用层软件。既然架构都一样,执行效率自然也就不相上下,只要内核优化得好。Linux效率不比Unix差。图形界面这是两家都存在弱点。不过,一般服务器操作系统应该都可以不要图形。作为桌面实用的Linux还是得装一个图形。
4、和windows的区别Unix和Linux系统有共同的渊源。但和Windows却有很大的区别。
首先就是图形化,windows是从DOS批处理系统发展而来。是图形化操作系统公认做的最厉害的操作系统。所以,优秀的图形化是和linux系统最大的区别。在winows系统中,到处都是所见即所得的理念,你无需掌握任何命令就可以使用windows。也正是比尔盖茨这个理念,让全世界计算机普及起来。其次就是易用性,windows的易用性无可挑剔,能帮你精简的,系统都帮你精简了。你只需要识字会看,会敲键盘或鼠标基本就可以操作电脑了。而Linux系统不行,你还是必须掌握一些常用的命令。哪怕是你用了图形界面,依然很多操作需要在命令行下执行才是最有效的。有些配置还必须要通过修改文件,执行命令来完成。最后就是维护性,windwos的维护性也是非常强大,小问题方面基本不影响使用。如果真的出现了影响的问题,神奇的三个键Ctrl+Alt+Del就可以重启帮你解决大部分问题。而Linux系统恰恰相反,你最好不要随便重启。尤其是长期24小时运行的服务器系统。机器本来运行是好好的,你的重启可能导致系统起不来。虽然windows有很多这些优越性,但因为加载了图形和大量的自动处理。就导致了windows系统占用资源比较多。大家都知道Linux系统几百兆内存都跑的很溜,windows相比Linux可能就跑的比较吃力。而且,图形化比较容易奔溃,所以小问题比较多。所以,最终Linux和Unix服务器端使用比较多,windows则基本统治了桌面端。
总结总之,Linux和Unix系统不仅有共同的渊源,也有一些不同之处。历史的发展,导致开源的Linux系统飞速发展,大有替代Unix的势头。而windows虽然统治桌面端,但也正在积极扩大服务器端市场。
我是数智风,以上是我的粗浅认识,可供参考。如果觉得有帮助,欢迎关注评论。
Linux多线程通信
PIPE和FIFO用来实现进程间相互发送非常短小的、频率很高的消息;
这两种方式通常适用于两个进程间的通信。
共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据(配合信号量使用);这种方式通常适用于多进程间通信。
其他考虑用socket。这里的“其他情况”,其实是今天主要会碰到的情况:分布式开发。
在多进程、多线程、多模块所构成的今天最常见的分布式系统开发中,socket是第一选择
。消息队列,现在建议不要使用了----因为找不到使用它们的理由。在实际中,我个人感觉,PIPE和FIFO可以偶尔使用下,共享内存都用的不多了。在效率上说,socket有包装数据和解包数据的过程,所以理论上来说socket是没有PIPE/FIFO快,不过现在计算机上真心不计较这么一点点速度损失的。你费劲纠结半天,不如我把socket设计好了,多插一块CPU来得更划算。另外,进程间通信的数据一般来说我们都会存入数据库的,这样万一某个进程突然死掉或者整个服务器死了,也不至于丢失重要数据、便于回滚到之前的状态。从这个角度考虑,适用共享内存的情况也更少了,所以socket使用得更多。再多说一点关于共享内存的:共享内存的效率确实高,但它的重点在“共享”二字上。如果的确有好些进程共享一大块数据(如果把每个进程都看做是类的对象的话,那么共享数据就是这个类的static数据成员),那么共享内存就是一个不二的选择了。但是在面向对象的今天,我们更多的时候是多线程+锁+线程间共享数据。因此共享进程在今天使用的也越来越少了。不过,在面对一些极度追求效率的需求时,共享内存就会成为唯一的选择,比如高频交易系统。除此以外,一般是不需要特意使用共享内存的。另外,PIPE和共享内存是不能跨LAN的
(FIFO可以但FIFO只能用于两个进程通信)。
如果你的分布式系统随着需求的增加而越来越大所以你想把不同的模块放在不同机器上而你之前开发的时候用了PIPE或者共享内存,那么你将不得不对代码进行大幅修改......同时,即使FIFO可以跨越LAN,其代码的可读性、易操作性和可移植性、适应性也远没有socket大。这也就是为什么一开始说socket是第一选择的原因。最后还有个信号简单说一下。请注意,是信号,不是信号量。
信号量是用于同步线程间的对象的使用的(建议题主看我的答案,自认为比较通俗易懂:semaphore和mutex的区别?-Linux-知乎
)。信号也是进程间通信的一种方式。比如在Linux系统下,一个进程正在执行时,你用键盘按Ctrl+c,就是给这个进程发送了一个信号。进程在捕捉到这个信号后会做相应的动作。虽然信号是可以自定义的,但这并不能改变信号的局限性:不能跨LAN、信息量极其有限
。在现代的分布式系统中,通常都是消息驱动:
即进程受到某个消息后,通过对消息的内容的分析然后做相应的动作。如果你把你的分布式系统设置成信号驱动的,这就表示你收到一个信号就要做一个动作而一个信号的本质其实就是一个数字而已。这样系统稍微大一点的话,系统将变得异常难以维护;甚至在很多时候,信号驱动是无法满足我们的需求的。因此现在我们一般也不用信号了。因此,请记住:除非你有非常有说服力的理由,否则请用socket。
顺便给你推荐个基于socket的轻量级的消息库:ZeroMQ。Linux系统和Windows系统本质上的区别是什么
一、就操作系统设计的复杂度上,windows要超过Linux
如果windows抛弃人机操作的窗口界面,其性能并不比linux差;
编写Web浏览器的难度要远大于编写Web服务器的难度;
二、为何大公司喜欢用linux
1、免费且开源,相对于免费,开源更加重要;
2、开源意味着更安全;
3、开源意味着可优化;
因为开源所以透明,因为透明,所以安全,但安全是相对的。
所谓的安全是针对大公司,是针对那些真正懂linux内核的人。他们可以自己定制化linux,比如加入自己特性化的功能,修改潜在的漏洞,或者他们认为需要完善的地方,甚至可以调优linux来解决自身业务的瓶颈。
透明是把双刃剑,对那些只会linux命令的人,开源并不意味着安全,因为你根本搞不清楚自己使用的机器是否被控制,如果别人给你一个内核中藏有木马的linux,那么恭喜你,你可能永远都会沉浸在自己幻想的所谓安全中。
换句话说,如果windows开源了,那么windows对大公司是安全的,他们可以一窥windows内核,并对其增删改,去掉所有图形化元素,将动态加载驱动改为内核态加载,优化IOCP并将其发挥到极致,我相信windows也会变成安全、稳定、可靠、优秀的服务器,而且会比linux还要优秀。
但对于绝大部分在windows下做开发的程序员来说,windows开不开源其实跟你没有半毛钱关系,除非你有能力将windows上千万行的代码耐心看一遍,前提是你要能看懂。首先,你要把汇编语言再学习一遍,把操作系统的书多看几遍,把编译原理的书也多看几遍,否则这些代码在你面前和天书没本质区别;其次你要有足够的时间和足够耐心;最后,你要真能识别出风险,毕竟windows是最成熟的商业操作系统,如果你认为自己的智商能够超越微软那些顶级架构师几十年的精心设计和打磨,那你还改屁操作系统啊,直接进中科院设计国产OS为国增光吧。
记住:对别人的安全并不意味着对你安全!
开发后台程序和懂服务器、懂操作系统,完全是两个概念,这两者的差别就像狗和热狗的差别一样。在linux上开发java后台应用服务,并不意味着这个程序员有多了解linux,后台程序跑在Apache、Tomcat、Nginx这些真正的服务器上,这些服务器在帮你的程序优雅的处理高并发、高吞吐量和低延迟,而这些服务器必须要充分利用linux内核的性能,这就意味你要真正理解什么是多线程,什么是线程池,select、poll和epoll的区别;
三、在网络方面,windows的IOCP模型要优于linux的epoll模型
1、IOCP真正发挥了多核CPU的性能,让IO操作均衡的负载在不同CPU线程上,epoll很可能会让有的线程累死,有的饿死;
2、IOCP是Proactor异步IO,epoll是reactor同步IO;
打个不恰当的比方,IOCP属于导弹发射后不管,最后通知你击中目标;epoll属于发射后需要分阶段导航。有人说epoll给了程序员更高的自由度处理来自内核的IO数据,毕竟可以手把手的制导导弹,很有成就感,但那是针对高水品程序员,如果你的水平一般的话,那结果可能是灾难性的。很有可能你会亲手把发射的导弹送出地球,或者引发另一场战争。实际上IOCP在业务处理上的难度要大于EPOLL,因为异步IO的原因,你的上层完整的业务已被碎片化了。
3、windows比linux在服务器性能上的慢,并不代表IOCP比Epoll差,这是windows定位的问题,如果你要让用户易用,那就要在某些方面做些牺牲。
多说几句:
1、我特烦那些人云亦云,一知半解的人,言必谈linux好,说来说去就是那么几条:linux开源、安全、稳定。你看,很多大公司在用,windows还要经常打补丁,有时还崩溃。linux都特么开源了,等于人人都可以随时打补丁,人家偷偷打补丁还要让你知道么?如果自己代码写的烂,不管是linux还是windows,都一样的下场。合着linux就是专门为跑你的烂代码设计的,永远不崩溃跑不死么?
2、你要是觉得linux好,那就在linux上写代码、看小电影、上网聊天,最好不要在windows上办公。你一边用着windows,一边鄙视windows,端起碗来吃肉,放下碗就骂娘,有意思么?
3、你拿linux服务器方面的性能比windows服务器性能,拿长处比短处;你怎么不拿windows的人机交互和linux的人机交互做对比啊。当然这种装逼犯,肯定会自豪的说:我们大牛级猿就喜欢玩这种DOS命令行,你咋不复古去玩打孔卡片交互呢。你干嘛还用智能触屏手机,干脆腰上挂个BP机,左手小灵通,右手大哥大,不是更拉风么?
我特么明明能用打火机点着的,你非要给我给我展示一段钻木取火野外求生。说到底计算机、操作系统只是工具,怎么好用怎么好,不是让你噼里啪啦对着键盘一顿敲,自我感觉风骚的一比。我特么就问你:键盘敲出来的命令和鼠标点出来的命
关于linux进程和线程的区别的内容到此结束,希望对大家有所帮助。
本文链接:http://xinin56.com/kaifa/25636.html