Ubuntu Linux操作系统与实验教程(第二版)答案

Posted lune_one

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu Linux操作系统与实验教程(第二版)答案相关的知识,希望对你有一定的参考价值。

目录

第一章 习题

1.判断题

2.简答题

第二章 习题

1.判断题

2.简答题

第三章 习题

1.判断题

第四章 习题

1.判断题

 2.简答题

第五章 习题

1.填空题

2.问答题


第一章 习题

1.判断题

(1)在一台主机上只能安装一个虚拟机。(错)

(2)在一个虚拟机下只能安装一个操作系统。(错)

(3)格式化虚拟机下的操作系统就是格式化主机的操作系统。(错)

(4)虚拟机的安装有三种安装类型。(错)

(5)VMware Workstation 15 默认分配的虚拟机内存是1GB。(错)

(6)Ubuntu有两种安装方式,即试用Ubuntu和安装Ubuntu。(对)

(7)解压vmware-install.pl文件安装VM Tools。 (错)

(8)VM Tools安装完成后可以在主机和虚拟机之间任意拖动和复制文件。(对)

2.简答题


(1)请简述在虚拟机的安装过程中,四种网络类型的特点。

答:桥接网络:为客户机操作系统提供直接访问外部以太网网络的权限。客户机在外部网络上必须有自己的IP地址。即,此时虚拟机相当于网络上的一台独立计算机,与主机一样,拥有一个独立的IP地址,主机和虚拟机之间,虚拟机和主机之间可以互相访问。
网络地址转换(NAT):为客户机操作系统提供使用主机IP地址访问主机拨号连接或外部以太网网络连接的权限。即,此时虚拟机能够访问主机,并通过主机单向访问网络上的其他主机(包括Internet网络),而其他主机不能访问此虚拟机。
仅主机模式网络:将客户机操作系统连接到主机上的专用虚拟网络。即,内网模式,虚拟机与外网完全断开,只实现虚拟机与虚拟机之间的内部网络模式连接。默认模式下,虚拟机与虚拟机之间可以互相访问,虚拟机与主机之间不能访问。
不使用网络连接:即,虚拟机中没有网卡,相当于“单机”使用。

(2)简述,vmdk和.vmx文件的不同点。
答:VMDK是虚拟机存放文件的虚拟磁盘。即,虚拟机内的系统和所有文件都在这个文件中,相当于我们电脑主机中的硬盘。
VMX是虚拟机配置文件,虚拟机系统文件,可以通过该文件打开虚拟机以启动系统。

(3)Ubuntu应该建立几个分区?每个分区的大小是多少?
答:一般建立四个分区。分别是:
引导分区,分区类型为主分区,挂载点是/boot,分区大小是510MB,分区用于Ext4文件日志系统。
系统分区,分区类型为逻辑分区,挂载点是/,分区大小是10G(即10240MB),分区用于Ext4文件日志系统。安装系统和软件。
交换分区,分区类型为逻辑分区,分区大小是物理内存的两倍(即1024MB),分区用于交换空间。充当虚拟内存。Swap分区在系统的物理内存不够用时,把硬盘空间中的一部分空间释放出来,以供当前程序使用。
个人文件分区,分区类型为逻辑分区,挂载点是/home,分区大小是9696MB,分区用于Ext4文件日志系统。相当于“我的文档”。

(4)虚拟机捕获屏幕有什么作用?
答:可以捕获虚拟机系统当前屏幕的图片。
VMware虚拟机可以截取操作系统正常情况下无法截取的图片

第二章 习题

1.判断题

(1)Linux操作系统诞生于1991年8月。(错)

(2)Linux是一个开放源的操作系统。(对)

(3)Linux是一个类UNIX操作系统。(对)

(4)Linux是一个多用户系统,也是一个多任务操作系统。(对)

(5)Ubuntukylin-16.04默认的桌面环境是GNOME。(错)

(6)Ubuntu每一年发布一个新版本。(错)

(7)Ubuntukylin-16.04包含Office套件。(对)

2.简答题

(1)什么是Linux系统?
Linux是一套免费使用和自由传播的类UNIX操作系统。
Linux是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
LInux能运行主要的UNIX工具软件、应用程序和网络协议,支持32位和64位硬件。
LInux是一个性能稳定的多用户网络操作系统。
Linux本身只表示内核,但现实际用于形容基于内核且使用GNU各种工具和数据库的OS。

(2)简述Linux系统的产生过程。
1984年,GNU计划和自由软件基金会开发一个称为GNU的类UNIX系统,是自由软件的完整OS。
20世纪90年代初,GNU项目开发出的许多高质量的免费软件为LinuxOS的开发创造合适的环境。
1987年,MinixOS被开发且学习之风在各大学盛行。
1991年初,Linux系统创始者不满足于Minix的现有性能,打算开发一个新的免费OS
1991年4月,Linux系统创始者成功将Bash移植到Minix中。
1991年10月5日,Linux内核系统正式诞生。

(3)简述Linux的组成。
一般有四个主要部分:内核(核心)、shell、文件系统、应用程序。
内核:核心。有如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。
内核模块分为存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等。
Shell:系统的用户界面,提供了用户与内核进行交互操作的一种接口。接收用户输入的命令送入内核去执行,是一个命令解释器。
文件系统:是文件存放在磁盘等存储设备上的组织方法。文件是数据的集合。文件系统不仅包含文件中的数据,也包含文件系统的结构。
应用程序:指一套的称为应用程序的程序集。

(4)什么是Linux内核版本?举例说明版本号的格式。
内核是运行程序和管理硬件设备(磁盘、打印机等)的核心程序,提供一个在裸设备和应用程序间的抽象层。
Linux内核版本号命名规则:“主版本号.次版本号.修正号”。
其中,主版本号和次版本号标志重要的功能变动;修正号表示较小的功能变更。
次版本号是偶数,表示是稳定版的内核;次版本号是奇数,表示是测试版的内核。
例如:以2.6.22为例,2表示主版本号,6,表示次版本号,22表示修正号。
此处,次版本号为6,是偶数,即代表是稳定版的内核。否则,是奇数,代表测试版。

(5)写出3个常用的Linux发行版。
发行版:将内核,源代码及相关的应用程序组织构成一个完整的OS,让一般的用户可以简便地安装和使用Linux。
三个常用的Linux发行版:
1>Ubuntu:以Debian GNU/Linux不稳定分支为开发基础,首个版本于2004年10月20日发布。每6个月发布一个新版。
2>Red Hat Linux:Red Hat是最成功的Linux发行版本之一。安装和使用简单。
3>Debian Linux:迄今为止最遵循GNU规范的Linux系统。使用特有的软件包管理工具dpkg,使得安装,升级,删除和管理软件变得简单。是完全由网络上的Linux爱好者负责维护的发行套件。

(6)Ubuntu Linux 的特点是什么?
1>所有系统相关的任务均需使用sudo指令
2>系统易用,标准安装完成后(或Live CD启动完成后)就可立即投入使用
3>为Unity7新增一套用户桌面,增加了生动的应用图标、主题的登录及锁屏页面。
4>与Debian使用相同的deb软件包格式,可安装通用和兼容的绝大多数为Debian编译的软件包。
5>优化升级Dash,用户操作更便利。
6>新增微信网页版应用。

第三章 习题

1.判断题

(1)Ubuntu在2010年5月推出Unity桌面环境。(对)

(2)Chromium浏览器图标下的LibreOffice Writer图标相当于Office中的Excel。(错)

(3)Ubuntu系统的工具软件在安装前需要先更新,提供更新软件的网站就是更新源。(对)

(4)GNOME(GNU Network Object Model Environment)是GNU计划的一部分。(对)

(5)在Ubuntu Linux 16.04的桌面中有一个默认浏览器,即Firefox。(对)

第四章 习题

1.判断题

(1)超级用户的提示符是$ ,普通用户的提示符是#。(错)

(2)init 0 可以重新启动机器。(错)

(3)init 6 可以关闭机器。(错)

(4)init 1 可以重新启动机器。(错)

(5)Putty不支持IPv6连接,只支持IPv4连接。(错)

(6)OpenSSH可以支持多种认证模式,包括纯密码、公钥以及Kerberos票据。(对)

 2.简答题

(1)简述shutdown、halt、reboot、init命令的相同点与不同点。
相同点:都可以达到关机或重启系统的目的。

不同点:命令内部的工作过程不同。

shutdown 安全的关机命令:系统管理员会通知所有登录的用户系统将要关闭且login指令会被冻结,即新的用户不能再登录。根据使用的参数不同,可以直接关机或延迟一定时间的关机或重启。

halt 立即关机命令:即调用shutdown -h命令。执行halt命令时,将杀死应用进程,执行sync(同步内存和磁盘的数据)系统调用,文件系统写操作完成后就会停止内核。

reboot重新启动机器命令
工作过程和halt一样,不过,reboot是重启,halt是关机。

poweroff关闭系统后关闭电源命令:关闭计算机OS且关闭系统电源。poweroff就是指向halt命令的软连接。

init:是一个由内核启动的用户级进程,内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,通过启动一个用户级程序init的方式完成引导进程。init定义了7个运行级别,init 0为停机或关机;init 1为单用户模式,只root用户进行维护;
init 2为多用户模式,不能使用NFS(Net File System);init 3为完全多用户模式(标准的运行级别);init 4为安全模式;init 5为图形化(即图形界面);init 6为重启。

(2)请简述字符界面的优点。
占用系统资源少、性能稳定且安全。

第五章 习题

1.填空题

(1) Linux操作系统支持很多现代的流行文件系统,其中   Ext4   文件系统使用最广泛。

(2) Linux系统中,没有磁盘的逻辑分区(即没有C盘,D盘等),任何一个种类的文件系统被创建后都需要  挂载   到某个特定的目录才能使用,这相当于激活一个文件系统。

(3) Linux采用的是  树形  拓扑结构,最上层是根目录。

(4) 当前用户为ma,则登录后进入的主目录为 /home/ma 

(5) 查看文件的内容常用命令有: cat  more  less  head  tail 

(6)cp命令可以复制多个文件,将要复制的多个文件由 空格 分隔开。

(7)使用touch命令,创建一个  文件。

 (8) rm命令只能删除文件,不能删除目录,如果删除目录必须加参数 -r 

(9)管道的命令就是将操作符左侧命令的输出信息作为操作符右侧命令的 输入信息 

(10)命令$cd ~是切换到 当前用户的主目录 

2.问答题

(1) Ubuntu根目录下有哪些重要的目录?各存放了什么信息?

/etc    存放许多系统所需的重要配置与管理文件。/etc/network/interfaces存放配置修改网络接口的IP地址、子网掩码、网关的文件。/etc/resolv.conf存放指定DNS服务器的文件等

/dev    存放装置文件。包含所有在系统中使用的外部设备,每个设备在其下均有一个相应的项目,此处要注意存放的并非设备驱动程序,而是一个访问这些外部设备的端口。(其下还有一些项目是没有的装置,通常是在安装系统时所建立,不一定对应到实体的硬件装置,一些虚拟的装置也不对应到任何实体。如,空设备/dev/null,任何写入该设备的请求均会被执行、但被写入的资料均会如进入空设备般消失)

/boot    存放与系统激活相关的文件,是系统启动时用到的程序,不可轻易删除。initrd.img系统激活时最先加载的文件。vmlinuz为Kernel的镜像文件。System.map包括Kernel的功能及位置

/home    存放登录用户的主目录,以用户的名称作为该目录下各个子目录的名称

/lib    存放许多系统激活时所需要的重要的共享函数库,一般,.so为共享库,用于动态连接;.a为静态库,用于静态连接

/usr/lib    存放一些应用程序的共享数据库

/lost+found    用标准的 ext2/ext3/ext4 文件系统格式化过的分区都会有,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下,意外后找回的文件一般在这里面。但若是 xfs 文件系统,就不会存在这个目录

/mnt    一般情况下是空的,是系统默认的挂载点,可临时将别的文件系统挂在该目录下,不过需要在其下建立任一目录作为挂载目录

/opt    主要存放那些可选的程序。安装到该目录下的程序,它所有的数据、库文件等都是放在同一目录下

/proc    虚拟文件系统,不占用磁盘空间,其下文件均放置于内存中。(会记录系统正在运行的进程,硬件状态、内存使用的多少等信息,这些信息在内存中由系统自己产生)

/root    系统管理用户root的主目录

/bin    存放一些系统启动时所需要的普通程序和系统程序,及一些经常被其他程序调用的程序、存放常用的外部命令

/sbin    类似/bin,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,故而普通用户在必要且允许时可以使用,但一般不给普通用户使用

/tmp    存放系统启动时产生的临时文件,暂存有些应用程序执行中产生的临时文件

/var    存放被系统修改过的数据,/var/log存放记录文件信息,/var/spool存放新闻邮件信息,/var/run存放运行时信息

/usr    存放系统软件相关的数据

/srv    一些网络服务启动后,这些服务所需取用的数据目录,常见的服务例如WWW, FTP 等

/media    存放的是可移除的装置,包括软盘、光盘、DVD 等装置都暂时挂载于此

/sys    类似于/proc ,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息相关的信息。
包括目前已加载的核心模块与核心侦测到的硬件装置信息等。该目录同样不占硬盘容量
 

(2) Ubuntu下有哪些文件类型?

普通文件    属性表示为“-”。用户通常访问的文件
纯文本文件:文本文件:普通文件中一些内容可以直接读取的文件;

                      二进制文件:为系统准备的,可执行的文件,如cat;

                      数据文件:为运行中的程序准备的,如用户登录时,记录登陆信息的/var/log/wtmp文件

目录文件:  属性表示为“d”。即目录,相当于Windows中的文件夹

链接文件:   linux中两种链接方式:符号链接和硬链接。其中,符号链接相当于Windows中的快捷方式,属性表示为“l”

设备文件 :  Linux系统为外部设备提供一种标准接口,将外部设备视为一种特殊的文件,即设备文件。分为字符设备文件(属性表示为“c”,设备发送和接收数据以字符的形式进行)、块设备文件(属性表示为“b”,以整个数据缓存区的形式进行)

套接字文件:    属性表示为“s”。通常用于网络数据连接
管道文件:    属性表示为“p”。用于解决多个程序同时访问一个文件造成的错误。一般存放在/dev目录下。一般权限是:所属者有读写权限,所属组与其他用户只有读权限。
 

java程序设计与实践教程第二版课后答案,成功入职阿里

面试题

如何保证缓存与数据库的双写一致性?

面试官心理分析

你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?

面试题剖析

一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。

串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

Cache Aside Pattern

最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先更新数据库,然后再删除缓存

为什么是删除缓存,而不是更新缓存?

原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。

比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。

另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于比较复杂的缓存数据计算的场景,就不是这样了。如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,这个缓存到底会不会被频繁访问到?

举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次、100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有大量的冷数据。实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。用到缓存才去算缓存。

其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatis,hibernate,都有懒加载思想。查询一个部门,部门带了一个员工的 list,没有必要说每次查询部门,都把里面的 1000 个员工的数据也同时查出来啊。80% 的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询 1000 个员工。

最初级的缓存不一致问题及解决方案

问题:先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。

解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。

比较复杂的数据不一致问题分析

数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。完了,数据库和缓存中的数据不一样了…

为什么上亿流量高并发场景下,缓存会出现这个问题?

只有在对一个数据在并发的进行读写的时候,才可能会出现这种问题。其实如果说你的并发量很低的话,特别是读并发很低,每天访问量就 1 万次,那么很少的情况下,会出现刚才描述的那种不一致的场景。但是问题是,如果每天的是上亿的流量,每秒并发读是几万,每秒只要有数据更新的请求,就可能会出现上述的数据库+缓存不一致的情况

解决方案如下:

更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。

一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。这样的话,一个数据变更的操作,先删除缓存,然后再去更新数据库,但是还没完成更新。此时如果一个读请求过来,没有读到缓存,那么可以先将缓存更新的请求发送到队列中,此时会在队列中积压,然后同步等待缓存更新完成。

这里有一个优化点,一个队列中,其实多个更新缓存请求串在一起是没意义的,因此可以做过滤,如果发现队列中已经有一个更新缓存的请求了,那么就不用再放个更新请求操作进去了,直接等待前面的更新操作请求完成即可。

待那个队列对应的工作线程完成了上一个操作的数据库的修改之后,才会去执行下一个操作,也就是缓存更新的操作,此时会从数据库中读取最新的值,然后写入缓存中。

如果请求还在等待时间范围内,不断轮询发现可以取到值了,那么就直接返回;如果请求等待的时间超过一定时长,那么这一次直接从数据库中读取当前的旧值。

高并发的场景下,该解决方案要注意的问题:

  • 读请求长时阻塞

由于读请求进行了非常轻度的异步化,所以一定要注意读超时的问题,每个读请求必须在超时时间范围内返回。

该解决方案,最大的风险点在于说,可能数据更新很频繁,导致队列中积压了大量更新操作在里面,然后读请求会发生大量的超时,最后导致大量的请求直接走数据库。务必通过一些模拟真实的测试,看看更新数据的频率是怎样的。

另外一点,因为一个队列中,可能会积压针对多个数据项的更新操作,因此需要根据自己的业务情况进行测试,可能需要部署多个服务,每个服务分摊一些数据的更新操作。如果一个内存队列里居然会挤压 100 个商品的库存修改操作,每个库存修改操作要耗费 10ms 去完成,那么最后一个商品的读请求,可能等待 10 * 100 = 1000ms = 1s 后,才能得到数据,这个时候就导致读请求的长时阻塞

一定要做根据实际业务系统的运行情况,去进行一些压力测试,和模拟线上环境,去看看最繁忙的时候,内存队列可能会挤压多少更新操作,可能会导致最后一个更新操作对应的读请求,会 hang 多少时间,如果读请求在 200ms 返回,如果你计算过后,哪怕是最繁忙的时候,积压 10 个更新操作,最多等待 200ms,那还可以的。

如果一个内存队列中可能积压的更新操作特别多,那么你就要加机器,让每个机器上部署的服务实例处理更少的数据,那么每个内存队列中积压的更新操作就会越少。

其实根据之前的项目经验,一般来说,数据的写频率是很低的,因此实际上正常来说,在队列中积压的更新操作应该是很少的。像这种针对读高并发、读缓存架构的项目,一般来说写请求是非常少的,每秒的 QPS 能到几百就不错了。

我们来实际粗略测算一下

如果一秒有 500 的写操作,如果分成 5 个时间片,每 200ms 就 100 个写操作,放到 20 个内存队列中,每个内存队列,可能就积压 5 个写操作。每个写操作性能测试后,一般是在 20ms 左右就完成,那么针对每个内存队列的数据的读请求,也就最多 hang 一会儿,200ms 以内肯定能返回了。

经过刚才简单的测算,我们知道,单机支撑的写 QPS 在几百是没问题的,如果写 QPS 扩大了 10 倍,那么就扩容机器,扩容 10 倍的机器,每个机器 20 个队列。

  • 读请求并发量过高

这里还必须做好压力测试,确保恰巧碰上上述情况的时候,还有一个风险,就是突然间大量读请求会在几十毫秒的延时 hang 在服务上,看服务能不能扛的住,需要多少机器才能扛住最大的极限情况的峰值。

但是因为并不是所有的数据都在同一时间更新,缓存也不会同一时间失效,所以每次可能也就是少数数据的缓存失效了,然后那些数据对应的读请求过来,并发量应该也不会特别大。

  • 多服务实例部署的请求路由

可能这个服务部署了多个实例,那么必须保证说,执行数据更新操作,以及执行缓存更新操作的请求,都通过 Nginx 服务器路由到相同的服务实例上

比如说,对同一个商品的读写请求,全部路由到同一台机器上。可以自己去做服务间的按照某个请求参数的 hash 路由,也可以用 Nginx 的 hash 路由功能等等。

  • 热点商品的路由问题,导致请求的倾斜

万一某个商品的读写请求特别高,全部打到相同的机器的相同的队列里面去了,可能会造成某台机器的压力过大。就是说,因为只有在商品数据更新的时候才会清空缓存,然后才会导致读写并发,所以其实要根据业务系统去看,如果更新频率不是太高的话,这个问题的影响并不是特别大,但是的确可能某些机器的负载会高一些。

一线互联网大厂Java核心面试题库

image

,这个问题的影响并不是特别大,但是的确可能某些机器的负载会高一些。

一线互联网大厂Java核心面试题库

[外链图片转存中…(img-zg6MUcJ2-1626033066671)]

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等…已整理上传在我的腾讯文档【一线互联网大厂Java核心面试题库】点击即可领取,并会持续更新…感兴趣的朋友可以看看支持一波!

以上是关于Ubuntu Linux操作系统与实验教程(第二版)答案的主要内容,如果未能解决你的问题,请参考以下文章

Java高级:java程序设计与实践教程第二版清华大学

新视野大学英语1读写教程第二版课前听力

系统集成项目管理工程师教程 第二版下载,仅供学习交流使用

java程序设计与实践教程第二版课后答案,成功入职阿里

2017-2018-2 20165330 实验四《Android程序设计》实验报告

Linux学习路线+资源