第 71 期:佛教八苦
最后更新于
最后更新于
@Author : Lewis Tian (taseikyo@gmail.com)
@Link : github.com/taseikyo
@Range : 2024-07-14 - 2024-07-20
汉文帝遗诏
Linux系统下x86和ARM的区别有哪些?
Understanding Singleflight in Go: A Solution for Eliminating Redundant Work
佛教八苦
原文:
朕闻之:盖天下万物之萌生,靡不有死。死者天地之理,物之自然,奚可甚哀!当今之世,咸嘉生而恶死,厚葬以破业,重服以伤生,吾甚不取。且朕既不德,无以佐百姓。今崩,又使重服久临,以罹寒暑之数,哀人父子;伤长老之志,损其饮食,绝鬼神之祭祀,以重吾不德,谓天下何!朕获保宗庙,以眇眇之身托于天下君王之上,二十有余年矣。赖天之灵。社稷之福,方内安宁,有兵革。朕既不敏,常畏过行,以羞先帝之遗德;惟年之久长,惧于不终。今乃幸以天年得复供养于高庙,朕之不明与嘉之,其奚哀念之有!其令天下吏民,令到出临三日,皆释服。无禁取妇、嫁女、祠祀、饮酒、食肉。自当给丧事服临者,皆无践。经带无过三寸。无布车及兵器。无发民哭临宫殿中。殿中当临者,皆以旦夕各十五举音,礼皆罢。非旦夕临时,禁无得擅哭临。以下,服大红十五日,小红十四日,纤七日,释服。它不在令中者,皆以此令比类从事。布告天下,使明知朕意。霸陵山川因其故,无有所改。归夫人以下至少使。
翻译:
我听说天下万物萌发生长,最终没有不死的。死是世间的常理,事物的自然归宿,有什么值得过分悲哀呢!当今世人都喜欢活着而不乐意死,死了人还要厚葬,以致破尽家产;加重服丧以致损害身体。我认为很不可取。况且我生前没什么德行,没有给百姓什么帮助;现在死了,又让人们加重服丧长期哭吊,遭受严寒酷暑的折磨,使天下的父子为我悲哀,使天下的老幼心灵受到损害,减少饮食,中断对鬼神的祭祀,其结果是加重了我的无德,我怎么向天下人交代呢!我有幸得以保护宗庙,凭着我这渺小之身依托在天下诸侯之上,至今已二十多年。靠的是天地的神灵、社稷的福气才使得国内安宁,没有战乱。我不聪敏,时常担心行为有过错,使先帝遗留的美德蒙受羞辱;岁月长久了,总是担心不能维持始终。如今没想到能侥幸享尽天年,将被供奉在高庙里享受祭祀,我如此不贤明,却能有这样的结果,我认为就很好,还有什么可悲哀的呢!现在诏令全国官吏和百姓诏令到达后,哭吊三日就除去丧服。不要禁止娶妻、嫁女、祀、饮酒、吃肉。应当参加丧事、服丧哭祭的人,都不要赤脚。服丧的麻带宽度不要超过三寸,不要陈列车驾和兵器,不要动员民间男女到宫殿来哭祭。宫中应当哭祭的人,都在早上和晚上各哭十五声,行礼完毕就停止。不是早上和晚上哭祭的时间,不准擅自哭泣。下葬以后,按丧服制度应服丧九个月的大功只服十五日,应服丧五个月的小功只服十四日,应服丧三个月的缌麻只服七日,期满就脱去丧服。其他不在此令中的事宜,都参照此令办理。要把这道诏令通告天下,使天下人都明白地知道我的心意。葬我的霸陵周围山水要保留其原来的样子,不要有所改变。后宫夫人以下直至少使,都遣送回家。
问题:
最近在用三星的一款 i5 处理器的 Windows 平板,和 iPad,以及其他使用 ARM 处理器的手机相比,发热量大很多,甚至需要借助风扇来散热,耗电量也大了不少。
那么就很奇怪,在主频相差不大,并且实际执行效果差不多的情况下,x86 架构的处理器的发热量和功耗为什么会那么大? 这种差异到底是硬件以及处理器的指令集本身的问题,还是软件层面的问题?
回答 1:
说 x86 和 ARM 处理器 "实际执行效果差不多" 其实有所不妥。楼主也说了比较的几个设备主要是 windows 平板,ipad 和智能手机。这些平台上的程序都是移动环境下的应用,大多逻辑简单功能单一,没什么 "计算" 可言。ARM 处理器本身定位于嵌入式平台,应付轻量级、目的单一明确的程序,现在应用在移动设备上正是得心应手。x86 定位于桌面和服务器,这些平台上很多应用是计算密集型的,比如多媒体编辑、科研计算、模拟等等。因此将 x86 和 ARM 在移动环境下做对比得出 "差不多" 是不好的。
由于定位的不同,ARM 处理器基于精简指令集 (RISC) 架构。指令集数量少就可以简化硬件逻辑的设计,减少晶体管数量,也就意味着低功耗。而且由于移动平台应用通常简单,程序的控制流不复杂,执行效率没有必要很高,所以流水线、分支预测等硬件逻辑都比较简单。这些都降低了晶体管总量。同时因为移动设备有电池的能源限制,ARM 的电源管理是作为重要部分特别设计了的。比如移动设备的处理器在待机时通常只以极低的主频在运行,甚至可以暂时关闭闲置的核心、协处理器来降低功耗。
x86 就截然不同。x86 是复杂指令集 (CISC) 架构,存在很多机器指令,只为了高效地完成一项专门任务(比如 MMX, SSE 中的指令)。这就使得硬件的逻辑很复杂,晶体管数量庞大。为了高效地进行运算,x86 架构有较长的流水线以达到指令级并行(ILP)。长流水线带来的一个弊端,就是当遇到分支时,如果预载入分支指令不是未来真实的分支,那么要清空整个流水,代价较高。所以 x86 为此还必须有复杂的分支预测机构,确保流水线的效率。再加上多级 cache,支持超线程、虚拟化等等,x86 的复杂度其实相当高。
回答 2:
因为 ARM 是为了低功耗设计的,而 X86 是为了高性能。你想把 ARM 做到 X86 一样的性能,势必增加核心复杂度,增加指令集,到时候你猜 ARM 对 X86 还能有多少功耗优势? X86 精简核心规模抛弃部分指令集,一样也做到了功耗 5W 以下的 ATOM,你又要问为什么那些 X86 手机功耗高发热大,因为没有专为 X86 平台开发的手机 APP,你跑在 X86 手机上的 APP 全都是二次转换运行的,芯片一直高负载。你 ARM 手机一直高负载功耗不高发热不大?
ARM 和 x86 几大简单比较
处理器通常是指一台计算机的运算核心和控制核心。但是随着移动设备的兴起,处理器在智能手机和平板电脑等移动终端设备中的也逐渐兴起,让处理器市场的变化开始了。
英特尔是 PC 和企业级处理器市场上毋庸置疑的霸主,ARM 则是在移动终端市场发展起来的新兴霸主。英特尔专注高性能,为个人用户、企业用户提供出色的性能支持; 而 ARM 则专注低功耗,为手机和平板用户带来超长待机。这两个看似没有交集的企业为何会发展成如今对立局面呢
技术发展是两家公司直接竞争的主要原因,在 Web2.0 时代,Facebook、谷歌这些公司的崛起使得数据中心三大核心技术发生了改变,三大核心技术指的是:计算、存储和网络。
ARM 是如何满足数据中心需求的
低功耗是 ARM 处理器的一个优势,但是在面向企业级领域的时侯,其发现并没有 64 位架构处理器,于是在 2012 年 10 月 31 日 ARM 推出新款 ARMv8 架构 ARMCortex-A50 处理器系列产品,来满足企业级级市场应用的需求。
而为了弥补自己在企业级市场的经验劣势,ARM 还拉拢了原本跟英特尔同一阵营的 AMD.AMD 在服务器领域积累的相当多的成功经验,其拥有业界领先的 64 位微处理器技术以及广泛的知识产权组合与 OEM、ODM 和 ISV 合作的经验,将促进 ARM 在数据中心领域的扩展,满足数据中心领域的特定需求。
一、性能:
X86 结构的电脑无论如何都比 ARM 结构的系统在性能方面要快得多、强得多。X86 的 CPU 随便就是 1G 以上、双核、四核大行其道,通常使用 45nm(甚至更高级) 制程的工艺进行生产; 而 ARM 方面:CPU 通常是几百兆,最近才出现 1G 左右的 CPU, 制程通常使用不到 65nm 制程的工艺,可以说在性能和生产工艺方面 ARM 根本不是 X86 结构系统的对手。
但 ARM 的优势不在于性能强大而在于效率,ARM 采用 RISC 流水线指令集,在完成综合性工作方面根本就处于劣势,而在一些任务相对固定的应用场合其优势就能发挥得淋漓尽致。
二、扩展能力
X86 结构的电脑采用 "桥" 的方式与扩展设备 (如:硬盘、内存等) 进行连接,而且 x86 结构的电脑出现了近 30 年,其配套扩展的设备种类多、价格也比较便宜,所以 x86 结构的电脑能很容易进行性能扩展,如增加内存、硬盘等。
ARM 结构的电脑是通过专用的数据接口使 CPU 与数据存储设备进行连接,所以 ARM 的存储、内存等性能扩展难以进行 (一般在产品设计时已经定好其内存及数据存储的容量),所以采用 ARM 结构的系统,一般不考虑扩展。基本奉行"够用就好" 的原则。
三、操作系统的兼容性
X86 系统由微软及 Intel 构建的 Wintel 联盟一统天下,垄断了个人电脑操作系统近 30 年,形成巨大的用户群,也深深固化了众多用户的使用习惯,同时 x86 系统在硬件和软件开发方面已经形成统一的标准,几乎所有 x86 硬件平台都可以直接使用微软的视窗系统及现在流行的几乎所有工具软件,所以 x86 系统在兼容性方面具有无可比拟的优势。
ARM 系统几乎都采用 Linux 的操作系统,而且几乎所有的硬件系统都要单独构建自己的系统,与其他系统不能兼容,这也导致其应用软件不能方便移植,这一点一直严重制约了 ARM 系统的发展和应用。GOOGLE 开发了开放式的 Android 系统后,统一了 ARM 结构电脑的操作系统,使新推出基于 ARM 结构的电脑系统有了统一的、开放式的、免费的操作系统,为 ARM 的发展提供了强大的支持和动力。
x86 和 ARM 优缺点比较
一、背景知识
指令的强弱是 CPU 的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集 (CISC) 和精简指令集 (RISC) 两部分。相应的,微处理随着微指令的复杂度也可分为 CISC 及 RISC 这两类。
CISC 是一种为了便于编程和提高存储器访问效率的芯片设计体系。在 20 世纪 90 年代中期之前,大多数的微处理器都采用 CISC 体系,包括 Intel 的 80x86 和 Motorola 的 68K 系列等。 即通常所说的 X86 架构就是属于 CISC 体系的。
RISC 是为了提高处理器运行速度而设计的芯片设计体系。它的关键技术在于流水线操作 (Pipelining):在一个时钟周期里完成多条指令。而超流水线以及超标量技术已普遍在芯片设计中使用。RISC 体系多用于非 x86 阵营高性能微处理器 CPU,像 HOLTEK MCU 系列等。
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。而 ARM 体系结构目前被公认为是业界领先的 32 位嵌入式 RISC 微处理器结构,所有 ARM 处理器共享这一体系结构。
因此我们可以从其所属体系比较入手,来进行 X86 指令集与 ARM 指令集的比较。
二、CISC 和 RISC 的比较
(一)CISC
CISC 体系的指令特征
使用微代码。指令集可以直接在微代码存储器 (比主存储器的速度快很多) 里执行,新设计的处理器,只需增加较少的电晶体就可以执行同样的指令集,也可以很快地编写新的指令集程序。
庞大的指令集。可以减少编程所需要的代码行数,减轻程序员的负担。高级语言对应的指令集:包括双运算元格式、寄存器到寄存器、寄存器到存储器以及存储器到寄存器的指令。
CISC 体系的优缺点
优点:能够有效缩短新指令的微代码设计时间,允许设计师实现 CISC 体系机器的向上兼容。新的系统可以使用一个包含早期系统的指令超集合,也就可以使用较早电脑上使用的相同软件。另外微程序指令的格式与高级语言相匹配,因而编译器并不一定要重新编写。
缺点:指令集以及芯片的设计比上一代产品更复杂,不同的指令,需要不同的时钟周期来完成,执行较慢的指令,将影响整台机器的执行效率。
(二)RISC
RISC 体系的指令特征
精简指令集:包含了简单、基本的指令,通过这些简单、基本的指令,就可以组合成复杂指令。
同样长度的指令:每条指令的长度都是相同的,可以在一个单独操作里完成。
单机器周期指令:大多数的指令都可以在一个机器周期里完成,并且允许处理器在同一时间内执行一系列的指令。
RISC 体系的优缺点
优点:在使用相同的芯片技术和相同运行时钟下,RISC 系统的运行速度将是 CISC 的 2~4 倍。由于 RISC 处理器的指令集是精简的,它的内存管理单元、浮点单元等都能设计在同一块芯片上。RISC 处理器比相对应的 CISC 处理器设计更简单,所需要的时间将变得更短,并可以比 CISC 处理器应用更多先进的技术,开发更快的下一代处理器。
缺点:多指令的操作使得程序开发者必须小心地选用合适的编译器,而且编写的代码量会变得非常大。另外就是 RISC 体系的处理器需要更快的存储器,这通常都集成于处理器内部,就是 L1 Cache(一级缓存)。
综合上面所述,若要再进一步比较 CISC 与 RISC 之差异,可以由以下几点来进行分析:
指令的形成:CISC 因指令复杂,故采用微指令码控制单元的设计,而 RISC 的指令 90% 是由硬件直接完成,只有 10% 的指令是由软件以组合的方式完成,因此指令执行时间上 RISC 较短,但 RISC 所须 ROM 空间相对的比较大,至于 RAM 使用大小应该与程序的应用比较有关系。
寻址模式:CISC 的需要较多的寻址模式,而 RISC 只有少数的寻址模式,因此 CPU 在计算存储器有效位址时,CISC 占用的汇流排周期较多。
指令的执行:CISC 指令的格式长短不一,执行时的周期次数也不统一,而 RISC 结构刚好相反,故适合采用流水线处理架构的设计,进而可以达到平均一周期完成一指令的方向努力。显然的,在设计上 RISC 较 CISC 简单,同时因为 CISC 的执行步骤过多,闲置的单元电路等待时间增长,不利于平行处理的设计,所以就效能而言 RISC 较 CISC 还是占了上风,但 RISC 因指令精简化后造成应用程式码变大,需要较大的存储器空间,且存在指令种类较多等等的缺点。
(三)X86 指令集和 ARM 指令集
X86 指令集
X86 指令集是 Intel 为其第一块 16 位 CPU(i8086) 专门开发的,后来的电脑中为提高浮点数据处理能力而增加的 X87 芯片系列数学协处理器以及使用 X87 指令,以后就将 X86 指令集和 X87 指令集统称为 X86 指令集。虽然随着 CPU 技术的不断发展,Intel 陆续研制出更新型的 i80386、i80486,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以 Intel 公司所生产的所有 CPU 仍然继续使用 X86 指令集,所以它的 CPU 仍属于 X86 系列。由于 Intel X86 系列及其兼容 CPU 都使用 X86 指令集,所以就形成了今天庞大的 X86 系列及兼容 CPU 阵容。
除了具备上述 CISC 的诸多特性外,X86 指令集有以下几个突出的缺点:
通用寄存器组——对 CPU 内核结构的影响。X86 指令集只有 8 个通用寄存器,所以,CISC 的 CPU 执行是大多数时间是在访问存储器中的数据,而不是寄存器中的。这就拖慢了整个系统的速度。RISC 系统往往具有非常多的通用寄存器,并采用了重叠寄存器窗口和寄存器堆等技术使寄存器资源得到充分的利用。
解码——对 CPU 的外核的影响。解码器 (Decode Unit),这是 x86 CPU 才有的东西。其作用是把长度不定的 x86 指令转换为长度固定的类似于 RISC 的指令,并交给 RISC 内核。解码分为硬件解码和微解码,对于简单的 x86 指令只要硬件解码即可,速度较快,而遇到复杂的 x86 指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂。Athlon 也好,PIII 也好,老式的 CISC 的 X86 指令集严重制约了他们的性能表现。
寻址范围小——约束了用户需要。即使 AMD 研发出 X86-64 架构时,虽然也解决了传统 X86 固有的一些缺点,比如寻址范围的扩大,但这种改善并不能直接带来性能上的提升。
(2) ARM 指令集
相比而言,以 RISC 为架构体系的 ARM 指令集的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多。ARM 处理器都是所谓的精简指令集处理机 (RISC)。其所有指令都是利用一些简单的指令组成的,简单的指令意味着相应硬件线路可以尽量做到最佳化,而提高执行速率,相对的使得一个指令所需的时间减到最短。而因为指令集的精简,许多工作都必须组合简单的指令来完成,而针对较复杂组合的工作便需要由编译器 (compiler) 来执行,而 CISC 体系的 X86 指令集因为硬体所提供的指令集较多,所以许多工作都能够以一个或是数个指令来代替,编译器的工作因而减少许多。
除了具备上述 RISC 的诸多特性之外,可以总结 ARM 指令集架构的其它一些特点如下:
ARM 的特点:1) 体积小,低功耗,低成本,高性能; 2) 支持 Thumb(16 位)/ARM ( 32 位) 双指令集,能很好的兼容 8 位 /16 位器件; 3) 大量使用寄存器,指令执行速度更快; 4) 大多数数据操作都在寄存器中完成; 5) 寻址方式灵活简单,执行效率高; 6) 指令长度固定; 7) 流水线处理方式; 8) load-store 结构。
ARM 的一些非 RISC 思想的指令架构:1) 允许一些特定指令的执行周期数字可变,以降低功耗,减小面积和代码尺寸; 2) 增加了桶形移位器来扩展某些指令的功能; 3) 使用了 16 位的 Thumb 指令集来提高代码密度; 4) 使用条件执行指令来提高代码密度和性能; 5) 使用增强指令来实现数字信号处理的功能。
(四) 小结
因此,大量的复杂指令、可变的指令长度、多种的寻址方式这些 CISC 的特点,也是 CISC 的缺点,因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费的时间。除了个人 PC 市场还在用 X86 指令集外,服务器以及更大的系统都早已不用 CISC 了。x86 仍然存在的理由就是为了兼容大量的 x86 平台上的软件,同时,它的体系结构组成的实现不太困难。而 RISC 体系的 ARM 指令最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。优点是不言而喻的,因此,ARM 处理器才成为是当前最流行的处理器系列,是几种主流的嵌入式处理体系结构之一。RISC 目前正如日中天,Intel 似乎也将最终抛弃 x86 而转向 RISC 结构。而实际上,随着 RISC 处理器在嵌入式领域中大放异彩,传统的 X86 系列 CISC 处理器在 Intel 公司的积极改进下也克服了功耗过高的问题,成为一些高性能嵌入式设备的最佳选择,发展到今天,CISC 与 RISC 之间的界限已经不再是那么泾渭分明,RISC 自身的设计正在变得越来越复杂 (当然并不是完全依着 CISC 的思路变复杂),因为所有实际使用的 CPU 都需要不断提高性能,所以在体系结构中加入新特点就在所难免。另一方面,原来被认为是 CISC 体系结构的处理器也吸收了许多 RISC 的优点,比如 Pentium 处理器在内部的实现中也是采用的 RISC 的架构,复杂的指令在内部由微码分解为多条精简指令来运行,但是对于处理器外部来说,为了保持兼容性还是以 CISC 风格的指令集展示出来。
As developers, we often encounter situations where multiple requests are made for the same resource simultaneously. This can lead to redundant work, increased load on services, and overall inefficiency. In the Go programming language, the singleflight
package provides a powerful solution to this problem. In this post, we'll explore what singleflight
is, how it works, and how you can use it to optimize your Go applications.
1、What is Singleflight?
Singleflight is a pattern and corresponding package in Go's golang.org/x/sync/singleflight
library. Its primary purpose is to ensure that only one call to an expensive or duplicative operation is in flight at any given time. When multiple goroutines request the same resource, singleflight
ensures that the function is executed only once, and the result is shared among all callers. This pattern is particularly useful in scenarios where caching isn't suitable or when the results are expected to change frequently.
2、How Does Singleflight Work?
The mechanics of singleflight
are relatively straightforward. It provides a Group
type, which is the core of the singleflight mechanism. A Group
represents a class of work where you want to prevent duplicate operations. Here's a basic outline of how it works:
First Call Initiation: When the first request for a resource is made, singleflight
initiates the call to the function that fetches or computes the resource.
Concurrent Request Handling: If additional requests for the same resource come in while the initial request is still in flight, singleflight
holds these calls.
Result Sharing: Once the first request completes, the result is returned to the original caller and simultaneously shared with all other callers that were waiting.
Duplication Prevention: Throughout this process, singleflight
ensures that the function call is only made once, effectively preventing any redundant work.
5、Benefits of Using Singleflight in Go
Efficiency: By ensuring that only one request does the work, you avoid unnecessary load on your services and databases.
Simplicity: singleflight
abstracts the complexity of handling concurrent requests for the same resource, making your code cleaner and easier to understand.
Resource Optimization: It helps in optimizing the usage of memory and CPU, as the same computation is not repeated multiple times.
6、Implementing Singleflight: A Simple Example
To illustrate how singleflight
is used in Go, let's look at a simple example:
In this example, multiple goroutines request the same "expensiveOperation." With singleflight
, the operation is executed only once, and the result is shared among all the callers.
7、Considerations and Best Practices
Error Handling: Ensure that your application correctly handles scenarios where the shared function call results in an error.
Key Management: The effectiveness of singleflight
depends on the proper identification and differentiation of keys representing unique work.
Monitoring: Implement proper logging and monitoring around singleflight
calls to understand its impact and behavior in your application.
8、Advanced Example
An advanced example of using the singleflight
package in Go would involve a real-world scenario where you're fetching data from an external API or database. In this example, we'll create a caching layer for a hypothetical weather service. This service fetches weather data for a given city. If multiple requests for the same city occur simultaneously, singleflight
ensures that only one request is made to the external service, and the result is shared among all callers.
Here's how you might implement this:
In this advanced example:
We simulate a weather service that fetches data from an external API.
The WeatherService
struct holds a singleflight.Group
and a cache implemented with sync.Map
.
The GetWeather
method first checks the cache for existing data. If the data isn't there, it uses singleflight
to ensure that only one request is made to the external service for the same city.
Multiple goroutines simulate concurrent requests for the same city's weather data.
This advanced example demonstrates how to use singleflight
to avoid redundant external API calls, a common and practical scenario in web services and microservices architecture. It also adds caching to further optimize performance and reduce unnecessary work.
Singleflight is a powerful tool in the Go programmer's arsenal, offering a simple yet effective way to eliminate redundant work and optimize the performance of concurrent applications. By understanding and implementing this pattern, you can ensure that your Go applications are efficient, robust, and maintainable. Whether you're dealing with high traffic web applications, microservices, or any system with overlapping requests, singleflight
can significantly enhance your system's performance and reliability. Happy coding!
一、佛教八苦 佛教八苦是佛教用语,拼音为。佛教云:"人生八苦",即是:
生苦
老苦
病苦
死苦
爱别离苦
怨憎会苦
求不得苦
五阴炽盛苦,五阴即是五蕴,五阴集聚成身,如火炽燃,前七苦皆由此而生
二、生苦
生之苦,人多不复记忆,事实上,十月胎狱之苦,且不必说,即出生之际,一个六磅八磅重的婴儿,通过狭窄的生门,这痛苦已非言语所可形容。脱离母体之后,为外界灼热或寒冷的空气所刺激,被接生者巨大的手掌抓来提去,这对婴儿细嫩的肌肤而言,其痛苦较皮鞭抽体尤有过之。婴儿出生后呱呱大哭,实是肉体上的痛苦所引起的。
三、老苦
唐人诗云:"公道人间惟白发,贵人头上不曾饶。" 老,是任何人无以避免的。韩愈祭十二郎文云:"吾年未四十,而视茫茫,而发苍苍,而齿牙动摇" 四十如此,未免早衰。但即使天赋过人,或摄生有术,到了七十岁八十岁,上述现象总会发生。又何况一般人在苦苦奔波了数十年之后,除了生理机能衰退外,因过去劳苦积累而贻留的腰酸背痛风湿胃病等等,都是使人难以忍受的痛苦,至于衰老对于女人,则更为残酷,因为除了生理的痛苦外,女人更有着青春消逝的心理的痛苦。由明眉皓齿,倾城倾国而鸡皮鹤发,老态龙钟,固然使人感慨,但谁又能逃出这个老的公例?
四、病苦
人自呱呱堕地之日起,就与病结下不解之缘。少年的病如天花麻疹,中年的病如胃溃疡肺结核,老年的病如高血压心脏病,也许有人说,科学进步,新药日出,只要有钱,何愁治不好病?其实不然,特效药固然层出不穷,新的疾病也日有所见,如小儿麻痹症,癌症,在近年来日渐增多。进一步说,即是药物能治愈身体上的疾患,但由于社会竞争剧烈而致精神紧张憔虑所引起的神经衰弱,精神分裂,妄想狂,躁郁狂等心理上的疾病,又岂是药石所能奏效的?
本来四大假合之身,难免有寒热失调的时候,病了,就要躺在病榻上挨受痛患,短时间还好受,倘长年缠绵病榻,日与药物为伍,这种痛苦,岂可言喻?
五、死苦
一部钢铁铸成的机器,其寿命也不过由数年到数十年,一个血肉之躯的人,到底能支持多久?秦皇汉武求长生之药,只留下千古笑柄。盖宇宙万象,生住异灭,周而复始。有生就有死,有成就有坏,法尔如是,安有例外?佛经上说,非想非非想天,寿长八万四千大劫,但报终仍当堕落,不出六道轮回。
既然如此,则死之于人,也就不足为异了!无奈 "壮志未酬身先死",每一个死者都有他尚未完成的壮志,因之世界就有多少死不瞑目之人,同时死前肉体上和精神上的痛苦,四大分离,呼吸困难,心里有千言万语,一句也说不出来。这时娇姿稚子,环绕榻前,生死离别,凄惨无比,尤以将死未死之际,这一生所作所为,善善恶恶,一一自脑海映过。对于那些善的,无愧于心的,会感到欣慰宁静,但对那些恶的,有背天理良心的,将会感到懊悔,痛苦和恐怖。这时因痛苦恐怖而感召地狱相见,神识受业力牵引,堕入恶道,所谓"万般带不去,唯有业随身" 人之痛苦,尚有甚于此者乎?
六、爱别离苦
语云:"乐莫乐兮新相知,悲莫悲兮生别离," 生死离别,人间惨事,青春丧偶,中年丧子,固然悲痛万分,即使不是死别,或为谋求衣食,或因迫于形势,与相亲相爱的人生离,也将感到痛苦。然而,天下没有不散的筵席,亲如父子,近如夫妇,亦难得终身相守,又何况其他呢?万法无常,爱别离之苦,是谁也无可避免的。
七、怨憎会苦
和爱别离苦相对的,是怨憎会苦。意气相投的朋友,海誓山盟的爱人,恩爱情深的夫妻,或膝下承欢的子女,或生离,或死别,一切不能自主。但相反的,那些面目可憎,语言乏味;或利害冲突,两不相容的人,偏又聚会在一起。像这些可厌可憎的人,能够终身不见,岂不眼前清净?无奈社会上人事问题,繁杂万端,"不是怨家不聚头",在某些形势下,愈是互相怨憎的人,愈被安排在一起,如影随形,好像再也没有分散的时间,这岂不是令人苦恼万分?
八、求不得苦
想获得某一件东西,经济力量达不到;想谋求某一个位置,僧多粥少谋不到。甲男爱上了乙女,乙女却属意于丙男。自己的志趣是做计算机行业精英,但为了吃饭却不得不委曲在网吧做侍应生。这些都是求不得苦。莫说求不得,即使第一个愿望求得,第二个愿望又立即生出来。山谷易满,人欲难平,谁会感觉到自己一切都满足了呢?不满足,即有所求,求而不得,岂不苦恼?
九、五阴炽盛苦
五阴即是五蕴,五阴集聚成身,如火炽燃,前七苦皆由此而生。
色阴炽盛,四大不调,而有疾病之苦
受阴炽盛,领纳分别,使诸苦转本加极
想阴炽盛,想相追求,而有爱别离,怨憎会,求不得诸苦
行阴炽盛,起造诸业,又为后来得报之因,且因行而迁流不停,而有老衰之苦
识阴炽盛,起惑造业,三世流转,而有生死之苦。
佛教中有时又把苦分为苦苦、坏苦、行苦的三类。
苦苦:是我们生活中感受到的痛苦,佛经中即使没有指出,我们也是认为是苦的,这有生理上引起的出生的痛苦、衰老的痛苦、病变的痛苦、死亡的痛苦;由社会环境引起的爱别离苦:即亲爱的人不能厮守在一起;求不得苦:是所求不能如愿;怨憎会苦:是怨家路窄,低头不见抬头见。以及五蕴炽盛苦:即五蕴身心不平衡的痛苦。
坏苦:是指我们通常快乐的感受。以佛法的智慧来看,我们所谓的快乐受并非真正的快乐,其实质也是痛苦的。例如我们饥饿时想吃,吃饱了就觉得快乐,但如果继续吃下去,还会觉得快乐吗?身体脏了,洗澡觉得快乐,但长时间在水里泡着觉得快乐吗?无聊时看电视觉得快乐,但没日没夜的看下去觉得快乐吗?由此可见我们的所谓快乐,是因为我们有了某种欲望之后,通过外境的刺激得到满足心理上出现暂时的平衡,于是我们觉得快乐,然而吃饭的实质并非快乐,倘若吃饭的实质是快乐的话,无论吃多少都应该觉得快乐,然而事实不然,当我们带着强烈的欲望吃馒头时,吃一个、两个、三个感到快乐,吃到四个、五个、六个时,你会发现此时已由原来的快乐转变为痛苦了。吃饭是这样,世间上一切通过欲望得到的快乐莫不如此,因为这种乐受能变坏,因此称为坏苦。
行苦:行,是迁流变化义。世间一切都是无常变化,这乃是宇宙人生之规律。但世人不识这种规律,追求永恒:希望身体永恒、家庭永恒、婚姻永恒、事业永恒、人际关系永恒、爱情永恒,事实上世间没有一样永恒的东西,世事无常,美好的事物往往是昙花一现,转瞬即逝。由于我们的认识与世间的事实——行,相违背,因而就有了行苦。
总之,娑婆世界,一切莫非是苦。