Linux操作系统
Linux操作系统,是一种计算机操作系统。
Linux操作系统的内核的名字也是“Linux”。
Linux操作系统也是自由软件和开放源代码发展中最著名的例子。
一、概述
简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于x86系列CPU的计算机上。
这个系统是由世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
Linux的出现,最早开始于一位名叫Linus Torvalds的计算机业余爱好者,当时他是芬兰赫尔辛基大学的学生。
他的目的是想设计一个代替Minix(是由一位名叫Andrew Tannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,这个操作系统可用于386、486或奔腾处理器的个人计算机上,并且具有Unix操作系统的全部功能,因而开始了Linux雏形的设计。
绝大多数基于Linux内核的的操作系统使用了大量的GNU软件,包括了shell程序、工具、程序库、编译器及工具,还有许多其他程序,例如Emacs。
正因为如此,GNU计划的开创者理查德·马修·斯托曼博士提议将Linux操作系统改名为GNU/Linux。
但有些人只把操作系统叫做"Linux"。
Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。
其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。
至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。
二、发展
在70年代,Unix体系的源程序大多是可以任意流传的。
互联网的基础协议TCP/IP就是产生于那个年代。
在那个时期,人们在创作各自的"程序作品"中享受着从事科学探索、创新活动所特有的那种激情和成就感。
那时的程序员,如同作家一样,急于"发表"自己的程序作品,并不专注于保守"机密",以换取钱财。
1979年,AT&T宣布了Unix的商业化计划,随之出现了各种二进制的商业Unix版本。
于是就兴起了基于二进制机读代码的"版权产业"(Copyright Industry),使软件业成为一种版权专有式的产业,围绕程序开发的那种创新活动被局限在某些骨干企业的小圈子里,源码程序视为核心"商业机密"。
这种做法,一方面产生了大批的商业软件,极大的推动了软件业的发展,诞生了一批软件巨人;另一方面,由于封闭式的开发模式,也阻碍了软件业的进一步深化和提高。
由此,人们为商业软件的"BUG"付出了巨大的代价。
1984年,Richard Stallman面对程序开发的封闭模式,发起了一项国际性的源代码开放的所谓牛(GUN)计划,力图重返70年代基于源码开放从事创作的美好时光。
他为保护源代码开放的程序库不会再度受到商业性的封闭式利用,制定了一项GPL条款,称为Copyleft版权模式。
1987年6月,R..Stallman完成了11万行源代码开放的"编译器"(GNU ),获得了一项重大突破,做出了极大的贡献。
1989年11月,M.Tiemann以6000美元开始创业,创造了专注于经营开放源代码"CygnusSupport"(天鹅座支持公司)源代码开放计划。
(注意,Cygnus中隐含着gnu三个字母)。
Cygnus是世界上第一家也是最终获得成功的一家专营源代码程序的商业公司。
Cygnus的"编译器"是最优秀的,它的客户有许多是一流的IT企业,包括世界上最大的微处理器公司。
1991年11月,Linus Torvalds写了个小程序,取名为Linux,放在互联网上。
他表达了一个愿望,希望借此搞出一个操作系统的"内核"来。
这完全是一个偶然事件。
但是,在互联网上,Linux刚一"露头",便被广大的牛羚计划的追随者们看中,全部上阵,七手八脚,把它"加工"成了一个功能完备的操作系统,叫做CNULinux。
1995年1月,Bob Young创办了RedHat(小红帽),以CNULinux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHat Linux,称为Linux"发行版",在市场上出售。
这在经营模上是一种创举。
Bob Young称:我们从不想拥有自己的"版权专有"技术,我们卖的是"方便"(给用户提供支持、服务),而不是自己的"专有技术"。
源代码开放程序包括各种品牌发行版的出现,极大的推动了Linux的普及和应用。
1998年2月,以Eric Raymond为首的一批年轻的"老牛羚骨干分子"终于认识到CNULinux体系的产业化道路的本质,并非是什么自由哲学,而是市场竞争的驱动,创办了"Open Source Intiative"(开放源代码促进会)"复兴"的大旗,在互联网世界里展开了一场历史性的Linux产业化运动。
在IBM、Interl为首的一大批国际性重型IT企业对Linux产品及其经营模式的投资并提供全球性技术支持的大力推动下,催生了一个正在兴起的基于源代码开放模式的Linux产业,也有人称为开放源代码(OpenSource)现象。
主流的Linux发行版:Asianux ,B2D Linux ,Conectiva Linux ,Debian GNU/Linux ,Fedora Core ,Gentoo Linux ,Knoppix Linux ,Linux From Scratch ,Magic Linux ,Mandriva Linux ,Red Hat Linux ,Slackware Linux ,Stanix Live CD ,SUSE Linux ,Turbo Linux ,Ubuntu Linux
中国大陆的Linux发行版:红旗Linux(Redflag Linux) ,冲浪Linux(Xteam Linux) ,蓝点Linux ,Hiweed GNU/Linux ,Magic Linux ,Engineering Computing GNU/Linux ,Open ,新华Linux ,共创Linux ,百资Linux ,中标普华Linux ,中软Linux ,新华华镭Linux(RaysLX) ,CD Linux ,MC Linux ,即时Linux(Thizlinux) ,b2d linux ,IBOX ,MCLOS ,FANX,Everest,酷博linux,新氧Linux,Hiweed,雨林木风Linux。
台湾地区的Linux发行版:宏基Linux
目前最著名的发行版本:Debian,红帽(redhat)、ubuntu、OpenSuse(原Suse)、Mandriva(原Mandrake)、CentOS、fedora等
国内比较著名的linux版本:红旗linux
红旗软件有限公司(简称红旗软件)由中国科学院软件研究所和上海联创投资管理有限公司共同组建。
此公司专注于基于Linux的操作系统的开发和市场,以及面向不断增长的中文技术用户的多平台应用软件。
他们的目标是“为网络生活注入活力”。
公司将持续发展被称之为“红旗方式”的一套现代管理模式,它以进行自由软件开发的企业模式为基础,是客户驱动的用户化。
三、研究现状
基于Linux 开放源码的特性,越来越多大中型企业及政府投入更多的资源来开发Linux。
现今世界上,很多国家逐渐的把政府机构内部门的电脑转移到Linux上,这个情况还会一直持续。
Linux 的广泛使用为政府机构节省了不少经费,也降低了对封闭源码软件潜在的安全性的忧虑。
在国际范围内Linux的开发,都超越国界经由互联网进行。
通常,按照一定规律,每周发布一个Linux开发版,供全世界开发者参照。
Linux开发版的序号的第二位为奇数,阶段性发布的序号第二位为偶数。
Linux的各个发行版只能均与一定的序号相对应没有序号的发行版只能入另册。
当今Linux的全部开发活动分布在各个国家,在互联网上由近100位高手在日夜进行,总体协调人是LinusTorvalds。
带有序列号的Linux发布权掌握在他手中。
在法律上,指称这组代码集的Linux注册商标的版权归Linus本人所有。
Linux体系发行版是由特定序列号的Linux(内核)及属于CNU体系源码开放的功能性支撑模块和一些运行于Linux上的商用软件所集成。
发行版整体集成版权归相应的发行商所有。
Linux发行版的发行商(称为Linux发行商)一般并不拥有其发行版中各软件模块的版权,发行商关注的应该只是发行版的品牌价值,以含于其中的集成版的质量和相关特色服务进行市场竞争。
严格讲来,Linux发行商并非必须一定是什么独立软件开商。
它本质上属于一种新兴的IT行业。
值得注意的是,任何发行版均必须含有一个标明特定序列号的完好的Linux稳定运行版本。
在这里,版本序列号授予权属于Linus本人,代表以Linux为首的国际性开发团队的创造性智慧的结晶。
任何Linux发行商在心中一定要牢牢记住这个站在Linux内核背后辛勤创作的开发团队。
没有他们,就没有Linux。
Linus与Linux开发团队永远联系在一起。
经常不断的推出Linux发行版是各国Linux发行商应尽的责任,Linux发行商的经营活动是Linux在世界范围内的传播的主要途径之一。
Linux 作为较早的源代码开放操作系统,将引领未来软件发展的方向。
四、进程管理
现在,让我们来看看如何在 Linux 内管理进程。
在很多情况下,进程都是动态创建并由一个动态分配的 task_struct 表示。
一个例外是 init 进程本身,它总是存在并由一个静态分配的 task_struct 表示。
Linux 内所有进程的分配有两种方式。
第一种方式是通过一个哈希表,由 PID 值进行哈希计算得到;第二种方式是通过双链循环表。
循环表非常适合于对任务列表进行迭代。
由于列表是循环的,没有头或尾;但是由于 init_task 总是存在,所以可以将其用作继续向前迭代的一个锚点。
让我们来看一个遍历当前任务集的例子。
任务列表无法从用户空间访问,但该问题很容易解决,方法是以模块形式向内核内插入代码。
清单 2 中所示的是一个很简单的程序,它会迭代任务列表并会提供有关每个任务的少量信息(name、pid 和 parent 名)。
注意,在这里,此模块使用 printk 来发出结果。
要查看具体的结果,可以通过 cat 实用工具(或实时的 tail -f /var/log/messages)查看 /var/log/messages 文件。
next_task 函数是 sched.h 内的一个宏,它简化了任务列表的迭代(返回下一个任务的 task_struct 引用)。
进程创建
让我们不妨亲自看看如何从用户空间创建一个进程。
用户空间任务和内核任务的底层机制是一致的,因为二者最终都会依赖于一个名为 do_fork 的函数来创建新进程。
在创建内核线程时,内核会调用一个名为 kernel_thread 的函数(参见 ./linux/arch/i386/kernel/process.c),此函数执行某些初始化后会调用 do_fork。
创建用户空间进程的情况与此类似。
在用户空间,一个程序会调用 fork,这会导致对名为sys_fork 的内核函数的系统调用。
do_fork 函数首先调用 alloc_pidmap,该调用会分配一个新的 PID。
接下来,do_fork 检查调试器是否在跟踪父进程。
如果是,在 clone_flags 内设置 CLONE_PTRACE 标志以做好执行 fork 操作的准备。
之后 do_fork 函数还会调用 copy_process,向其传递这些标志、堆栈、注册表、父进程以及最新分配的 PID。
新的进程在 copy_process 函数内作为父进程的一个副本创建。
此函数能执行除启动进程之外的所有操作,启动进程在之后进行处理。
copy_process 内的第一步是验证 CLONE 标志以确保这些标志是一致的。
如果不一致,就会返回 EINVAL 错误。
接下来,询问 Linux Security Module (LSM) 看当前任务是否可以创建一个新任务。
接下来,调用 dup_task_struct 函数(在 ./linux/kernel/fork.c 内),这会分配一个新 task_struct 并将当前进程的描述符复制到其内。
在新的线程堆栈设置好后,一些状态信息也会被初始化,并且会将控制返回给 copy_process。
控制回到 copy_process 后,除了其他几个限制和安全检查之外,还会执行一些常规管理,包括在新 task_struct 上的各种初始化。
之后,会调用一系列复制函数来复制此进程的各个方面,比如复制开放文件描述符(copy_files)、复制符号信息(copy_sighand 和 copy_signal)、复制进程内存(copy_mm)以及最终复制线程(copy_thread)。
之后,这个新任务会被指定给一个处理程序,同时对允许执行进程的处理程序进行额外的检查(cpus_allowed)。
新进程的优先级从父进程的优先级继承后,执行一小部分额外的常规管理,而且控制也会被返回给 do_fork。
在此时,新进程存在但尚未运行。
do_fork 函数通过调用 wake_up_new_task 来修复此问题。
此函数(可在 ./linux/kernel/sched.c 内找到)初始化某些调度程序的常规管理信息,将新进程放置在运行队列之内,然后将其唤醒以便执行。
最后,一旦返回至 do_fork,此 PID 值即被返回给调用程序,进程完成。
进程调度
存在于 Linux 的进程也可通过 Linux 调度程序被调度。
虽然调度程序超出了本文的讨论范围,但 Linux 调度程序维护了针对每个优先级别的一组列表,其中保存了 task_struct 引用。
任务通过 schedule 函数(在 ./linux/kernel/sched.c 内)调用,它根据加载及进程执行历史决定最佳进程。
在本文的 参考资料 小节可以了解有关 Linux 版本 2.6 调度程序的更多信息。
进程销毁
进程销毁可以通过几个事件驱动 — 通过正常的进程结束、通过信号或是通过对 exit 函数的调用。
不管进程如何退出,进程的结束都要借助对内核函数 do_exit(在 ./linux/kernel/exit.c 内)的调用。
五、内存管理
与存取(真正的)内存相比,从磁盘读是很慢的 另外,在相对短的一端时间里,多次读硬盘相同的部分是很常见的。
例如,你可能先读了一封电子邮件,然后回复时又将它读入编辑器,然后复制它到一个文件夹时又用邮件程序读它。
或者,考虑命令ls 可能被系统上的很多用户多么频繁地使用。
只从磁盘读一次信息,并保持在硬盘中,知道不再需要,除了第一次读,其他都会较快。
这就叫磁盘缓存disk buffering,用于此目的的内存叫buffer cache。
不幸的是,由于内存是有限且缺乏的资源,buffer cache一般不会足够大(大到能够装下所有人可能用到的数据)。
当cache满时,最长时间不用的数据将被丢弃,内存释放给最新的数据。
磁盘缓冲也用于写操作。
要写的数据经常马上又被读(例如一个源代码文件保存到文件中后又被编译器读出),所以将要写的数据放在缓冲里是个好主意。
另外,只将数据放如cache而不马上写到磁盘,写操作的程序执行速度更快。
写操作然后可以在后台完成,而不降低其他程序的速度。
许多操作系统有buffer caches (即使名称不同),但并非都根据上述原理。
有些是透写write-through: 数据马上写到磁盘(当然也同时写到cache) 不马上写的cache叫回写write-back。
回写比透写更有效,但也更容易出错:如果系统崩溃,或电源突然掉电,或软盘在cache回写前被取出,那么cache中改变的数据将丢失。
这可能意味着文件系统is not in full working order, 可能由于未写数据包含了系统记录信息的重要的变化。
因此,千万不要不经过正常的关闭过程直接关闭电源(见6章), 或没有unmount就取出软盘(如果是mount的),或什么程序还在用着软盘,或软盘灯还在闪。
sync 命令刷新缓冲,即强制将所有未写数据写回磁盘,如果要确保所有数据安全回写,可以用它。
传统的UNIX系统中,有个update 程序在后台运行,它每30秒运行一次 sync ,所以通常无须使用sync 。
Linux有一个另外的守侯程序bdflush ,它克服了sync 有时因磁盘I/O负荷太重(因为频繁的操作)而导致有时系统突然呆住的问题。
Linux下,bdflush 由update 启动。
一般无须考虑它,但如果bdflush 偶尔因为什么原因死了,核心会给出警告,此时应该手工启动它(/sbin/update )。
cache并不真正缓冲文件,而是块,就是磁盘I/O的最小单元(Linux下,一般是1kB)。
这样,所有的目录、超级块、其他文件系统记录数据和无文件系统磁盘都可以被缓冲。
cache的效果决定于其大小。
太小的cache几乎无用;它只能cache很少的数据,而可能在被重用前就被清除了。
大小有赖于有多少数据被读写,相同的数据的存取频度。
唯一的方法是实验。
如果cache是固定大小,那么不应该太大,否则,会由于空闲内存空间太小而使用swap(也很慢)。
为了最有效地使用真实内存,Linux自动使用所有空闲内存作为buffer cache,当程序需要更多内存时,自动减少cache。
Linux下,对cache使用无须做任何工作,它完全是自动的。
除了要正常关闭系统和取出软盘,无须关心cache。
六、设备管理
Linux的设备管理的主要任务是控制设备完成输入输出操作,所以又称输入输出(I/O)子系统。
它的任务是把各种设备硬件的复杂物理特性的细节屏蔽起来,提供一个对各种不同设备使用统一方式进行操作的接口。
Linux把设备看作是特殊的文件,系统通过处理文件的接口—虚拟文件系统VFS来管理和控制各种设备。
设备驱动程序
系统对设备的控制和操作是由设备驱动程序完成的。
设备驱动程序是由设备服务子程序和中断处理程序组成。
设备服务子程序包括了对设备进行各种操作的代码,中断处理子程序处理设备中断。
设备文件
Linux设备管理的基本特点是把物理设备看成文件,采用处理文件的接口和系统调用来管理控制设备。
从抽象的观点出发,Linux的设备又称为设备文件。
设备文件也有文件名,设备文件名一般由两部分组成
第一部分2~3个字符,表示设备的种类,如串口设备是cu,并口设备是lp,IDE普通硬盘是hd,SCIS硬盘是sd,软盘是fp等。
第二部分通常是字母或数字,用于区分同种设备中的单个设备,如hda、hdb、hdc…分别表示第一块、第二块、第三块IED硬盘。
而hda1、hda2…表示第一块硬盘中的第一、第二个磁盘分区。
七、文件管理
Linux系统中文件管理的概念,包括常用命令格式、文件类型、目录结构、文件系统及其安装。
众所周知,我们上机时是通过用户界面与计算机打交道。
用户界面定义了用户与计算机交流的不同方式,常见的有图形界面、命令界面及程序界面。
每个人喜欢什么样的用户界面取决于教育背景及经验。
Linux提供了几种不同的用户界面,其中,命令界面是Linux系统下最简单、但也是功能最强的用户界面。
我们经常要利用文件来存放信息和数据、创建/删除文件、打开/关闭文件、读/写文件等,用户最常用的操作几乎都与文件相关。
常用命令格式
Linux提供了几百条命令,虽然这些命令的功能不同,但它们的使用方式和规则都是统一的。
Linux命令的一般格式是:
命令名 [选项] [参数1] [参数2]……
命令名由小写的英文字母构成,往往是表示相应功能的英文单词或单词的缩写。
例如,date表示日期;who表示谁在系统中;cp是copy的缩写,表示拷贝文件等。
方括号中的部分表明对命令行来讲不是必须的,即可有可无。
例如,可以直接在提示符后面输入命令date,显示当前的日期和时间;也可以在date命令名后面带有选项和参数,如“date -s 15:30:00”,设置系统时间为下午3点30分。
选项是对命令的特别定义,以“-”开始,多个选项可用一个“-”连起来,如“ls -l -a”与“ls -la”相同。
命令行的参数提供命令运行的信息,或者是命令执行过程中所使用的文件名。
通常参数是一些文件名,告诉命令从哪里可以得到输入,以及把输出送到什么地方。
如果命令行中没有提供参数,命令将从标准输入文件(即键盘)接受数据,输出结果显示在标准输出文件(即显示器)上,而错误信息则显示在标准错误输出文件(即显示器)上。
可使用重定向功能对这些文件进行重定向。
命令在正常执行后返回一个0值,表示执行成功;如果命令执行过程中出错,没有完成全部工作,则返回一个非零值(在Shell中可用变量$?查看)。
在Shell脚本中,可用命令返回值作为控制逻辑的一部分。
WordPress经典外贸企业建站主题,经典配色扁平化简约设计+跨屏自适应移动端设备,特色外贸企业建站功能模块+在线Inquiry询单功能,更有利于Google等英文搜索优化和站点收录。采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera等;同时支持移动终端的常用...
RAKSmart 商家最近动作还是比较大的,比如他们也在增加云服务器产品,目前已经包含美国圣何塞和洛杉矶机房,以及这个月有新增的中国香港机房,根据大趋势云服务器算是比较技术流的趋势。传统的VPS主机架构方案在技术层面上稍微落后一些,当然也是可以用的。不清楚是商家出于对于传统VPS主机清理库存,还是多渠道的产品化营销,看到RAKSmart VPS主机提供美国、香港和日本机房的半价促销,当然也包括其他...
GreencloudVPS此次在四个机房都上线10Gbps大带宽VPS,并且全部采用AMD处理器,其中美国芝加哥机房采用Ryzen 3950x处理器,新加坡、荷兰阿姆斯特丹、美国杰克逊维尔机房采用Ryzen 3960x处理器,全部都是RAID-1 NVMe硬盘、DDR4 2666Mhz内存,GreenCloudVPS本次促销的便宜VPS最低仅需20美元/年,支持支付宝、银联和paypal。Gree...