通俗易懂讲 linux
想要学Linux,但是自律性很差怎么办?
想要学Linux,但是自律性很差怎么办?
相信在看这篇文章的都是对linux系统所迷的志同道合的人,不管你是刚开始学,还是已经接触过一些linux的知识,下面的问题是你在学习linux所必须遇到的,若是没有的话那我只能说大神我服你了。下面我就作为一个过来人分享下我学习后的经验。
一、 无法摆脱Windows的思维方式
相信大家接触电脑的时候都是从windows开始,windows的思维方式已经根深蒂固。不过现在你已经打算开始学习linux了,就要忘记windows上的一些方式,不然的话在以后的学习中,你会觉得很烦躁,怎么常用的操作或者是快捷键都不能用了呢?这个时候你就呵呵了。Linux中最主要的是命令化,虽然现在的linux的很多发行版正在往界面化发展,但是命令依然是linux的主流,至少一些基础的命令你还是要会的,这样你在工作或者学习的时候才会达到事半功倍的效果。在linux中你要习惯没有界面和鼠标。
二、 养成linux操作习惯
这个与上面第一点摆脱windows的思维方式是相对的,就是要养成linux所独特的额习惯。
命令是要学习的,不一定学习所有的,在以后的使用中慢慢积累,常用的记熟就可以了。学习linux软件的安装方法,不会再像你之前点几下鼠标就可以将一个软件安装成功,习惯源码的安装方式。熟悉使用vi,gcc等编译器,这些都是强大的编译器,几乎可以代替你之前使用过的编译器。熟悉linux的文件系统,虽然说文件系统大同小异,但是每个代表的是什么意思,里面存储什么样的文件,因为这些以后你肯定会用到的,涉及到修改文件,这样你一看就知道在哪里,这样的话工作或者学习效率自然就提上来了。三、 怎么全是英文呢?崩溃。
不知道在看文章的你是否英语很好,学习这行如果英语不好,劝你从现在开始补吧,因为无论是参考资料还是解决问题都是涉及到一大推的英语,如果英语不好,那看起来就是相当苦恼的,一边打开着翻译词典,一边打开着技术文档,一会看的你就串行了,没有一点学习的欲望了。这样的生活绝对不是你想过的,而且这行对于技术的更新换代比较快,新东西大部分也都是英文,这样对于你学习新东西的效率也是很不利的。所以如果你现在英语不是很好,那么赶快补起来吧,每天学习几个单词,最好是有专门的软件,可以每天督促你学习,要是能学习些专业的英语的话,那样就更好了,你的工作效率或者说你的价值将会得到很大的提升。
四、 资料的选择
对于一个技术宅来说,资料是不可或缺的,无论是博客、网站、论坛、书籍等等,相信他都可以给你说出一大堆的。但是他的这些东西不全都是适合你自己的,论坛网站等一些还是可以的,一些书籍或者其他的一些资料,要看个人了,不是公认好的就是好的,适合你自己的才是最好的,对于新手来说,还是通俗易懂的比较好,这样不好打击你的自信心,所以还是先看一些基础的书籍比较好,这里呢我推荐下《Linux就该这么学》,这个也有专门的网站可以去查阅一些相关资料当初我就是从这本书看起的,刚开始看的时候觉得linux没有人们说的那么麻烦啊,前面一些简单的内容会让你感觉linux会很好学的,慢慢的领导你深入,一步一步的引导你,接着就是项目实战让你得到更大的提升。再之后如果觉得欠缺的可以去看下马哥或者老男孩的一些书籍都是可以的,不过开始的时候不建议直接去看,光厚度就吓趴下了。如果之后觉得学习的了,可以往底层或者应用网络发展,看下linux的源码也是不错的,看下内部都是怎么实现的,对于后面学习是很有帮助的。如果你选择的对的话,你会觉得学习是件很快乐的事。
五、 总结
总之,linux是一个功能强大,用途非常广泛的系统,如果你学好了,那么对于之后的学习和工作都是有很大的帮助的,你可以有很多的方向可以发展。不过我觉的这些都是在你学的基础上才可以做到的,必须要有自律性,学习也要有个规划,不能三天打鱼两天晒网那样;再者要学会考虑,技术这行,最重要的就是有自己的想法,利用想法才创造更大的价值。希望这些可以对初学者有所帮助!
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。