精华内容
下载资源
问答
  • Linux系统综述

    2020-03-03 11:05:10
    一.Linux系统的发源 1.Multics计划 ​ 上个世纪六十年代,那个计算机还没有很普及,只有少数人才能使用,而且当时的计算机系统都是批处理的,就是把一批任务一次性提交给计算机,然后就等待结果。并且中途不能和...

    一.Linux系统的发源

    1.Multics计划

    上个世纪六十年代,那个计算机还没有很普及,只有少数人才能使用,而且当时的计算机系统都是批处理的,就是把一批任务一次性提交给计算机,然后就等待结果。并且中途不能和计算机交互。往往准备作业都需要花费很长时间,并且这个时候别人也不能用,导致了计算机资源的浪费。

    为了改变这种情况,在1965年前后,贝尔实验室(Bell)、麻省理工学院(MIT)以及通用电气(GE)联合起来准备研发一个分时多任务处理系统,简单来说就是实现多人同时使用计算机的梦想,并把计算机取名为Multics(多路信息计算系统),但是由于项目太复杂,加上其他原因导致了项目进展缓慢,1969年贝尔实验室觉得这个项目可能不会成功,于是就退出不玩了。

    2.Unix的诞生

    Bell退出Multics计划之后,Bell实验室的那批科学家就没有什么事做了,其中一个叫做Ken Thompson的人在研发Multics的时候,写了一个叫做太空大战(Space Travel)的游戏,大概就是一个很简单的打飞机的游戏,但是这个游戏运行在Multics上。当Bell退出了Multics后,Thompson就没有了Multics的使用环境了,为了能够继续游戏,于是他花了一个月的时间写了一个小型的操作系统,用于运行Space Travel,当完成之后,Thompson怀着激动的心情把身边同事叫过来,让他们来玩他的游戏,大家玩过之后纷纷表示对他的游戏不感兴趣,但是对他的系统很感兴趣。

    因为MULTICS是“Multiplexed informtion and Computing Service”的缩写(多路信息计算系统),于是他们命名这个系统为:“UNiplexed Information and Computing Service”,缩写为“UNICS”(没路信息计算系统,与Multics相反)。后来大家取其谐音,就称其为“UNIX”了。

    这个时候已经是1970年了,于是就将1970年定为Unix元年,因此计算机上的时间就是从这一年开始计算的。

    后来Unix这个小操作系统就在Bell实验室内部流行开,并经过不断地改良最终在1974年7月Unix发展到第5个版本,Bell实验室公开了Unix,结果引起了学术界的广泛兴趣并对其源码索取。所以,Unix第五个版本就以“仅用于教育目的”的协议,提供给各大学作为教学之用,成为当时操作系统课程的范例教材。各大学公司开始通过Unix源码对Unix进行了各种各样的改进和拓展1978年学术界的老大伯克利大学,推出了一份以第六版为基础,加上一些改进和新功能而成的Unix。并命名为BSD(Berkeley Software Distribution伯克利分发版),开创了Unix的另一分支:BSD系列。

    于是乎Unix就有了两个分支,一个就是BSD系列的分支,一个就是Bell本身发放的分支,当时因为Bell属于AT&T,AT&T受到了美国《谢尔曼反托拉斯法》的影响,不能销售除了电话机电报机等之外的商品,后来AT&T分解,Bell可以卖Unix了,Unix走向了商业化,如果想继续使用就需要购买授权,一份授权4万美元

    3.Minix及Linux的诞生img

    在Unix昂贵的授权费用下,很多大学不得不停止对其研究,老师导致上课也不知道讲什么了。在1987年荷兰有个大学教授安德鲁写了一个Minix,类似于Unix,专用于教学。当Minix流传开来之后,世界各地的黑客们纷纷开始使用并改进,希望把改进的东西合并到Minix中,但是安德鲁觉得他的系统是用于教学的,不能破坏纯净性,于是拒绝了

    在1991年9y月17日,Linus Torvalds(林纳斯.托瓦兹)在互联网上公布了自己写的Linux,可能是表达对安德鲁的不满吧(为什么不接受大家的好意呢?你让大家的满腔热情往哪放呢?),于是Linus发布了一个帖子,大概就是说:我写了一个操作系统的内核,但是还不够完善,你们以任何姿势使用不收费,也可以帮助我一起修改。帖子发出后引起了强烈的反响。在大家的努力下,于1994年Linux的1.0版本正式发布

    为什么会引起这么强烈的反应呢?这就要从了另一个人说起,那就是Richard Stallman(自由软件之父)。Stallman是一个非常“激进”的人,因为Unix商业化的影响,他认为软件是全人类的智慧结晶,不应该为某一家公司服务。在八十年代,他发起了自由软件运动,吹起了共产主义的号角(发起了GNU运动),并发布了软件界的共产主义宣言(GPL协议),并且这一运动得到了很多人的认同。

    所谓自由软件就是指:自由使用、自由学习和修改、自由分发、自由创建衍生版。

    GNU的定义是一个递归缩写,就是GNU IS NOT UNIX。就是说Unix是流氓,我不是。有意思的是,GNU运动是上个世纪八十年代开始的,而那个时候Linux还没有诞生呢 ,所以Stallman宝宝心里苦啊,就在大家逐渐失去信心的时候,1991年Linus Torvalds带着他的Linux闪亮登场了,给GNU运动画了一个完美的句号。

    Linux为什么会引起如此强烈的反响呢?因为Unix有版权,爱好编程的狂热分子在研究Unix的时候很容易吃上官司 ,而Linux是遵循GPL协议的,可以免费使用,让黑客们尽情的施展(这里的黑客指那些技术大牛,不是指那些利用计算机干坏事的人)。于是Linux提供内核(kernel),GNU提供外围软件,就这样GNU/Linux诞生了

    所以,看到这里你就会了解到Unix是1970年出现的,Linux是1991年发布的,但Linux是不同于Unix的操作系统。

    注解:

    1.FSF:Linux为什么会引起如此强烈的反响呢?这就要从另一个人说起,那就是 Richard Stallman。Stallman不仅是一个程序员,还是一名有思想的社会批评家。他认为将UNIX变成一个公司专有的商业化的操作系统是对他作为一个创造者的社会权利的限制。商业化的操作系统不允许对其进行共享或修改,不仅反社会,而是不道德、错误的。而这种问题的解决方案就是从头开始编写UNIX下的软件,并且可以自由发行。

    1984年1月,Stallman从麻省理工人工智能实验室辞职,投身于该项目,短时在间内,他吸引了一批程序员。在1985年,他们启动了一个称为自由软件基金会(Free Software Foundation,FSF)的组织。Stallman的指导原则是:“计算机用户应该能够自由地修改软件以适应自己的需求,并且可以自由地分享软件,因为帮助他人是基本的社会责任”。

    2.GNU:因为任何计算机的核心都是操作系统,所以Stallman为FSF指定的第一个目标就是创建一个能够自由共享并可以被任何人修改的操作系统。为了使新操作系统能够自由发行,Stallman意识到操作系统必须从头开始编写。

    为了能够平稳地融入到当时流行的编程文化中,因此Stallman决定新的操作系统应该与Unix兼容,也就是说它看上去就像Unix一样,并且能够运行Unix程序。按照他曾经工作过的编程社区的传统,Stallman为还没有构建的操作系统齐了一个古怪的名称:GNU。

    GNU是一个递归缩写,就是GNU IS NOT UNIX。就是说Unix是流氓,我不是。

    3 GPL:GNU自己的内核Hurd,因为理念太先进了,研发进度很缓慢。但是,FSF的程序员们经过勤奋工作,创建了大量的兼容于Unix系统的开放源代码的软件。例如,文本编辑器(Emacs)、C编译器(gcc)、C++编译器(g++)、调试器(gdb)、Unix shell(Bash)、……。

    在1980年代后期,Stallman在创建自由软件方面已经积累了一定的经验,他认为如果要创建一大批的自由软件,那么它需要一个合适的许可证协议,并在这个许可证协议下发行该软件。为了这个目的,他提出了非盈利版权(copyleft)这一理念。为了实现非盈利版权这一思想,Stallman提出并编写了通用公共许可证(general public license、GPL),并于1989年发布。

    GPL的核心是:在软件上应用GPL协议后,任何人可以发行该软件、查看源代码、修改该软件并发行修改后的软件。此外,GPL协议要求任何重写发行软件(包括修改后的版本)的人,都不能剥夺软件的自由使用或者添加自己的限制。

    4.FreeBSD、OpenBSD以及NetBSD
    我们已经知道:从1991年Linux发布了Linux 0.01起,Linux成了了自由软件的主流,那么,在商业化道路上的Unix是否有可自由共享的版本呢?答案是显而易见的。

    BSD是1980年代两大Unix主流之一(另一是System V)。BSD是加利福尼亚大学伯克利分校计算机科学系开发的,自1980年起,由计算机科学研究小组(Computer Science Research Group,CSRG)管理与开发。

    1980年代末,BSD酷爱者开始对AT&T公司对Unix的商业化运作感到不满。基于这一原因,CSRG制定了一个目标:完全重写所有基于AT&T公司的BSD部件。这样可以使BSD摆脱AT&T的法律制约。
    1989年,CSRG提供了第一个全部开放源代码的BSD发行版——Networking Release 1(更正式的称号是4.3BSD NET/1)。NET/1包含了很多独立自主的网络工具,但是系统并不是完全独立的(也就是包含了UNIX的代码)。

    1991年,CSRG发行了一个新颁布的BSD——NET/2。除了6个内核文件外,BSD中的所有内容都完全属于自己了。

    1992年,Bill Jolitz重新编写了最后6个有问题的文件,并为PC创建了一个新版本的BSD。他将这个操作系统称为386/BSD,并且开始通过Internet发行。伯克利分校的圣神目标——一个与AT&T公司UNIX无关的操作系统实现了。最终,BSD可以在全球作为开放源代码的软件自由发行。

    在很短的时间呢,386/BSD流行起来,而且维护它的人数日益递增。但是,Jolitz拥有一份全职工作,他没有时间处理所有提交的补丁和增强。基于这一原因,一组志愿者接管了这项工作。该小组所做的第一件事就是将该操作系统重命名为FreeBSD

    刚开始,FreeBSD只能运行在PC硬件上。有一些用户希望在其他类型的机器上运行BSD,因此人们成立了一个新的小组,该小组的目标就是尽可能地将FreeBSD移植到许多其他类型的计算机上,这个新小组提供的版本称为NetBSD

    1990年代中期,NetBSD小组又分出另一个小组,该小组主要关注安全和密码学问题。这个小组的操作系统称为OpenBSD

    可以看出,BSD的自由世界里只有3个主要的发行版:FreeBSD、NetBSD、OpenBSD。这与Linux世界差别很大。在Liunx世界里,差不多有数百个不同的发行版。

    BSD是完全的开源软件,也可以通过Internet自由发行,那么,为什么是Linux成为快速流行起来的Unix版本呢?

    原因有二:首先,Linux基于GPL协议发行,对Linux所做的任何事情都属于全世界。而BSD许可证没有GPL严格,在BSD许可证下,允许使用BSD创建新产品而不共享该新产品。所以,许多程序员喜欢使用Linux。Linux比BSD更成功的第二个原因在于Linux发行时机上。因为Linux Torvalds在1991年发行了Linux内核,而386/BSD直到1992年才发行,所以Linux在发行时间上占得先机。结果是,Linux吸引了大量正在焦急地等待全球第一个自由版本Unix的程序员。

    二:Linux系统的特点

    1.Linux优势总览

    稳定的系统:打个比方,安装Linux的主机连续运行一年以上不曾宕机、不必关机是很平常的事,我的windows系统今早打开时是黑屏,强行关机之后才恢复,原因不明

    安全性和漏洞的快速修补 :Linux有众多电脑高手在使用,所以维护者众多,更新维护很快,而windows则是所有人都会用,且不开源

    多任务,多用户 :你可以在一个Linux主机上规划出不同等级的用户,而且每个用户登录系统时工作环境可以不同,此外你还可以允许不同用户在同一时间登陆主机以使用主机的资源

    用户和用户组的规划 :在linux的机器上,文件可分为可读可写可执行三类(windows上也可以设置这些属性),此外,这些属性还可以分为三类:分别是文件拥有者、文件所属用户组、其他非拥有着与用户组者,这对于项目或者其他项目开发者具有良好的保密性

    相对较少的系统资源占用这是最吸引眼球的地方,目前市面上任何一款个人计算机都可以达到使用Linux搭建一个服务上百人以上的主机

    可定制裁剪,移植到嵌入式平台(如安卓设备)

    可选择的多种图形用户界面(如GNOME,KDE)

    2.Linux优势详解

    1.模块化程度高

    Linux的内核设计非常精巧,分成进程调度内存管理进程间通信虚拟文件系统网络接口五大部分;其独特的模块机制可根据用户的需要,实时地将某些模块插入或从内核中移走,使得Linux系统内核可以裁剪得非常小巧,很适合于嵌入式系统的需要。

    2.源码公开

    由于Linux系统的开发从一开始就与GNU项目紧密地结合起来,所以它的大多数组成部分都直接来自GNU项目。任何人、任何组织只要遵守GPL条 款,就可以自由使用Linux 源代码,为用户提供了最大限度的自由度。这一点也正投嵌入式系统所好,因为嵌入式系统应用千差万别,设计者往往需要针对具体的应用对源码进行修改和优化, 所以是否能获得源代码 对于嵌入式系统的开发是至关重要的。加之Linux的软件资源十分丰富,每种通用程序在Linux上几乎都可以找到,并且数量还在不断增加。这一切就使设 计者在其基础之上进行二次开发变得非常容易。另外,由于Linux源代码公开,也使用户不用担心有“后闸”等安全隐患。

    同时,源码开放给各教育机构提供极大的方便,从而也促进了Linux的学习、推广和应用。

    3.广泛的硬件支持

    Linux能支持x86、ARM、MIPS、ALPHA和PowerPC等多种体系结构的微处理器。目前已成功地移植到数十种硬件平台,几乎能运行在所有流行的处理器上。

    由于世界范围内有众多开发者在为Linux的扩充贡献力量,所以Linux有着异常丰富的驱动程序资源,支持各种主流硬件设各和最新的硬件技术,甚至可在没有存储管理单元MMU 的处理器上运行,这些都进一步促进了Linux在嵌入式系统中的应用。

    4.安全性及可靠性好

    内核高效稳定。Linux内核的高效和稳定已在各个领域内得到了大量事实的验证。

    Linux中大量网络管理、网络服务等方面的功能,可使用户很方便地建立高效稳定的防火墙、路由器、工作站、服务器等。为提高安全性,它还提供了大量的网络管理软件、网络分析软件和网络安全软件等。

    5.具有优秀的开发工具

    开发嵌入式系统的关键是需要有一套完善的开发和调试工具。传统的嵌入式开发调试工具是在线仿真器(In Circuit Emulator,ICE),它通过取代目标板的微处理器,给目标程序提供一个完整的仿真环境,从而使开发者能非常清楚地了解到程序在目标板上的工作状 态,便于监视和调试程序。在线仿真器的价格非常高,而且只适合做非常底层的调试。如果使用的是嵌人式Linux,一旦软硬件能支持正常的串口功能,即使不 用在线仿真器,也可以很好地进行开发和调试工作,从而节省了一笔不小的开发费用。嵌入式Linux为开发者提供了一套完整的工具链(Tool Chain),能够很方便地实现从操作系统到应用软件各个级别的调试。

    6.有很好的网络支持利文件系统支持

    Linux从诞生之日起就与Internet密不可分,支持各种标准的Internet网络协议,并且很容易移植到嵌入式系统当中。目前,Linux几乎支持所有主流的网络硬件、网络协议和文件系统,因此它是NFS的一个很好的平台。

    另一方面,由于Linux有很好的文件系统支持(例如,它支持Ext2、FAT32、romfs等文件系统),是数据各份、同步和复制的良好平台,这些都为开发嵌入式系统应用打下了坚实的基础。

    7.与UNIX完全兼容

    目前,在Linux中所包含的工具和实用程序,可以完成UNIX的所有主要功能。

    但由于Linux不是为实时而设计的,因而这就成了Linux在实时系统中应用的最大遗憾。不过,目前有众多的自由软件爱好者正在为此进行不懈的努力,也取得了诸多成果。

    三:Linux相比其他操作系统的优势

    1:系统运行稳定,性能高,高稳定性,适合7*24小时不间断的服务运行模式

    2:Linux 系统上有着大量的可用软件,且绝大多数是免费的,构建成本低廉

    3:Linux 系统有良好的可移植性,它几乎支持所有的 CPU 平台,这使得它便于裁剪和定制

    4:支持几乎所有的网络协议及开发语言

    四:Linux系统的应用范围以及前景

    1.从大方向Linux的不同应用领域来看

    1.作为企业服务器系统

    Linux虽然比Windows和Unix晚出现,但是目前已经占据了90%以上的市场,像BAT/TMD甚至微软官方门户网站都是使用的Linux系统。利用Linux系统可以为企业架构WWW服务器、数据库服务器、负载均衡服务器、邮件服务器、DNS服务器、代理服务器、路由器等,不但使企业降低了运营成本,同时还获得了Linux系统带来的高稳定性和高可靠性,且无须考虑商业软件的版权问题。目前Linux系统已经参透到电信、金融、政府、教育、银行、石油等各个行业,同时各大硬件厂商也相继支持Linux操作系统。

    2.嵌入式Linux系统应用领域

    这个领域对于大多数运维是不太熟悉的,因为这种Linux系统主要用作开发平台,举个例子:网络设备路由交换、防火墙的系统,专用的控制系统,比如自动售货机、手机、PDA、各种家用电器等,如果这些你不是很明白,那么安卓手机你一定知道,Android就是基于Linux开发来的。这个领域我们更多的看作是开发,而开发本很就是一个来钱快,耗精力的行业,个人认为这也是一个“看天赋”的行业,不是单纯编写几万行代码就可以弥补的,更多的是对算法、数据结构的认知和理解;可以是长久不衰的一个扬爷,但只适合少部分人。

    3.Linux在桌面领域的发展

    近年来,特别在国内市场,Linux桌面操作系统的发展趋势非常迅猛。国内如中标麒麟Linux、红旗Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,目前已经在政府、企业、OEM等领域得到了广泛应用。另外SUSE、Ubuntu也相继推出了基于Linux的桌面系统,特别是Ubuntu Linux,已经积累了大量社区用户。但是,从系统的整体功能、性能来看,Linux桌面系统与Windows系列相比还有一定的差距,主要表现在系统易用性、系统管理、软硬件兼容性、软件的丰富程度等方面。

    2.从技术领域来看(区块链-云计算-大数据-AI)

    1.云计算

    也是我最熟悉的,你可以将云计算看作**“运维**”技术的**“深耕”,关于云计算的概念可以自行百度,也可以看一下亚马逊对于云计算技术的定义与应用,但无论是亚马逊云、google云、阿里云几乎都是部署在Linux系统上**,再对硬件、软件资源的分配应用,说白了就是“你想要多少,我就给多少;不想要了就还回去,省钱省事”,最直接的一句话“如果你想成为一个牛X的云计算工程师,Linux必须且一定是你要学习的技术”。这里你一定要学会的技术:KVM、Docker、K8S、Openstack等,当然openstack一般是教学入门的最好云平台技术,有的公司会再做二次开发(例如华为的云计算认证)。

    2.大数据

    如果说云计算和企业业务息息相关,那么大数据和“用户”的生活无法分割,我相信大家都有过在某宝搜索一些商品,下次登录后“猜你喜欢”会有大量的相关链接的推荐,这就是大数据的魅力,基于Linux上部署hadoop、Spark这些服务,对互联网上额“数据”进行整理、分析、挖掘等等等等。

    3.AI人工智能和区块链

    这两个实际上主要是“开发”的层次,但是与“云计算”、“大数据”是息息相关的,但是底层上都是Linux为操作系统。

    展开全文
  • (一)Linux系统综述

    2019-09-18 23:25:49
    Linux内核overview 内核---->外包公司 系统调用子系统----->办事大厅----->请求资源的统一入口 进程管理子系统----->项目管理系统---->对执行中的项目进行生命周期的管理 内存管理子系统-----...

    Linux内核overview

    内核---->外包公司 

    系统调用子系统----->办事大厅----->请求资源的统一入口

    进程管理子系统----->项目管理系统---->对执行中的项目进行生命周期的管理

    内存管理子系统----->会议室管理系统---->对执行中的项目会议室管理(隔离,分配,回收)

    文件子系统----->档案管理系统----->对执行项目使用的文档资料进行管理

    设备子系统----->客户对交人员----->对项目的输入输出进行管理

    网络子系统----->对外合作部门----->跟其他公司沟通合作

    Linux基础命令行

     Linux基础系统调用

    进程管理:

    立项服务===创建进程===fork===

    子进程返回0 父进程返回子进程ID===父进程:继续原来的事情,子进程:请求execve来执行另一个程序===   

    程序猿策略:先拷贝,在修改

    内存管理:

    每个项目独立的会议室===进程内存空间

    项目计划书===代码段

    会议产生数据图纸===数据段

    会议数据存放===栈 堆 (上,下)

     

    写时复制:只有真的写入数据的时候,发现没有对应物理内存,才回触发一个中断,现分配物理内存

    brk===分配内存数量比较小的时候,和原来数据连在一起===原来区域旁边搬两把椅子

    mmap===会重新划分一整块区域===原来办公场地小,搬到大的

     

    文件管理:

    档案库管理===一切皆文件

      

     

    项目异常处理====信号处理

    当项目组收到信号的时候,项目组需要决定如何处理这些异常情况。

    忽略  执行默认动作  自定义信号处理函数(sigaction系统调用)

     

    项目组间沟通===进程间通信

    首先就是发个消息,不需要一段很长的数据,这种方式称为消息队列:

    msgget创建新队列----->msgsend将消息发送到队列----->msgrcv消息接收方获取

    交互信息比较大的时候,共享内存:

    shmget创建一个共享内存块----->shmat映射到自己内存空间读写

    但是,两个项目组共同访问一个会议室里的数据,就会存在“竞争”:信号量(灯)

     

    公司间沟通===网络通信

    不同机器的通过网络相互通信,要遵循相同的网络协议,也即TCP/IP网络协议栈

     

     

     

     

     

     

    展开全文
  • Linux操作系统综述你可以把Linux内核当成一家软件外包公司的老板快速上手几个Linux命令:每家公司都有自己的黑话 课程:趣谈Linux操作系统 你可以把Linux内核当成一家软件外包公司的老板 快速上手几个Linux命令:每...


    课程:趣谈Linux操作系统

    03-你可以把Linux内核当成一家软件外包公司的老板

    04-快速上手几个Linux命令:每家公司都有自己的黑话

    Linux命令简写和全称
    Linux常见命令缩写
    我的实验环境win10下的wsl,
    互通的环境:
    C:\Users\zhangjiequan-home\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\zjqroot

    cmd -h 查看简要帮助文档
    man cmd 查看详细帮助文档(man, manual pages,手册页)
    如 passwd -h;man passwd

    用户与密码

    passwd #Pass Word 改密码等,eg:passwd testname
    useradd #加用户 eg:user add testname
    su [username] #Swith user  切换用户 eg:su root, su testname
    

    Windows 10 WSL Ubuntu 系统的 root 密码
    cat /etc/passwd
    cat /etc/group

    浏览文件

    cd就是change directory,就是切换目录;
    cd .表示切换到当前目录;
    cd …表示切换到上一级目录;
    ls,list (win使用dir),可以列出当前目录下的文件。
    ls -a
    ls -l 用列表的方式列出文件

    # ls -l
    drwxr-xr-x 6 root root    4096 Oct 20  2017 apt
    -rw-r--r-- 1 root root     211 Oct 20  2017 hosts
    

    第一个字段的第一个字符是文件类型。如果是“-”,表示普通文件;如果是d,就表示目录。当然还有很多种文件类型,咱们后面遇到的时候再说,你现在先记住我说的这两个就行了。

    第一个字段剩下的9个字符是模式,其实就是权限位(access permission bits)。
    3个一组,每一组rwx表示“读(read)”“写(write)”“执行(execute)”。
    如果是字母,就说明有这个权限;如果是横线,就是没有这个权限。

    这三组分别表示文件所属的用户权限、文件所属的组权限以及其他用户的权限。例如,上面的例子中,-rw-r–r–就可以翻译为,这是一个普通文件,对于所属用户,可读可写不能执行;对于所属的组,仅仅可读;对于其他用户,也是仅仅可读。如果想改变权限,可以使用命令chmod 711 hosts(Change mode 改变模式)。

    第二个字段是硬链接(hard link)数目,这个比较复杂,讲文件的时候我会详细说。
    第三个字段是所属用户,第四个字段是所属组。
    第五个字段是文件的大小,第六个字段是文件被修改的日期,最后是文件名。你可以通过命令chown改变所属用户,chgrp改变所属组。

    安装软件

    原始的下载安装包安装的方式(rpm/dpkg)

    RPM:Red hat package manager
    dpkg:Debian package manage(是 Debian 的项目创始人 Ian Murdock 和他的妻子 Debra 的名字缩写。;是Linux的一个版本。;Debian 是一套为了您的计算机所设计的自由操作系统。Debian 使用 Linux 核心;但大部份的基本工具则来自 GNU 计划;)
    在这里插入图片描述
    类似win下的exe,可以下载rpm或者deb。这个就是Linux下面的安装包。

    为什么有两种呢?因为Linux现在常用的有两大体系,一个是CentOS体系,一个是Ubuntu体系,前者使用rpm,后者使用deb。

    在Linux上面,没有双击安装这一说,因此想要安装,我们还得需要命令。CentOS下面使用rpm -i jdk-XXX_linux-x64_bin.rpm进行安装,Ubuntu下面使用dpkg -i jdk-XXX_linux-x64_bin.deb。其中-i就是install的意思。

    查看已安装的软件

    在Linux下面,凭借rpm -qadpkg -l就可以查看安装的软件列表,-q就是query,a就是all,-l的意思就是list。
    如果真的去运行的话,你会发现这个列表很长很长,很难找到你安装的软件。

    从多个结果中找到你要的
    grep

    如果你知道要安装的软件包含某个关键词,可以用一个很好用的搜索工具grep

    rpm -qa | grep jdk,这个命令是将列出来的所有软件形成一个输出。| 是管道,用于连接两个程序,前面rpm -qa的输出就放进管道里面,然后作为grep的输入,grep将在里面进行搜索带关键词jdk的行,并且输出出来。grep支持正则表达式,因此搜索的时候很灵活,再加上管道,这是一个很常用的模式。同理dpkg -l | grep jdk也是能够找到的。

    more/less

    如果你不知道关键词,可以使用rpm -qa | more和rpm -qa | less这两个命令,它们可以将很长的结果分页展示出来。这样你就可以一个个来找了。

    我们还是利用管道的机制。more是分页后只能往后翻页,翻到最后一页自动结束返回命令行,less是往前往后都能翻页,需要输入q返回命令行,q就是quit。

    删除软件

    如果要删除,可以用rpm -e和dpkg -r。-e就是erase,-r就是remove。

    "软件管家"yum/apt

    yum,yellowdog updater modified 的缩写。yellowdog 是一个 Linux 的 distribution。
    apt,Advanced Packaging Tool

    搜索

    你可以根据关键词搜索,例如搜索jdk、yum search jdk和apt-cache search jdk(apt search jdk),可以搜索出很多很多可以安装的jdk版本。如果数目太多,你可以通过管道grep、more、less来进行过滤。

    安装

    选中一个之后,我们就可以进行安装了。你可以用yum install java-11-openjdk.x86_64和apt-get install openjdk-9-jdk来进行安装。

    卸载

    安装以后,如何卸载呢?我们可以使用yum erase java-11-openjdk.x86_64和apt-get purge openjdk-9-jdk。

    服务端地址

    Linux允许我们配置从哪里下载这些软件的,地点就在配置文件里面。

    对于CentOS来讲,配置文件在/etc/yum.repos.d/CentOS-Base.repo里。

    [base]
    name=CentOS-$releasever - Base - 163.com
    baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
    gpgcheck=1
    gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7
    

    对于Ubuntu来讲,配置文件在/etc/apt/sources.list里。

    deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
    

    注意改后需要执行apt update

    这里为什么都是163.com呢?因为Linux服务器遍布全球,不能都从一个地方下载,最好选一个就近的地方下载,例如在中国,选择163.com,就不用跨越重洋了。

    sed命令的使用

    Linux命令大全-sed命令
    Linux sed 命令

    使用sed更换apt源

    WSL-Ubuntu18.04 LTS 更换apt源为阿里源

    安装软件的本质

    其实无论是先下载再安装,还是通过软件管家进行安装,都是下载一些文件,然后将这些文件放在某个路径下,然后在相应的配置文件中配置一下。例如,在Windows里面,最终会变成C:\Program Files下面的一个文件夹以及注册表里面的一些配置。对应Linux里面会放的更散一点。例如,
    主执行文件:会放在/usr/bin或者/usr/sbin下面,
    其他的库文件:会放在/var下面,
    配置文件:会放在/etc下面。

    最原始的安装方式

    所以其实还有一种简单粗暴的方法,就是将安装好的路径直接下载下来,然后解压缩成为一个整的路径。在JDK的安装目录中,Windows有jdk-XXX_Windows-x64_bin.zip,这是Windows下常用的压缩模式。Linux有jdk-XXX_linux-x64_bin.tar.gz,这是Linux下常用的压缩模式。

    下载

    如何下载呢?Linux上面有一个工具wget,后面加上链接,就能从网上下载了。

    解压

    下载下来后,我们就可以进行解压缩了。Windows下可以有winzip之类的解压缩程序,Linux下面默认会有tar程序。如果是解压缩zip包,就需要另行安装。

    yum install zip.x86_64 unzip.x86_64
    apt-get install zip unzip
    

    如果是tar.gz这种格式的,通过tar xvzf jdk-XXX_linux-x64_bin.tar.gz就可以解压缩了。

    关于解压的相关命令的补充

    Linux 学习之创建、删除文件和文件夹命令
    六、Linux常用命令之压缩打包篇(gzip、gunzip、tar、zip、bzip2)
    1、gzip有两个特点:
    (1)、它只能压缩文件,不能压缩目录
    (2)、不保留源文件 newfile1.gz newfile1不在了
    看起来没什么用,过时的产物?
    gunzip和gzip是一对,压缩和解压
    2、tar

    tar -zcf filename.tar.gz ./* #压缩当前目录下的所有文件
    tar -zxvf ./filename.tar.gz -C ./b #解压在目录C下
    

    不产生后缀名,一般手动指定为*.tar.gz(用file a.tar.gz会有提示gzip compressed data,不指定后缀,无法通过ls直观看到文件类型)
    3、压缩解压命令zip (注意:该命令不自动产生后缀名,会保留源文件,用得最多的压缩命令,但不是自带,可以用sudo apt install zip等安装)

    zip services.zip /etc/services
    unzip services.zip -b ./disDic
    

    4、压缩解压命令:bzip2(不能压缩目录,但由于有-k选项,所以可以保留源文件)

    设置环境变量

    win上设置环境变量
    对于Windows上jdk的安装,如果采取这种下载压缩包的格式,需要在系统设置的环境变量配置里面设置JAVA_HOME和PATH。
    在Linux也是一样的,通过tar解压缩之后,也需要配置环境变量

    export(仅在当前命令行的会话中管用)

    可以通过export命令来配置

    export JAVA_HOME=/root/jdk-XXX_linux-x64
    export PATH=$JAVA_HOME/bin:$PATH
    

    export命令仅在当前命令行的会话中管用,一旦退出重新登录进来,就不管用了。

    .bashrc(每次登录都会执行)

    有没有一个地方可以像Windows里面可以配置永远管用呢?

    在当前用户的默认工作目录,例如/root或者/home/cliu8下面,有一个.bashrc文件,这个文件是以点开头的,这个文件默认看不到,需要ls -la才能看到,a就是all。每次登录的时候,这个文件都会运行,因而把它放在这里。这样登录进来就会自动执行。当然也可以通过source .bashrc手动执行。

    要编辑.bashrc文件,可以使用文本编辑器vi,也可以使用更加友好的vim。如果默认没有安装,可以通过yum install vim及apt-get install vim进行安装。

    运行软件

    我们都知道Windows下的程序,如果后缀名是exe,双击就可以运行了。

    通过shell在交互命令行里面运行

    Linux不是根据后缀名来执行的。它的执行条件是这样的:只要文件有x执行权限,都能到文件所在的目录下,通过./filename运行这个程序。当然,如果放在PATH里设置的路径下面,就不用./了,直接输入文件名就可以运行了,Linux会帮你找。

    这是Linux执行程序最常用的一种方式,通过shell在交互命令行里面运行。

    这样执行的程序可能需要和用户进行交互,例如允许让用户输入,然后输出结果也打印到交互命令行上。这种方式比较适合运行一些简单的命令,例如通过date获取当前时间。这种模式的缺点是,一旦当前的交互命令行退出,程序就停止运行了。

    这样显然不能用来运行那些需要“永远“在线的程序。比如说,运行一个博客程序,我总不能老是开着交互命令行,博客才可以提供服务。一旦我要去睡觉了,关了命令行,我的博客别人就不能访问了,这样肯定是不行的。

    后台运行

    于是,我们就有了Linux运行程序的第二种方式,后台运行。

    nohup

    这个时候,我们往往使用nohup命令。这个命令的意思是no hang up(不挂起),也就是说,当前交互命令行退出的时候,程序还要在。

    当然这个时候,程序不能霸占交互命令行,而是应该在后台运行。最后加一个&,就表示后台运行:

    nohup command &
    

    输出

    另外一个要处理的就是输出,原来什么都打印在交互命令行里,现在在后台运行了,输出到哪里呢?输出到文件是最好的。

    最终命令的一般形式为nohup command >out.file 2>&1 &
    解释一下其中新增的>out.file 2>&1
    这里面,“1”表示文件描述符1,表示标准输出,“2”表示文件描述符2,意思是标准错误输出,“2>&1”表示标准输出和错误输出合并了。合并到哪里去呢?到out.file里。

    关闭进程

    那这个进程如何关闭呢?我们假设启动的程序包含某个关键字,那就可以使用下面的命令。

    ps -ef |grep 关键字  |awk '{print $2}'|xargs kill -9
    

    从这个命令中,我们多少能看出shell的灵活性和精巧组合。

    其中:
    ps -ef:可以单独执行,列出所有正在运行的程序
    grep:上面我们介绍过了,通过关键字找到咱们刚才启动的程序。
    awk:工具可以很灵活地对文本进行处理,这里的awk '{print $2}'是指第二列的内容,是运行的程序ID。
    xargs kill -9:我们可以通过xargs传递给kill -9,也就是发给这个运行的程序一个信号,让它关闭。如果你已经知道运行的程序ID,可以直接使用kill关闭运行的程序。如使用ps -ef得到进程id为576,可使用kill -9 576来关闭这个进程。(一开始对这个xargs kill -9不懂,看了Linux中的管道和xargs之后,补充一下:xargs kill -9前面的一坨东东,其实就是得到了一个进程id,最后用xargs把id传给kill -9,效果是kill -9 ${id})

    以服务的方式运行

    在Windows里面还有一种程序,称为服务。这是系统启动的时候就在的,我们可以通过控制面板的服务管理启动和关闭它。
    在这里插入图片描述
    Linux也有相应的服务,这就是程序运行的第三种方式,以服务的方式运行。例如常用的数据库MySQL,就可以使用这种方式运行。

    例如在Ubuntu中,我们可以通过apt-get install mysql-server的方式安装MySQL,然后通过命令systemctl start mysql启动MySQL,通过systemctl enable mysql设置开机启动。之所以成为服务并且能够开机启动,是因为在/lib/systemd/system目录下会创建一个XXX.service的配置文件,里面定义了如何启动、如何关闭。

    在CentOS里有些特殊,MySQL被Oracle收购后,因为担心授权问题,改为使用MariaDB,它是MySQL的一个分支。通过命令yum install mariadb-server mariadb进行安装,命令systemctl start mariadb启动,命令systemctl enable mariadb设置开机启动。同理,会在/usr/lib/systemd/system目录下,创建一个XXX.service的配置文件,从而成为一个服务。

    即无论Ubuntu还是CentOS,用都是用systemctl启动和设置开机启动。

    (wsl下的Ubuntu不能用systemctl,启动可以用:

    sudo service mysql start
    

    开机启动暂时不知道怎么搞。
    解决Win10-Ubuntu子系统启动MySQL报错的问题
    System has not been booted with systemd as init system (PID 1). Can’t operate

    systemd的机制十分复杂,这里咱们不讨论。如果有兴趣,你可以自己查看相关文档。

    关机与重启

    最后咱们要学习的是如何关机和重启。这个就很简单啦。shutdown -h now是现在就关机,reboot就是重启。

    (wsl下重启:

    net stop LxssManager
    net start LxssManager
    

    关机自然是:

    net stop LxssManager
    

    ref:如何重启 Windows 10 子系统(WSL) ubuntu)

    小结

    在这里插入图片描述

    05-学会几个系统调用:咱们公司能接哪些类型的项目?

    其实Linux命令也是一个程序,只不过代码是别人写好的,你直接用就可以了。你可以自己试着写写代码,通过代码把Linux系统用起来,这样印象会更深刻。

    无论是别人写的程序,还是你写的程序,运行起来都是进程。程序使用的是系统调用,系统调用决定了这个操作系统好用不好用、功能全不全。下面介绍都有哪些”系统调用“:

    进程管理

    首先,我们得有个项目,那就要有立项服务。对应到Linux操作系统中就是创建进程。

    创建进程的系统调用叫fork。这个名字很奇怪,中文叫“分支”。为啥启动一个新进程叫“分支”呢?

    在Linux里,要创建一个新的进程,需要一个老的进程调用fork来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(Child Process)。

    当父进程调用fork创建进程的时候,子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份,甚至连程序代码也是拷贝过来的。按理说,如果不进行特殊的处理,父进程和子进程都按相同的程序代码进行下去,这样就没有意义了。

    所以,我们往往会这样处理:对于fork系统调用的返回值,如果当前进程是子进程,就返回0;如果当前进程是父进程,就返回子进程的进程号。这样首先在返回值这里就有了一个区分,然后通过if-else语句判断,如果是父进程,还接着做原来应该做的事情;如果是子进程,需要请求另一个系统调用-execve来执行另一个程序,这个时候,子进程和父进程就彻底分道扬镳了,也即产生了一个分支(fork)了。

    同样是“先拷贝,再修改”的策略,你可能会问,新进程都是父进程fork出来的,那到底谁是第一个呢?

    启动的时候先创建一个所有用户进程的“祖宗进程”。这个在讲系统启动的时候还会详细讲,我这里先不多说。

    有时候,父进程要关心子进程的运行情况,这毕竟是自己身上掉下来的肉。有个系统调用-waitpid,父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就知道子进程运行完了没有,成功与否。

    所以说,所有子项目最终都是老板,也就是祖宗进程fork过来的,因而它要对整个公司的项目执行负最终的责任。

    内存管理

    在操作系统中,每个进程都有自己的内存,互相之间不干扰,有独立的进程内存空间

    对于进程的内存空间来讲,放程序代码的这部分,我们称为代码段(Code Segment)

    对于进程的内存空间来讲,放进程运行中产生数据的这部分,我们称为数据段(Data Segment)。其中局部变量的部分,在当前函数执行的时候起作用,当进入另一个函数时,这个变量就释放了(栈?);也有动态分配的,会较长时间保存,指明才销毁的,这部分称为堆(Heap)

    一个进程的内存空间是很大的,32位的是4G,64位的就更大了,我们不可能有这么多物理内存。就像一个公司的会议室是有限的,作为老板,你不可能事先都给项目组分配好。哪有这么多会议室啊,一定是需要的时候再分配。

    所以,进程自己不用的部分就不用管,只有进程要去使用部分内存的时候,才会使用内存管理的系统调用来登记,说自己马上就要用了,希望分配一部分内存给它,但是这还不代表真的就对应到了物理内存。只有真的写入数据的时候,发现没有对应物理内存,才会触发一个中断,现分配物理内存。

    这里我们介绍两个在堆里面分配内存的系统调用,brkmmap

    当分配的内存数量比较小的时候,使用brk,会和原来的堆的数据连在一起,这就像多分配两三个工位,在原来的区域旁边搬两把椅子就行了。当分配的内存数量比较大的时候,使用mmap,会重新划分一块区域,也就是说,当办公空间需要太多的时候,索性来个一整块。

    文件管理

    程序、文档、照片等,哪怕Linux关机再开机也能不丢的,就需要放在文件系统里面。

    文件之所以能做到这一点,一方面是因为介质,另一方面是因为格式。公司之所以强调资料库,也是希望将一些知识固化为标准格式,放在一起进行管理,无论多少人来人走,都不影响公司业务。

    文件管理其实花样不多,拍着脑袋都能想出来,无非是创建、打开、读、写等。
    对于文件的操作,下面这六个系统调用是最重要的:

    • 对于已经有的文件,可以使用open打开这个文件,close关闭这个文件;
    • 对于没有的文件,可以使用creat创建文件;
    • 打开文件以后,可以使用lseek跳到文件的某个位置;
    • 可以对文件的内容进行读写,读的系统调用是read,写是write

    但是别忘了,Linux里有一个特点,那就是一切皆文件

    • 启动一个进程,需要一个程序文件,这是一个二进制文件
    • 启动的时候,要加载一些配置文件,例如yml、properties等,这是文本文件;启动之后会打印一些日志,如果写到硬盘上,也是文本文件
    • 但是如果我想把日志打印到交互控制台上,在命令行上唰唰地打印出来,这其实也是一个文件,是标准输出stdout文件
    • 这个进程的输出可以作为另一个进程的输入,这种方式称为管道,管道也是一个文件。
    • 进程可以通过网络和其他进程进行通信,建立的Socket,也是一个文件。
    • 进程需要访问外部设备,设备也是一个文件。
    • 文件都被存储在文件夹里面,其实文件夹也是一个文件。
    • 进程运行起来,要想看到进程运行的情况,会在/proc下面有对应的进程号,还是一系列文件。

    每个文件,Linux都会分配一个文件描述符(File Descriptor),这是一个整数。有了这个文件描述符,我们就可以使用系统调用,查看或者干预进程运行的方方面面

    所以说,文件操作是贯穿始终的,这也是“一切皆文件”的优势,就是统一了操作的入口,提供了极大的便利。

    信号处理

    在项目运行过程中,不一定都是一帆风顺的,很可能遇到各种异常情况。作为老板,处理异常情况的能力是非常重要的,所以办事大厅也一定要包含这部分服务。

    当项目遇到异常情况,例如项目中断,做到一半不做了。这时候就需要发送一个信号(Signal)给项目组。经常遇到的信号有以下几种:

    • 在执行一个程序的时候,在键盘输入“CTRL+C”,这就是中断的信号,正在执行的命令就会中止退出;
    • 如果非法访问内存,例如你跑到别人的会议室,可能会看到不该看的东西;
    • 硬件故障,设备出了问题,当然要通知项目组;
    • 用户进程通过kill函数,将一个用户信号发送给另一个进程。

    当项目组收到信号的时候,项目组需要决定如何处理这些异常情况。

    对于一些不严重的信号,可以忽略,该干啥干啥,但是像SIGKILL(用于终止一个进程的信号)和SIGSTOP(用于中止一个进程的信号)终?中?区别??是不能忽略的,可以执行对于该信号的默认动作。每种信号都定义了默认的动作,例如硬件故障,默认终止;也可以提供信号处理函数,可以通过sigaction系统调用,注册一个信号处理函数。

    提供了信号处理服务,项目执行过程中一旦有变动,就可以及时处理了。

    进程间通信

    消息队列(Message Queue)

    首先就是发个消息,不需要一段很长的数据,这种方式称为消息队列(Message Queue)。由于一个公司内的多个项目组沟通时,这个消息队列是在内核里的,我们可以通过msgget创建一个新的队列,msgsnd将消息发送到消息队列,而消息接收方可以使用msgrcv从队列中取消息。

    共享内存

    当两个项目组需要交互的信息比较大的时候,可以使用共享内存的方式,也即两个项目组共享一个会议室(这样数据就不需要拷贝来拷贝去)。大家都到这个会议室来,就可以完成沟通了。这时候,我们可以通过shmget创建一个共享内存块,通过shmat将共享内存映射到自己的内存空间,然后就可以读写了。

    信号量机制Semaphore

    但是,两个项目组共同访问一个会议室里的数据,就会存在“竞争”的问题。如果大家同时修改同一块数据咋办?这就需要有一种方式,让不同的人能够排他地访问,这就是信号量的机制Semaphore。

    这个机制比较复杂,我这里说一种简单的场景。

    对于只允许一个人访问的需求,我们可以将信号量设为1。当一个人要访问的时候,先调用sem_wait。如果这时候没有人访问,则占用这个信号量,他就可以开始访问了。如果这个时候另一个人要访问,也会调用sem_wait。由于前一个人已经在访问了,所以后面这个人就必须等待上一个人访问完之后才能访问。当上一个人访问完毕后,会调用sem_post将信号量释放,于是下一个人等待结束,可以访问这个资源了。

    公司间沟通与网络通信

    同一个公司不同项目组之间的合作搞定了,如果是不同公司之间呢?也就是说,这台Linux要和另一台Linux交流,这时候,我们就需要用到网络服务。

    不同机器的通过网络相互通信,要遵循相同的网络协议,也即TCP/IP网络协议栈。Linux内核里有对于网络协议栈的实现。如何暴露出服务给项目组使用呢?

    网络服务是通过套接字Socket来提供服务的。Socket这个名字很有意思,可以作“插口”或者“插槽”讲。虽然我们是写软件程序,但是你可以想象成弄一根网线,一头插在客户端,一头插在服务端,然后进行通信。因此,在通信之前,双方都要建立一个Socket。

    我们可以通过Socket系统调用建立一个Socket。Socket也是一个文件,也有一个文件描述符,也可以通过读写函数进行通信。

    好了,我们分门别类地规划了这么多办事大厅的服务,如果这些都有了,足够我们成长为一个大型跨国公司了。

    查看源代码中的系统调用

    你如果问,这里的系统调用列举全了吗?其实没有,系统调用非常多。我建议你访问https://www.kernel.org下载一份Linux内核源代码。因为在接下来的整个课程里,我讲述的逻辑都是这些内核代码的逻辑。
    (

    sudo lsb_release -a
    cat /proc/version
    

    ubuntu查看系统版本和linux内核版本)

    对于64位操作系统,找到unistd_64.h文件,里面对于系统调用的定义,就是下面这样。

    #define __NR_restart_syscall	  0
    #define __NR_exit		  1
    #define __NR_fork		  2
    #define __NR_read		  3
    #define __NR_write		  4
    #define __NR_open		  5
    #define __NR_close		  6
    #define __NR_waitpid		  7
    #define __NR_creat		  8
    ......
    

    中介与Glibc

    如果你做过开发,你会觉得刚才讲的和平时咱们调用的函数不太一样。这是因为,平时你并没有直接使用系统调用。虽然咱们的办事大厅已经很方便了,但是为了对用户更友好,我们还可以使用中介Glibc,有事情找它就行,它会转换成为系统调用,帮你调用。

    Glibc是Linux下使用的开源的标准C库,它是GNU发布的libc库。Glibc为程序员提供丰富的 API,除了例如字符串处理、数学运算等用户态服务之外,最重要的是封装了操作系统提供的系统服务,即系统调用的封装

    每个特定的系统调用对应了至少一个Glibc封装的库函数,比如说,系统提供的打开文件系统调用sys_open对应的是Glibc中的open函数

    有时候,Glibc一个单独的API可能调用多个系统调用,比如说,Glibc提供的printf函数就会调用如sys_open、sys_mmap、sys_write、sys_close等等系统调用。

    也有时候,多个API也可能只对应同一个系统调用,如Glibc下实现的malloc、calloc、free等函数用来分配和释放内存,都利用了内核的sys_brk的系统调用。

    小结

    学了这么多系统调用,我们还是用一个图来总结一下。
    在这里插入图片描述

    课堂练习

    有个命令strace,常用来跟踪进程执行时系统调用和所接收的信号。你可以试一下咱们学过的命令行,看看都执行了哪些系统调用。
    答:
    使用以下命令查看ls -la来跟踪这个命令执行时的系统调用和所接收的信号。

    strace ls -la
    

    执行后,得知有如下系统调用:
    execve
    brk
    mmap
    access
    open
    fstat
    mmap
    close
    read
    stat
    write
    lseek
    lstat
    getxattr
    socket
    connect
    mprotect

    展开全文
  • Linux操作系统综述

    2020-03-01 08:49:58
    哪有什么岁月静好,只..."硬件 + 操作系统"才算是我们通常说的电脑,以后的学习主要围绕linux系统,这个话题展开。我们首先必须承认操作系统的重要性。 想理解外包公司一样理解操作系统 刘超老师将操作系统类比成...

    特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料,本文大部分内容和所有图片来源于这个专栏。

    00、硬件组成

    对于一台电脑,拆开来看,有鼠标键盘、显卡显示屏、CPU、内存、硬盘、网卡…

    操作系统 - 连接硬件

    但仅有硬件组成的电脑,还不能直接使用。"硬件 + 操作系统"才算是我们通常说的电脑,以后的学习主要围绕linux系统,这个话题展开。我们首先必须承认操作系统的重要性。

    01、想理解外包公司一样理解操作系统

    刘超老师将操作系统类比成一家外包公司。确实很形象,加深了我对linux系统的理解。
    内核对于操作系统,相当于公司的老板,老板是不轻易干活的(一般有很多部门),所以linux系统中也有很多子系统。对应关系有:

    linux系统外包公司
    用户公司的客户
    内核公司的老板
    系统调用公司的办事大厅
    设备管理系统公司的客户对接和交付部门
    网络管理系统公司的对外合作部门
    进程管理系统公司的项目管理部门
    内存管理系统公司的会议室
    文件系统系统公司的档案室

    其他:程序相当于项目计划书进程相当于正在进行的项目

    操作系统 -各个子系统

    02、“点击QQ事件”

    为了更好的理解linux的运作机制,老师分析了"用户点击qq"事件。分为如下几个阶段

    阶段一:用户点击图标
    对于linux而言,驱动捕捉到用户点击事件,产生中断。cpu调用到驱动事先安排好的中断处理函数。

    对于外包公司而言,对接人员记录客户提出的需求,进行项目开发的计划。

    阶段二:系统加载进程
    对于linux而言,将qq的程序文件从硬盘加载到内存,内存上以进程启动。这个阶段需要思考几个问题:

    1. 硬盘上的文件如何管理?
    2. 内存空间上的进程如何管理?
    3. 多进程如何实现?
    4. 进程自身如何实现功能?

    硬件上的数据有文件系统进行统一管理;进程在内存空间上的映射由内存管理系统完成;多进程的实现通过进程管理系统;系统对进程提供统一的接口,实现核心功能。这层接口称为系统调用层

    对于外包公司而言,从档案库中取出项目计划书,成立项目组,划分会议室,完成立项的过程。然后执行项目,通过办事大厅处理业务,和各个部门打交道。这些都是动态的过程。之后就比较好理解了。

    操作系统 - 综述

    阶段三:进程调出对话框
    对于linux而言,进程调出显示对话框,进程->显卡驱动->显示界面

    对于公司,这里显卡驱动相当于客户的交付人员,项目组通过交付人员将项目的成果交付给用户。

    阶段四:用户操作输入框
    用户在输入框输入,字符立即显示,键盘驱动->进程->显卡驱动->显示界面

    对于公司,就是对接人员处理客户不断提出的需求–交付人员交付的过程

    阶段五:用户按回车发送
    对于linux系统,用户按下回车键,网络发送到远程的另一个用户,键盘驱动->进程->网卡驱动

    对于公司,有时候为了实现需求,需要与其他公司的交互,通过对外合作部门。

    03、最后

    作业: 找出linux源码中几个子系统所在的目录
    答案:https://www.kernel.org/
    
    - 系统调用 kernel/
    - 进程管理 kernel/, arch/<arch>/kernel
    - 内存管理 mm/, arch/<arch>/mm
    - 文件系统 fs/
    - 设备系统 drivers/char, drivers/block
    - 网络系统 net/
    
    展开全文
  • Linux实时文件备份系统综述.pdf
  • 文章目录linux VFS 虚拟文件系统综述目录条目缓存(dcache)Inode 对象文件对象VFS文件系统API和数据结构注册和安装文件系统struct file_system_type 结构文件系统类型mount()方法具有以下参数:fill_super() 回调实现...
  • 主要给大家介绍了关于linux系统下时间配置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 基于嵌入式Linux系统的图形用户界面综述.pdf
  • 而实际情况非常复杂,内核管理着非常多的设备:字符设备、块设备、网络设备,还支持许多类型的文件系统:ext2、ext3、ext4、fuse、ntfs等,另外还有很多的伪文件系统:proc、devfs、sys、debugfs等,特殊的节点类型:...
  • 1、什么是中断? 中断: 指当出现需要时,CPU暂时停止当前...中断在嵌入式软件中几乎不能离开它,你看到的几乎所有的芯片都有中断功能,不管是裸机程序STC89C51还是嵌入式Linux系统,还是其他的RTOS系统都有中断。 ...
  • 一、Linux内核基础白话 1. 在操作系统中,输入设备驱动其实就像客户对接员。有时候新插上一个鼠标的时候,会弹出一个通知安装驱动,这就是操作系统这家外包公司在配备对接人员。当客户告诉对接员需求的时候,对于...
  • Linux系统介绍--综述

    2017-11-20 16:11:38
    这这些年里面,Linux也有了长足的发展,是时候再次系统的对Linux进行重新学习了,所谓温故而知新,何况Linux本身也有很多新的变化。本系列博文将基于博主的这一篇博文中推荐的书籍为基础,结合一些网上的资料,对...
  • linux内核综述

    2016-08-11 22:01:21
    终于读完了Robert Love大师《linux内核设计与实现》,尽管有多处一知半解,但是仍然收获良多,不免想借机记下来,供以后参考。  linux内核固然是个庞然大物,但是并非洪水猛兽,尽管其中充斥着各种精巧、复杂的...
  • Linux 内核综述

    2016-06-25 03:36:00
    一、什么是Linux内核: 内核->操作系统中最重要的部分,内核将在系统引导时被装载进RAM,其中包含了很多关键的例程,以操作系统。内核是OS最为关键的部分,人们常将OS(操作系统)与内核等同。 内核,是一个操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,831
精华内容 3,532
关键字:

linux系统综述

linux 订阅