03 操作系统基础

仅为个人学习备忘,方便日后查阅

一、程序的执行过程

计算机本身就是一堆硬件,其中最核心的就是 CPU 和内存。为了实现计算机获得数据,数据的输入输出,需要输入设备和输出设备。在计算机体系内部,一般来讲,输入输出设备是通过南桥接入当前系统的。

对于一个简单的PC机而言,在某一个时刻只能运行一个程序。但是计算机的计算能力很强,一个程序运行程序内容所占用的 CPU 的时间不是特别多。为了能够尽可能地利用计算机的计算能力,需要将计算机同时运行多个程序,因此每个程序运行起来以后需要一个协调器,这个协调程序我们把它称为叫操作系统。操作系统还包含许多其它程序,此处称为内核 kernel 更合理一点。内核本身就负责管理硬件资源,并且将硬件资源虚拟成其他样子,提供给上层所需要的应用程序。

如果一个程序可以直接运行在硬件上,这个程序本身就可以控制硬件的各种属性。其他程序要想运行在硬件上,这些程序之间可能会产生干扰,一个恶意的应用程序可能会导致其他应用程序通通退出。所以需要一个统一的资源管理者,任何应用程序要想使用硬件,必须通过内核来完成。

内核也不会允许程序直接访问硬件,它是将硬件所提供的运算能力,通过一个一个地系统调用来实现的。

系统调用是非常底层的应用,程序员要想根据系统调用来编程会非常麻烦,非常烦琐,而且许多程序之间的功能是相同的。比如word需要打印,excel也需要打印,如果都自己开发,计算机上大量的功能是重复的,这种重复势必会额外地占用空间。从资源的组织角度来讲也不合理。因此操作系统除了提供内核以外,还将内核所提供的一些系统调用输出出来,这种输出是通过高层一点的调用接口来实现,这种接口我们把它称为库。

库本身也是应用程序,只不过这个应用程序没有程序的执行入口,它是不能自我独立运行的。只能被其他程序调用的时候执行。

程序员不使用库,直接在内核上编程也可以,只不过比较麻烦而已。所以调用除了系统调用以外,还有库调用(library call)。库对于一个操作系统,或内核而言,称为应用编程接口,API。

在库的上层就是应用程序,这个应用程序很可能直接运行在系统调用上,内核上,也有可能是通过库调用来完成。只不过使用库调用编程起来可能会更简单,但使用内核调用,它的执行效率可能会更高,因为至少不用使用库来完成了,而且它获得的操作权限也可能会更大。

无论有多少个应用程序,这些程序在操纵系统启动的时候,这个程序未必会运行起来,只不过说操纵系统启动以后,这些程序只是具备了运行条件,或者说已经有了运行环境,但它并没有运行。

通常启动一个程序的方式有多种。比如说,操作系统一启动,这个程序就自动启动起来。比如装完一个干净的操作系统,点开进程管理器,里面也有很多进程。这些进程是随系统的启动而启动的。这些进程有些可以称为服务,或后台服务。操作系统为了自身的运行,或完整的能力,启动一些程序才能让操作系统提供一个基本的功能。

有些是按需启动,比如需要编辑一个word文档的时候,才需要启动 word 。不然开机windows ,自动启动word,没有任何意义。这种程序需要手动启动,称为交互式程序。

敲了一下键盘之后,信息一定是由 CPU 先接收的,通过中断先到达CPU。CPU并不知道敲键盘这个信息意味着什么。能够跟硬件交互的只有内核,CPU在拿到这个信息以后,先通知内核来处理,内核会知道这个命令是由哪个进程发起来的。整个系统资源的监控,包括上层所运行的应用的监控都是由内核来完成的。内核会知道到底哪个进程处于当前焦点进程,而负责接收这样一个快捷键,或键的组合,由内核再转交给应用程序来完成。

二、隔离机制

操作系统本身也是一个程序,它也需要运行,就需要有指令和数据,而指令和数据是放在内存中的。那就意味着在内存当中既有内核,还有其他的应用程序。如果一个恶意的应用程序,能够直接访问内核,能够修改内核中的某些数据的话,意味着系统的稳定性将无从得到保证。所以必须有一种机制,能够将应用程序和内核隔离开来。

通常情况下,比如像intel这类的平台上,会提供所谓的保护机制,或保护模式。一般CPU有四个级别,是同心圆的四个环。最内层,称为0级别,或第0环,也称为特权级别。只有内核才能运行在特权模式下。而其他应用程序只能运行在最外层级别。中间两层没用。所以任何时候,应用程序是不能访问内存当中处于0级别的内存区域的。

CPU跟内存彼此之间是紧密结合的。CPU的0级别,会映射到内存中处于保护的某一段当中。

内存分为三段。

最底层的一段为BIOS的映射程序,POST加电自检之后,BIOS就自动映射到内存的开端之处。

然后载入操作系统内核。kernel space

再后面的空间被多个应用程序所共享。

但是,这样去划分内存,非常容易产生内存碎片。

三、shell

shell 是整个操作系统的外壳,是能够实现接收用户指令,理解用户的命令,并且将它传输给内核,由内核指挥某个应用程序启动的这么一个界面。

GUI: Graphical User Interface 图形界面的 shell

CLI: command-line interface 命令行接口

无论是 GUI 还是 CLI 也是应用程序,所以在不同的操作系统上,它们可能有提供的不同的替换版本。

linux 常见的有三种图形界面,gnome,kde,xface

windows 上只有一种,而且是无法替换的。 windows 2008之前 shell 是直接做进内核的,无法替换。windows 2008 提供了 power shell 这样的接口,也可以不用使用图形界面了。

而对CLI而讲,DOS 本身就是命令行,而linux 的 shell 就有很多。

GUI 和 CLI 也是应用程序,而且在这个接口下所启动的任何应用程序,如果把GUI 或 CLI 关闭,那在这个接口下所启动的应用程序也会关闭。比如将 windows 桌面注销了,那启动的 word 也会退出。

四、内核的功能

进程管理

内存管理

文件系统

网络功能

硬件驱动

安全机制

五、操作系统历史

  1. 批处理系统

是现代操作系统的前身。当时没有操作系统的前提下,我们的每一个程序都是直接在硬件上运行的,表现为一个一个的作业。

作业一执行完了,它会自动地载入第二个作业,彼此之间使用分隔符分开。

jobs1$$$$$$$$$$$jobs2$$$$$$$$$$$$

第一个程序执行完了,再执行第二个程序。这是远远无法发挥出我们硬件的功能的。

2. Multics

这时有是三个组织,GE (通用电气),美国的电报电话公司(AT & T)的 Bell 实验室,以及麻省理工大学 MIT 的人工智能实验室,联合起来研发比批处理高级的 多任务、多用户的系统。使用汇编语言来开发出来适用于大型机 MainFrame ,能够支持多任务和多用户的系统,称为 Multics.

这时它们已经完成了基本的功能,GE 首先退出,然后 Bell 退出,留下 MIT 研发。

3. Unix

Bell 大概 1970 年退出,当时为了研发招收的科学家就空闲起来了。 其中就包括 ken 。

Ken Thompson:

Space Travel  使用 VGA 图形卡。当时只能运行在 Multics 上。由于 Bell 退出,Ken 无法再免费使用 Multics

70年代,主要生产计算机的公司除了 IBM 还有 DEC.

DEC:

PDP  系列 ,当时最新是 PDP-11

VAX  系列 -- vms

Space Travel 是应用程序。应用程序要运行起来,必须依赖内核。Ken 利用 PDP-7 凭借它对 Multic的理解,开发出一个简单的内核来运行他的 Space Travel ,后来成功了。他在 Bell 实验室到处推销他的游戏。但是大家对他的游戏不感兴趣,倒是对他的系统感兴趣。

应用程序是用汇编开发的,汇编是跟硬件平台紧密结合的。PDP-7 上开发的应用程序想运行在其他系统上不可以。所以Ken 重新移植到其他主机系列上。成功后,它的系统风靡 Bell 实验室。后来他的同事戏谑地称他的系统为 Unics 。因为系统功能非常简单,相对于 Multi 所以叫 Uni 。后来改为 Unix 。

Dennis Ritchie:

这时 Unix 都是使用汇编研发的,性能不错,但移植困难。为了能够扭转这种劣势,Dennis 希望使用高级语言重新开发 Unix 。这样只要使用不同的编译器,在不同的平台版本上编译,就能完成 Unix 的移植。因为高级语言对底层的硬件依赖程度是非常低的。

Dennis 对 B 语言引入了变量、地址等,开发了 C 语言。在当时,高级语言的运行效率比低级语言至少要低 30% 。

1974年,Dennis 和 Ken 在计算机通信杂志发表 Unix 论文。Bell 属于 AT & T 。根据反垄断法,AT & T 不能销售除了电报电话以外的任何商品,不但不能出售,别人要还得给,无偿提供。计算机年会,当别人索要Unix的时候,他们不得以,只好无偿提供。

Bill Jey:

成立了 BSRG ,伯克利操作系统研究小组。

1976年,Ken到美国加州大学伯克利分校任教。 此前,伯克利就获得了 Unix 源代码进行研究。

TCP协议的拥塞控制等功能都诞生在 BSRG Unix 这个版本上。

BSD: Berkely System Distribution 伯克利系统发行版

融合了各种功能,Bill Jey 将 Unix 对外发布,并改名 BSD 。开始卖钱,牟利甚多,引起贝尔实验室不满。

System: 贝尔实验室的 Unix 版本.

后来贝尔实验室被卖给了 Novell,从此不再受 AT & T不能销售操作系统的约束。分拆出来以后,迫不及待卖钱,一个授权 4万美元。到底谁是正统,谁该卖,谁不该卖,跟 BSD 打官司打了十年。

Microsoft: 81年,在美国西雅图一个小公司,Microsoft 成立

IBM 、康柏公司 开始生产 PC 机。

任何计算机没有操作系统没法用。而 Unix 当时只能运行在PDP系列上。Unix 始终没有往 PC 兼容机上移植。当时PDP用的是摩托罗拉公司的M68K CPU。而 PC 机用的都是 Intel 的 8086,8088 ,80286.

当时Intel语言界面丑陋,性能很差,Unix 程序员不屑于把Unix运行在PC机上去 。

CP/M

买一个PC大概2-3万美元,买一个CP/M大概也要3万美元。

微软三个人卖 Basic 编译器,包装发型 Unix ,起名 Xenix。

Bob 朋友花4个星期,仿照 CP/M写了一个操作系统。比尔盖茨一手托两家,5万美元从小程序员买断操作系统,转手卖给 IBM 授权。买断后,敲敲打打,改名 DOS 。

DOS:Disk Operating System,单用户,单任务。

PC机卖出上百万台,DOS获得千万美元利润。

jobs:

这种好的现状,自从另外三个年轻人,创立了另外一家公司以后就破灭了。

乔布斯非常崇拜计算机科学之父图灵。图灵吃了抹了氰化钾的苹果死去。所以乔布斯的公司命名苹果。

乔布斯在apple1上装的是 Unix,界面比DOS好。cpu用的不是 x86,而是 Power.

Xerox: 施乐公司,生产复印机。

PARK实验室:在 Unix基础上,研究出了第一个鼠标,第一个图形操作界面。乔布斯溜进实验室,发现这个研究成果。找到公司,买走拷贝。组织团队研发,apple2 发型的时候,图形界面已经出现。

这对比尔盖茨是当头一棒,DOS还有谁要,于是接近乔布斯,从乔布斯这里骗走一份拷贝。当乔布斯发现的时候,比尔盖茨已经将他的系统重命名为 Windows 。(基于DOS开发)

乔布斯系统是封闭的,不单卖,要买机器一块买。Windows 只卖许可证。

FreeBSD: 世界上第一个能运行在PC机上的正统 Unix 。

OpenBSD: 专注于安全

NetBSD: 专注于服务

迄今为止,苹果的Unix的核心都是 FreeBSD 的内核。

Sun Microsystem: Bill Jey 联合另外两个人成立。

生产工作站,比小型机要轻量级,但性能不差,有自己独立的操作系统。

Sun OS --> 为了避免官司,由BSD 转而使用贝尔实验室的 Unix,改名 Solaris .正统 Unix 。只能运行在Sun 自己的硬件 SPARK 上。

Bill Jey 还引入了 CSH,兼容 C语言风格的 shell 。

Windows 95,98本身基于DOS,DOS本身就是梦魇。

Windows NT: (new technology)DEC 生产的VAX使用 vms操作系统。比尔盖茨引入vms,在vms基础上开        发。内核不再是 DOS,而是 vms

六、Linux

Andrew:

当Unix开始卖钱之后,很多科研机构就不能再免费使用 Unix了。于是荷兰的 Andrew 仿照 Unix 开发 Minix ,上课用。

有一年到芬兰赫尔辛基上课。Mixnix 是开发在教授自己的主机上的,很多地方是用汇编语言写的。因此他的学生要学习 Minix,装在自己的主机上,不得不自己开发驱动程序。

Linus: 自己写了个系统,叫 Linux 。

80年代,Stallman, 倡导软件自由。

GNU: GNU is Not Unix 。递归缩写。

GPL: General Public License  自由

Emacs: 文本编辑器

gcc: GNU C Compiler ,转成二进制

bash

Linux: 只是一个内核。它不是应用程序,它没有库,库在 Linux叫 glibc .gcc 是编译器。

ABI: Applicaiton Binary Interface

编译必须要两个平台完全一样,意味着编译之后期望它能在 x86机器上运行,那就必须在 x86 上进行编译。否则,编译出来的程序只能在当前CPU上运行,拿到其他主机上运行不了。

交叉编译:在A机器上编译,拿到B机器上运行。尽管都是二进制,都是 Intel 的 CPU,在酷睿上编译的程序,不一定能奔腾在上运行,因为 CPU 支持的二进制格式各不相同。

GNU/Linux: 完整的操作系统,GNU还提供很多外围软件。

无论 GNU 的软件,还是 Linux 的内核,都是源代码,是 c 开发的程序。任何程序要运行,得编译成二进制。编译成 01代码,计算机才能识别,计算机才能运行。

Linux 通过源代码的方式向全球的使用者来发布,谁来负责编译呢?

第三方组织,负责编译 Linux 内核,和各种外围应用程序。并将它们做成打包发行成可安装的便捷的这种方式的Linux,直接做成二进制向外打包发布。

Linux 发行商:release

本身都不是Linux的拥有者,只负责将源代码格式的Linux,在通用平台上编译成通用格式,使得其他人拿到以后可以在大多数硬件平台上安装并使用。

SLS: 91年

Debian: 92年。唯一没有商业公司支持。高级用户中流行

Red Hat : 93 年成立于北卡罗来纳州。北美、中国流行

SUSE:被 Novell (Netware)收购了。SUSE前身 SLS。欧洲流行

Ubuntu: 基于 Debian 的二次发行版。界面漂亮,主要基于PC机使用。

Mint: 基于 Ubuntu 二次发行,更漂亮

内核由Linus维护,软件由GNU组织维护,发行商只负责包装发行,只是在包装发行过程中,加入了自己对于一个操纵系统的理解,加入了自己对于某些参数的调整,加入了自己公司的 LOGO,使得 Linux 看起来各不相同。事实上,内核一样,软件一样,可能配置文件不一样而已。

包管理器:

Linux 有内核,GNU提供软件,打包发行的时候不能把所有软件都装上去。早期软件都是打包在一块进行安装的。这不便于软件包的单个管理。

Debian: dpt

Red Hat: rpm

这些系统它们本身都遵循 GPL,就算是红帽把它做成了二进制格式,但它也要把它的软件包的源码格式公布出来,因为 GPL 有这种规定。

GPL: 任何人,当你获取GPL组织的软件程序以后,无论你怎么改,改完以后必须要把你改的内容也一并    公布出来,不公布你就侵权。它们主要是为了保证软件自由的。

所以GPL就像病毒一样,任何人都不敢沾它。假如软件有20行,我借鉴了10行,后来又开发了一万    行,那这一万行必须得公开。

LGPL: Lesser GPL

GPL v2

GPL v3

GPL 是非常严格的

其他开源协议:

BSD

Apache

BSD 和 Apache 要宽松得多。

开源:开放源代码

自由:

自由获取,自由修改,自由学习

Linux 是GPL的,所以红帽发行的时候,要发布两种版本,一种是包装好的二进制格式,一种是发布源代码格式的。

Windows卖的是版权,Red Hat 卖的是服务。

CentOS: Community Enterprise Operating System

红帽只要发布源程序,CentOS,就把它做成二进制,而且跟红帽一模一样。

红帽是红帽公司的注册商标,因此改名叫 CentOS,图表不一样,LOGO不一样,但是程序格式是      完全兼容的。但是 CentOS 不提供服务保证。

国内用的最多。

Fedora: 红帽开始发行个人版,到9.0 ,在2003年终止,后来捐献给 Fedora。

Fedora 再测试稳定以后,会引入后续的红帽企业版。

Mandriva: 桌面

Linux是内核,是内核就有版本,0.1, 1.0, 2.0,...

官方站点 https://www.kernel.org/

RHEL: 3.0, 4.0, 5.0, 6.0 红帽发行版的版本

七、Linux 基本原则 

  1. 由目的单一的小程序组成。Linux 是由小程序组成的,每一个程序都非常小。体积非常小,目的非常单一。组合小程序,完成复杂任务。
  2. 一切皆文件。所有东西都保存为文件格式,甚至连设备的访问入口都保存为文件。
  3. 尽量避免捕获用户接口。尽量少跟用户进行交互。一般而言,用户启动一个进程之后,用户不需要再输入任何信息。
  4. 配置文件保存为纯文本格式。

GUI接口:双击

CLI接口:执行命令,给出执行文件的路径。

命令提示符:(给你一个提示符,在这个符号后面可以输入命令) prompt bash

两种不同的展现形式:

# :root 管理员

$ : 普通用户

Linux 跟 windows 不同,用户类别非常简单,就两类,管理员,普通用户。

命令:shell本身就是命令行接口,当我们输入命令以后,这个命令会被 shell 送给内核,由内核判       断这个命令是否具有执行权限,还包括从什么地方开始执行(任何程序要想执行必须得有执行       入口)。

命令格式: 通常由三部分组成。

命令 选项 参数

选项:

短选项: -

多个选项可以组合: -a -b = -ab

长选项: --

长选项不能组合,必须要分开来写。

参数: 命令的作用对象

用户的登录和切换:

su: switch user

exit: 退回原来的选项

# su [-l] 用户名 : [] 内表示可省略的

修改密码

# passwd

密码复杂性规则:

1. 数字,大写字母,小写字母,特殊字符,四种中选三种

2. 至少7位

3. 随机字符串

4. 定期更换

5. 循环周期要足够大: 尽量不要使用最近使用过的密码

Linux 哲学思想之一,能简写绝不全写。

Linux 严格区分大小写

虚拟终端(terminal):

在 VMware 中,ctrl + alt + F2 切换到另一个用户,ctrl + alt + F1 又回来了,

ctrl + alt + F3 又是一个新的用户。

startx & : 启动图形界面, ctrl + alt + F1 切换回去。

GUI:

Gnome: c 开发

KDE: C++

XFace: 嵌入式

CLI:

sh

bash

csh

zsh

ksh

tcsh

时间: 2024-10-16 10:06:44

03 操作系统基础的相关文章

操作系统基础篇

程序运行的4个因素 (1).程序设计语言 (2).编译系统 (3).操作系统 (4).指令集结构(硬件系统) 操作系统的定义:操作系统是掌控计算机上所有事情的软件系统(硬件资源,软件资源) 操作系统对内存,i/o,cpu,外存等管理分为 1.cpu管理-------进程管理(@1.每个程序都能使用cpu,@2.非阻塞(一个进程不能一直占用cpu),@3.优先级) 2.内存管理------管理缓存,主存,磁盘等存储介质所形成的内存架构 3.外存管理-------文件系统,建立在磁盘空间上 4. i

计算机与操作系统基础小结

计算机基础概念 1946年二月美国,世界上第一台电子计算机ENIAC诞生,似乎从这一年开始世界便逐渐变得不一样了.随着半个世纪的时间,计算机技术蓬勃发展,推动人类进入信息社会. 计算机操作界面: ①图形用户界面 ②命令行界面 在ENIAC计算机研制的同时,冯.诺依曼与莫尔小组合作研制EDVAC计算机,采用了存储程序方案,即把解题过程中的每一步用指令表示,并按执行顺序编写成为程序,存放在存储器中,称为冯.诺依曼计算机.冯.诺依曼计算机有着如下几个特点. (1)计算机由运算器,控制器,存储器,输入设

Linux操作系统基础解析之(四)——Linux基本命令剖析(1)

Linux操作系统自从出现以来,就备受关注.但是人们往往会有这样的一个印象:Linux比Windows难.为什么好多人都会有这样的想法呢?很简单,因为Windows是在更早的时候,甚至是大多数国人都没有认识到计算机的时候就已经被安装到X86架构的计算机上了.Microsoft公司寻求Intel公司的技术支持,并且建立合作之后,PC的市场就几乎被这两家公司垄断了.所以,很多人刚刚开始接触并逐渐学会使用计算机,Intel的X86架构的主机,而且这个主机上一般安装的都是Windows操作系统.因此,大

马哥Linux课程随堂笔记(操作系统基础01)

Linux课程笔记(操作系统基础)-20160822 第四层:应用程序(1.通过内核调用运行,2.调用库运行) 第三层:library:API(应用编程接口)库 只能被其他程序调用的时候才能执行,执行环境就是被调用 第二层:Kernerl:内核管理硬件资源 第一层:硬件 内核的功能: 1.进程管理 2.内存管理 3.文件系统 4.网络功能 5.硬件驱动 6.安全机制 GNU计划,又称革奴计划,是由RichardStallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统

计算机运行原理与操作系统基础

一.冯诺依曼体系 使用二进制 数据和代码存储在一起 存储器是按地址访问的线性编制的一维结构. 二.计算机五大部件 运算器(CA).控制器(CC).存储器(M,内存+外存).输入设备(I).输出设备(O) 三.计算机运行原理 五大部件中,以控制器为中心的指令流和以运算器为中心的数据量贯通其中,从而得出结果. 四.操作系统基础 目前大家所知道的操作系统有windows,mac,linux,unix等. 操作系统是运行在系统硬件上用于整合硬件资源的系统软件. 主要包括存储管理.进程管理.文件管理.设备

操作系统基础-进程

进程的创建 四种主要的事件导致进程的创建: 系统初始化 正在运行的进程发出系统调用,创建一个活多个进程 用户请求创建一个新进程 一个批处理作业的初始化 在所有的情形中,新进程都是由于一个以存在的进程执行了一个用与创建进程的系统调用而创建的. Unix 进程的创建: fork(系统调用)--> 创建一个与系统调用相同的副本 --> 子进程执行execve或一个类似的系统调用 --> 修改其存储映像并运行一个新的程序. 在调用fork后,父进程和子进程拥有相同的存储映像,同样的环境字符串,同

Day 2 操作系统基础

课前复习新知识 RAID(Redundant Arrays of Independent Disks)独立冗余磁盘阵列 定义:加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术.RAID就是一种由多块廉价磁盘构成的冗余阵列,在操作系统下是作为一个独立的大型存储设备出现.RAID可以充分发挥出多块硬盘的优势,可以提升硬盘速度,增大容量,提供容错功能够确保数据安全性,易于管理的优点,在任何一块硬盘出

*1 计算机基础和操作系统基础及几大协议

计算机基础和操作系统基础 计算机为什么叫电子计算机(因为他永远是二进制来运行) 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件系统和软件系统所组成,没有安装任何软件的计算机称为裸机.可分为超级计算机.工业控制计算机.网络计算机.个人计算机.嵌入式计算机五类,较先进的计算机有生物计算机.光子计算机.量子计算机等. 计算机发明者约翰·冯·诺依曼.

Linux学习笔记__Linux操作系统基础

  Linux操作系统基础 一.Linux的基本原则: 1.由目的单一的小程序组成:组合小程序完成复杂任务: 2.一切皆文件: 3.尽量避免捕捉用户接口: 4.配置文件保存为纯文本文件. 二. 接口: GUI接口(图形接口): Gnome:c KDE:C++ XFace CLI接口(命令行接口): (命令提示符): #:root用户 $: 普通用户 Promt;sh;bash;csh;zsh;ksh;tcsh 三.命令格式: 命令   选项   参数 选项: 短选项:- 多个短选项可以组合:-a