linux 简介UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线 。为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是程序员 。Linux 继承了 UNIX 的设计目标 。从智能手机到汽车,超级计算机和家用电器,从家用台式机到企业服务器,Linux 操作系统无处不在 。
大多数程序员都喜欢让系统尽量简单,优雅并具有一致性 。举个例子,从最底层的角度来讲,一个文件应该只是一个字节集合 。为了实现顺序存取、随机存取、按键存取、远程存取只能是妨碍你的工作 。相同的,如果命令
ls A*
意味着只列出以 A 为开头的所有文件,那么命令
rm A*
应该会移除所有以 A 为开头的文件而不是只删除文件名是 A* 的文件 。这个特性也是最小吃惊原则(principle of least surprise)
最小吃惊原则一半常用于用户界面和软件设计 。它的原型是:该功能或者特征应该符合用户的预期,不应该使用户感到惊讶和震惊 。一些有经验的程序员通常希望系统具有较强的功能性和灵活性 。设计 Linux 的一个基本目标是每个应用程序只做一件事情并把他做好 。所以编译器只负责编译的工作,编译器不会产生列表,因为有其他应用比编译器做的更好 。
很多人都不喜欢冗余,为什么在 cp 就能描述清楚你想干什么时候还使用 copy?这完全是在浪费宝贵的 hacking time 。为了从文件中提取所有包含字符串 ard 的行,Linux 程序员应该输入
grep ard f
Linux 接口Linux 系统是一种金字塔模型的系统,如下所示文章插图
应用程序发起系统调用把参数放在寄存器中(有时候放在栈中),并发出 trap 系统陷入指令切换用户态至内核态 。因为不能直接在 C 中编写 trap 指令,因此 C 提供了一个库,库中的函数对应着系统调用 。有些函数是使用汇编编写的,但是能够从 C 中调用 。每个函数首先把参数放在合适的位置然后执行系统调用指令 。因此如果你想要执行 read 系统调用的话,C 程序会调用 read 函数库来执行 。这里顺便提一下,是由 POSIX 指定的库接口而不是系统调用接口 。也就是说,POSIX 会告诉一个标准系统应该提供哪些库过程,它们的参数是什么,它们必须做什么以及它们必须返回什么结果 。
除了操作系统和系统调用库外,Linux 操作系统还要提供一些标准程序,比如文本编辑器、编译器、文件操作工具等 。直接和用户打交道的是上面这些应用程序 。因此我们可以说 Linux 具有三种不同的接口:系统调用接口、库函数接口和应用程序接口
Linux 中的 GUI(Graphical User Interface) 和 UNIX 中的非常相似,这种 GUI 创建一个桌面环境,包括窗口、目标和文件夹、工具栏和文件拖拽功能 。一个完整的 GUI 还包括窗口管理器以及各种应用程序 。
文章插图
Linux 上的 GUI 由 X 窗口支持,主要组成部分是 X 服务器、控制键盘、鼠标、显示器等 。当在 Linux 上使用图形界面时,用户可以通过鼠标点击运行程序或者打开文件,通过拖拽将文件进行复制等 。
Linux 组成部分事实上,Linux 操作系统可以由下面这几部分构成
- 引导程序(Bootloader):引导程序是管理计算机启动过程的软件,对于大多数用户而言,只是弹出一个屏幕,但其实内部操作系统做了很多事情
- 内核(Kernel):内核是操作系统的核心,负责管理 CPU、内存和外围设备等 。
- 初始化系统(Init System):这是一个引导用户空间并负责控制守护程序的子系统 。一旦从引导加载程序移交了初始引导,它就是用于管理引导过程的初始化系统 。
- 后台进程(Daemon):后台进程顾名思义就是在后台运行的程序,比如打印、声音、调度等,它们可以在引导过程中启动,也可以在登录桌面后启动
- 图形服务器(Graphical server):这是在监视器上显示图形的子系统 。通常将其称为 X 服务器或 X 。
- 桌面环境(Desktop environment):这是用户与之实际交互的部分,有很多桌面环境可供选择,每个桌面环境都包含内置应用程序,比如文件管理器、Web 浏览器、游戏等
- 应用程序(Applications):桌面环境不提供完整的应用程序,就像 windows 和 macOS 一样,Linux 提供了成千上万个可以轻松找到并安装的高质量软件 。
推荐阅读
- .so Linux下动态库和静态库(.a) 的区别
- Linux中/etc/passwd配置文件详解
- linux后台开发中避免僵尸进程的方法总结
- 用 testdisk 恢复 Linux 上已删除的文件
- 使用 GNU bc 在 Linux Shell 中进行数学运算
- 谈谈如何学习Linux
- Redis源码剖析之SDS
- 如何获取Linux或者macOS系统版本相关信息
- linux异步IO编程实例分析
- Linux和Windows两种风格的操作系统,创建线程的方式有何不同?