"几人行" 发布的文章

为了更加方便的整理笔记,在本地实现了笔记管理,大量的时间被项目占用,笔记也仅留存到本地,暂时停更,还请见谅。

1. 部署

https://jumpserver.readthedocs.io/zh/docs/setup_by_fast.html
jms_core部署在宿主机,需要在container之前启动
容器中

2. 维护

自动部署脚本会下载py3的虚拟环境,启动jms_core的时候依赖该虚拟环境
安装目录:/opt/jumpserver

  ~]# source /opt/py3/activate  # 激活python虚拟环境
  ~]# /opt/jumpserver/jms start -d  # 启动jms_core服务
  ~]# docker start jms_koko
  ~]# docker start jms_guacamole
断电等异常情况会导致jms_core启动失败,需要手动启动jms_core服务

我的青春里没有爱情。
关于这样的一句话的展开我想写很久了,一直没有开始。我知道,我不能回避我的懒惰和对世界的认知程度之低,没有意识到学习需要目标,也没有更快更有效的通过学习获得自己想要获得的能力。

起初,我想围绕这句话去叙述我喜欢了很久的一个女孩,那时候我在高中。只是有想做这么一件事的念头,并非是很强烈。后来有一段时间网络泛起了对曾经青春美好回忆的热潮,一时间铺天盖地的都是青春里的爱情。一点不夸张的说,我很羡慕主角儿都能在那样的年龄里去经历一场情感纠葛的风暴,而处在风暴之外的我很想说,青春里的懵懂、悸动被这样夸张放大是刺向我灵魂的利剑。我在初中的时候就知道,金钱是维系一段感情的基础,‘经济基础决定上层建筑’不能读一读就结束了。生于农村,长于城乡结合部,活在市井的我和我们不管是出于畏惧,亦或是出于自知都应该知道,在不对的年龄,感情的萌芽就像是地雷的引信逐渐被拉开,引信拉开后的结果就是,‘嘭’的一声血肉横飞。恰好我是属于又畏惧又自知的那一类,毕竟穷这个字儿离我太近了,近到只需想一下,准备给喜欢的女孩送什么生日礼物?这个念头就能把所有的假设全部摧毁。即使我的的勇气似有千军万马支撑,在实际情况下也会溃不成军,夺路而逃。这就是我的认知,我一直知道我很穷,包括金钱的缺乏和知识的贫瘠,还有对未来的一无所知。我一直没有足够多的勇气来支撑我的表达方式,我不能简单的说’我有一颗红心两手准备‘。对我来说,我想在能力和认知相匹配的时候去做把握大一些的事情,我不喜欢赌,赌一把也许能赢,但未必守得住。柴米油盐酱醋茶背后的有多少辛酸的故事无需一一展开,但是琴棋书画诗酒花是靠想象就能有的吗?

距离想写这么一段话的念头的那一刻,近三千日子从身旁奔袭而过,我甚至看不清自己奔跑时的模样。似乎一直就是在埋头狂奔,很多次都奔到了另一个方向,我不知道究竟是什么样的力量把我从另一个方向不断的纠正,我猜测这股力量叫‘自知’,也许还掺杂着不少对生活的‘畏惧’。

我的青春里没有爱情。我觉得这句话不应该夹杂失落的情绪,没有不代表不好,当然也不应该是喜极而泣,至少在很多人看来,年轻才有理由肆无忌惮。我也想过以怎样的语气才能让这句话听起来不伤感、不侥幸,奈何才疏学浅,很多次读出来都是牵强的苦笑,因为我的目标被别人实现了。我并没有觉得受到灵魂上的打击,也没有觉得很遗憾,只是目标突然消失难免会有些不适应。这整个自我迭代的过程中,也许会很累,也许会不知所措,也许会对自己有更清晰的认识,知道自己想要成为什么样的人。

太多设计内核代码段,特别是数据结构相关,没有进行仔细阅读,仅挑了部分浅显易懂的部分记录,还需要加强学习。正在阅读《深入理解Linux内核》,不求能看懂多少,像看小说那样打发时间就挺好。

操作系统原理(Linux篇)
LInux内核主要由5个子系统组成:
进程管理
存储管理
文件管理
网络管理
进程间通信

Linux进程组成:
正文段:
存放进程要执行的代码,只读。
用户数据段:
进程直接操作的所有数据,包括进程运行处理的数据段和进程使用的堆栈。
系统数据段:
存放一个反应进程状态和运行环境的所有数据,这些数据只能由内核访问和使用,在系统数据段中包括进程控制块PCB。(PCB是一个名为task_struct的结构体,成为任务结构体,task_struct大约1000B,成员和功能归纳为9个方面)

1. 进程状态标志state和flags
2. 进程的标识,标识进程标识的成员:pid、uid、gid等
3. 进程的族亲关系,p_opptr,p_pptr,p_vsptr,p_cptr,p_osptr
4. 进程间的链接信息:Next_test,Prev_task.....
5. 进程间调度信息
6. 进程间时间信息
7. 进程的虚拟信息
8. 进程的文件信息
9. 与进程通信有关的进程

进程的上下文:
进程的运行环境是动态变化的,在Linux中把进程的动态变化的环境总和成为进程上下文。

1. 当前进程
2. 进程切换
3. 上下文切换
4. 进程通过系统调用执行内核代码时,内核运行是为进程服务,所以此时内核运行在进程的上下文中。

系统上下文:
内核除了为进程服务,也需要为操作系统本身任务服务,如响应外部设备的中断,更新相关定时器,重新计算进程优先级等。故把系统在完成自身任务时的运行环境成为系统上下文。

Linux中的进程都是由当前进程使用系统调用fork()创建的,而实际上fork()中进一步调用内核函数do_fork()来完成。

Linux信号的作用和种类:
信号机制
采用信号机制在进程间通信时传送的只是一个成为信号的数据,他不能传递更多的其他信息。

1. 信号的主要作用是把系统中发生的某些事件通知给进程。
2. 信号的主要特征是它的异步性,即什么时候出现信号是不可预知的。
3. 信号的数量与机器平台等有关,它与硬件平台的字长对应,如80x86的字长为32位,则信号有32种。
4. 系统中的每个信号都是一个整数,称为信号值,Linux通过宏定义给每个信号量定义了一个符号常量,称为信号名,以SIG开头。

5. 进程可以同时处理多个信号。
6. 每种信号在signal中只有一位,故不能识别接收了一个还是多个信号。
7. 信号没有优先级,可以以任意顺序处理接收到的信号

进程接收到信号处理的两种方式:

1. 交给内核进行处理
2. 有进程自行处理

Linux管道的概念
管道是Linux进程间通信的手段,管道实际上就是一种共享文件,所以管道的机制是以文件系统为基础实现的,数据在管道中以先进先出的方式,并以字符流的形态传送。

管道有两种:
匿名管道:只能在父子进程间通信
匿名管道与一般的文件不同,它没有纳入文件系统的目录,不占用外存空间,仅适用内存作为数据传输的缓冲区。缓冲区的大小决定每次写入管道的字节数,该值由全局符号常量PIPEBUF确定,缺省值为一个物理页面。
命名管道:可以在任意进程间通信
对称FIFO管道,与匿名管道的区别是,命名管道有文件名,在文件系统中可见,可以实现任意进程间通信。
~]# mkfifo myfifo #创建一个命名的管道文件

分页存储管理:
把进程的地址空间划分为大小相等的片段,成为页或页面,相应的内存空间也分为页面相同大小的若干块,成为物理块或帧。
内存页面大小必须适中,若页面太小,减少了内存碎片的总空间,有利于提高内存的利用率,但是会使每个进程要求较多的页面,从而引起页表过长,占用大量内存,此外还会降低页面换进换出的效率。若选择较大页面,虽然可以提高页面换进换出的效率,但是会使页面碎片增大,因此页面的大小选择适中,X86架构中默认是4K

页表:
OS为每个进程建立一张页面与物理块号的对照表,以便实现地址映射。页表在内存中占有一块固定的存储区,页表的大小由进程或作业的长度决定。

用于控制和历内存的硬件机制成为存储器管理单元MMU(Memory manage Unit)
80x86具有两种存储管理模式

1. 实时地址模式
2. 受保护的虚拟地址模式

内存的最大容量由物理地址长度决定,80x86机器的地址总线为32bit,2^32约为4GB

文件与文件系统
文件:具有文件名的一组信息组合,包括两部分
文件体:文件本身的信息
文件说明:文件存储和管理信息;如文件名、文件内部标识、文件存储地址、访问权限、访问时间等

文件的种类:

  1. 按用途分类:
    系统文件
    库文件
    用户文件

  2. 按保护级别分类(根据限定的使用文件的权限)
    执行文件
    只读文件
    读写文件

  3. 按信息流向分类(物理设备的特性决定了文件信息流向)
    输入文件
    输出文件
    输入输出文件

  4. 按文件的性质分类
    普通文件
    目录文件
    块设备文件

  5. 按文件的组织结构分类
    由用户组织的文件称为逻辑文件:流式文件、记录文件
    文件在存储介质上的组织方式称为文件的物理结构(物理文件)、顺序文件、链接文件、索引文件

文件系统的三个部分:
管理软件
被管理软件
相关的数据结构

文件的逻辑结构:
用户观察到的文件组织形式,是用户可以直接处理的数据结构,它独立于物理特性,又称为文件组织

分类:

  1. 有结构记录式文件(数据库):包含若干顺序、排列的记录
    变长记录:数据项、字段不同;数据项本身不同
    定长记录:文件长度=记录总个数X记录长
  2. 无结构字符流式文件:文件的信息不组成记录,文件的长度即为字符总个数(源程序、文本文件)
    文件的物理结构:
    物理结构:文件在外存上实际的组织形式
    物理块:以物理块为基本单位分配和传输信息,物理块大小由存储设备和OS确定。
    物理块的大小与逻辑记录大小之间不一定一致

文件物理结构的几种形式

  1. 顺序结构(顺序文件或连续文件)
    一个文件在逻辑上连续的信息被存储在磁盘上相邻的块上,逻辑记录与磁盘块的顺序相一致

    优点

    存取速度快,结构简单,支持顺序存取和随机存取。

    存在的问题:

    磁盘的存储空间利用率不高,容易产生磁盘碎片
    对输出文件很难估计需要多少磁盘块
    影响文件的扩展

  2. 链接结构(链接文件或者串联文件)
    基本思想:将文件存放在外存中若干个物理块中,这些块不必连续,每个块的最后一个单元用作指针指向下一个物理地址,最后块的指针使用特殊字符标识文件结束,从而将同一个文件的物理块链接起来。
    优点:解决了顺序结构中的所有问题,监理文件不必考虑文件的长度,文件可以继续扩展,便于在文件的任何位置插入或删除一个记录。
    缺点:

     1. 采用随机存取的方式是低效的,文件只能按指针链接
     2. 可靠性问题,如指针出错
     3. 链接指针占用一定空间
     4. 读一块信息时,应将其中的指针分离出来,保证用户信息的正确性。
    
  3. 索引结构(索引文件)
    基本思想:为每个文件建立一张索引表,每一表相记录文件所在的一个物理块。
    优点:能方便的实现文件的扩展,记录的插入和删除。
    缺点:必须增加索引表占用的空间和读写索引表的时间,索引表的查找策略对文件系统效率影响很大。

索引表的管理:
 当索引表非常大的时候,需要多个磁盘块存放,个磁盘块之间可以使用指针串联起来,当随机存取某个记录时,可能要沿链接文件搜索才能找到该记录的存放地址,很费时间。

EXT2文件系统构造
一个文件系统一般使用块设备的一个独立逻辑分区。EXT2文件系统把它所用的磁盘逻辑分区划分为若干块组(Block Group),并从0开始编号,每个块组包含若干数据块,每个块组除了数据块之外,包括5种用于管理和控制的信息块:超级块、组描述符表、块位图、inode位图、inode表。这些信息位于块组的前部,后面是文件的数据块。
EXT2的超级块(Super Block)用来描述EXT2文件系统整体信息的数据结构,主要描述文件在逻辑分区中的静态分布情况,以及描述文件系统的各个组成结构的尺寸、数量等。所有块组中包含块的内容是需要把超级块的内容复制到内存缓冲区内。

EXT2超级块由两部分组成

1. 基本超级块:EXT2文件系统的整体静态信息
2. 扩充块:反应所在块组的某些动态特性

超级块本身占用一个物理块1024B
基本块占84B
扩充块占20B
剩余的920B定义为元素长度为4B的数组reserved[230],作为备用

组描述符
记录每个块组的描述信息(在文件分配磁盘空间时需要使用到这些信息),这些组描述符集中在一起就形成了组描述符表。组描述符表可能占用多个物理块,和超级块一样的是,每个快中组块中,块组描述符的信息是完全相同的,而且它的内容也要读入内存。

块位图:记录块组的数据块的使用情况,它占用一个物理块。

因此,一个块组中数据块的最大数量是一个物理块的8倍,对于1024的物理块而言,其块位图就有1024*8位,表示8K个数据块,也就是说,一个块组的数据区最大容量是8M,如果EXT2文件系统使用的逻辑分区为100M,则它可以划分为12个块组,系统运行后,块位图装载进一个高速缓冲中,但是由于高速缓存空间有限,故只能装入常用的8块(缺省值)位图。

inode表和inode位图
inode表:一个块组的所有文件的inode集合,他可能占据多个物理块,每个块组可以包含的inode数目由超级块成员项s_inoders_per_group给出。
inode位图:反应了inode表中各项的使用情况,它的每一位表示inode表的一项,1为使用,0为空闲,与块位图相似。inode位图也装入一个高速缓冲中。

EXT2文件系统的物理结构
EXT2文件系统系统默认的物理块尺寸为1K,EXT2的块地址长度4B,所以每个间接块的索引表可以包括1024/4=256个物理地址。
直接地址:允许文件不大于12K
一次间接地址:当文件大于12K时使用,允许文件长达256K+12K
二次间接地址:当文件大于256K+12K时使用,允许的文件长达256256K+256K+12K
三次间接地址:当文件大于256
256K+256K+12K时使用,允许文件长达256256256K+256256K+256K+12K=16G+64M+256K+12K

实际上,32bit操作系统单个文件最大支持到4G

EXT2文件系统按照文件的逻辑块号为索引值查找数据块,逻辑块依次从0开始编号。

虚拟文件系统VFS(虚拟文件转换技术)
VFS屏蔽了各种文件系统的差异,为处理各种不同文件系统提供了统一的接口,在VFS的管理下,Linux能访问各种文件系统而且实现了各种文件系统间的互访。

VFS的工作原理
物理文件系统:Linux支持各种文件系统如minix、ext2、ISO、nfs等被称为物理文件系统。
虚拟转换机制(VFS)
不同的物理文件系统有不同的组织结构和不同的处理方式,为了能够处理各种不同的物理文件系统,操作系统需要把他们的特性进行抽象,把各种不同物理文件系统转换为一个具有统一共性的虚拟机文件系统,这种转换机制称为虚拟文件系统转换,即VFS。
VFS不是实际的文件系统,它提供了处理各种物理文件系统的公共接口,通过这个接口使得不同的文件系统看起来都是相同的。

VFS超级块和VFS inode结构

  1. VFS超级块的作用是把在各种文件系统中的表示文件在逻辑分区中的静态分布情况转换成统一的格式。
  2. VFS inode作用是吧不同文件系统的活动文件管理信息,如文件类型、文件尺寸等转成统一的格式。
  3. 公共操作函数接口,当进程向系统发出文件操作请求时,该文件可能是某个物理文件系统中的一个文件,内核通过VFS公共操作函数接口转换到该文件系统的相应操作函数。

VFS超级块
VFS超级块是在文件系统安装时由系统在内存中建立的,对于每一种已安装的文件系统,在内存中都有与其对应的VFS超级块,各种文件系统的超级块都是一个super_block结构体。里面的数据是在安装时由读取超级块的例程read_super()把某种文件系统的管理信息写入它的VFS超级块中。

VFS超级块主要包含以下几种信息

  1. 文件系统的组织信息,如文件系统所在的设备号、块大小、块位数、文件系统署名等。
  2. 文件系统的注册和安装信息
  3. VFS超级块的前面各个成员项表示的是各种文件系统的公共信息,不同文件系统的特有信息则由联合体u的各个成员表示。
  4. 指向对超级块进行操作的函数指针。

I/O控制方式
CPU控制方式

  1. 程序直接控制方式
    CPU一直对控制干预
  2. 中断控制方式
    CPU以字节为单位对I/O控制干预
  3. DMA方式(Direct Memory Access)
    CPU以一组数据块干预I/O控制
    DMA方式又称为直接存取方式
    其基本思想是在外围设备和内存之间开辟直接的数据交换通道,在DMA方式中,I/O控制器具有比中断方式和程序直接控制方式更强的功能,DMA控制器中还包括传送字节计数器,内存地址寄存器等。

通道控制方式

  1. I/O通道:一种硬件机制,指专门用于I/O工作的处理机,它有自己的简单与I/O操作相关的指令系统,如数据传输、设备控制等,通道执行的程序为通道程序。

  2. 通道方式的处理过程:CPU向通道发出一条I/O指令,通道接收到指令后,从内存中取出本次要执行的通道程序,然后执行该通道程序,仅当通道完成了规定的I/O任务后,才向CPU发出中断信号,可以提高CPU与I/O的并行处理能力。

  3. 通道分类,按信息交换的方式分为三类:
    a. 字节多路通道(中低速)(分时):字节为单位
    b. 数据选择通道(高速):以块为单位
    c. 数组多路通道(中高速)(分时):以块为单位

  4. 瓶颈问题(通道不足)措施
    a. 提高I/O设备的独立性,减少通道占用的时间,通常的方法是在设备和控制器间增设缓冲。
    b. 增加通路,增加设备到知己之间的通路是解决瓶颈问题的有效方法,即把一个设备连到多个控制器上,而一个控制器又被连接到多个通道上。

缓冲技术
缓冲技术的引进解决了以下问题

1. CPU与I/O设备间速度不匹配
2. 减少CPU的中断频率
    防止每接收一次数据就中断一次,先将数据放入缓冲区内,待满时再中断CPU,从而减少了中断次数。
3. 提高CPU和I/O设备的并行性
     例如将打印机工作时CPU继续进行计算工作

缓冲的种类

  1. 硬件方式
    一般采用硬件缓冲器,如I/O控制器中的数据缓冲寄存器,成本较高,除关键部件外一般不采用。

  2. 软件方式
    在内存中开辟出一个具有N个单元的专用缓冲区,以便存放输入输出数据。
    操作系统为每一个缓冲区建立一个数据结构,成为缓存控制块BCB(buffer control block),操作系统通过BCB对没一个缓存实施具体的管理。

缓冲的使用方式
专用缓冲:为某设备/进程专门设置的。
公用缓冲:为所有设备/进程设置的,为所有的设备/进程所共享。

缓冲的组织形式
单缓冲
双缓冲
循环缓冲
缓冲尺

设备处理程序与I/O进程
设备处理程序包括驱动程序和I/O中断处理程序。I/O处理程序通常是由I/O进程完成的

设备处理程序
设备处理程序是负责直接控制设备完成实际的I/O操作程序,设备驱动程序直接和硬件打交道。设备驱动程序包括对硬件的各种操作,在操作系统的控制下,CPU通过执行驱动程序来实现对设备底层硬件的处理和操作。

I/O进程
为了能够在处理机上执行设备处理程序,当前许多操作系统都设置了专门完成I/O操作的进程,属于系统进程。在不同的操作系统中,处理I/O操作和配置I/O进程的方式不同,大体可以分为三种

1. 为每一类设备设置一个进程,它专门执行这类设备的I/O操作。
2. 在整个系统中设置一个功能进程,专门负责对系统中所有的各类设备的I/O操作,也可以设置一个输入进程和一个输出进程,分别处理系统中的所有的各类设备的输入或输出操作。
3. 系统为每台设备建立一个I/O进程,它们分别执行设备各自的处理程序,被大多数操作系统采用。

I/O进程一般在系统生成的时候被创建,平时处于睡眠等待状态。I/O进程在两种情况下呗唤醒。

1. 当用户进程发出设备请求(I/O请求)
2. 出现I/O中断

Linux设备分类
字符设备:以字符为单位,输入输出数据的设备,并且以字符为单位对设备中的信息进行组织和管理。如显示器或者键盘等。

块设备:以一定大小的数据盘为单位输入输出数据,并且设备中的数据也是以物理块为单位进行组织管理的,如硬盘等。

网络设备:通过网络与外部进程或远程计算机进行通信的设备,如网卡等。

Linux设备的管理特点:物理设备抽象化,把物理设备看成文件,采用文件系统的接口和系统调用来管理和控制设备,Linux设备就是一种特殊文件,成为设备文件。

设备驱动程序

  1. 功能
    对设备进行初始化
    启动停止设备的运转
    把设备上的数据传到内存
    把数据从内存传入到设备
    检测的状态

  2. 驱动程序虽然是在设备生产厂家开发的,但是装入系统后统一由内核进行管理,处于内核态,成为内核的一部分。

  3. Linux对设备的管理和控制是使用VFS提供的各种数据结构和操作系统函数实现的。

设备注册
当一种设备安装到系统时,必须向系统进行注册,注册之后才能够进行使用,设备的注册是将驱动程序加载到系统中。
设备驱动实在系统启动时装载到系统中的
对于即插即用的设备,驱动程序作为程序模块可以随时加载到系统中。

两个设备注册表

1. 字符设备注册表
2. 块设备注册表
每个注册表都有255个表项,每个表项表示一个设备,都是一个device_struct结构,成为设备描述符。
注:设备注册表的下标时某种设备的主设备号,使用主设备号作为索引就可以从设备注册表中得到这种设备的驱动程序,
两个注册表的第一个表项通常为null,因为系统中不存在主设备号为0的字符设备和块设备。

设备注册是通过系统调用注册函数实现的,当设备需要撤销时,可以使用注销函数从设备注册表中删除。

Linux的I/O控制方式
Linux对设备的输入、输出过程实际上是在CPU的控制下主机(内存)与外部设备之间传送数据的过程,因此Linux的I/O控制有三种

  1. 查询等待方式(轮训方式)
    驱动程序不断控制设备状态,当设备准备好传送数据时,CPU执行驱动完成一次I/O过程,若设备未准备好,则驱动程序反复检测该设备状态,直到设备准备好。
    适用于不支持设备中断的系统,系统支持的中断数目有限时,例如并行接口(打印机接口)的驱动程序中默认的控制方式就是轮训方式。

  2. 中断方式
    当进程向设备提出I/O请求时并不等待设备完成I/O操作,而是把CPU让给其他进程使用,自己则进入睡眠状态。在设备完成I/O操作时发出中断信号,系统根据中断信号调用相应的中断服务唤醒等待的进程继续后面的操作。
    在机器支持中断的情况下,涉笔驱动程序就可以使用中断方式控制设备的I/O操作。因此,设备中断程序中处理包含各种操作函数外,同时还要进行各种中断处理的中断服务例程。CPU接收到来自硬件的中断请求后,则通过中断请求就能够执行设备驱动程序例程。

  3. DMA方式

     DMA方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和回复现场的过程,通过硬件为RAM和I/O之间开辟一条直接传输数据的通路,减少CPU直接操作数据的时间。
    

  贝爷应该不会忘记这件事情,因为这个让我佩服的五体投地的贝爷凑过去用舌头舔了舔玩偶耷拉的舌头,当着小狗玩偶主人的面,完了贝爷还一脸嘻哈,别个姑娘不乐意了,抓起玩偶就朝贝爷砸了过去,我只是看见贝爷很尴尬的样子,我想他一定是在反思自己怎么是这样的一个人。

  贝爷虽然喜欢调戏姑娘,但是还是有喜欢的姑娘。这货时常会把写给姑娘的诗拿出来让我鉴赏,内容我是记不得了,不过高中结束的时候他写满了一个笔记本,但姑娘依旧是别家的。

  不得不承认贝爷胆子很大,啥都敢干,不像我干什么都有些畏畏缩缩,我曾经也敢,后来开始怕了,怕很多的东西。

  贝爷追过班上的一个姑娘,艺体生。高三下学期开始不久,艺体生回到班上补习文化科目。那个姑娘喜欢玩游戏,英雄联盟。于是贝爷把所有空闲的时间都砸到网吧里去练技术去了,成绩下滑相当快,能赶上火箭的速度,这并没有结束,基本上每节课贝爷都把座位换到那个姑娘的旁边,这一点在那姑娘失恋的那段时间体现相当明显,贝爷坐在旁边拉着人家的手一个劲的安慰,那姑娘坐在那里嘤嘤的哭,整上午整下午的坐在那里一天,连尿尿这种人生大事他都能一直憋着,我不禁感叹贝爷的忍耐极限,在此向贝爷致敬。只是不知道那姑娘为啥让贝爷拉手却又不同意贝爷的死追烂缠,兴许这是很多姑娘的通病,给点甜头吊足胃口,只是这个世界上不是所有人都像贝爷那样,胃口大一点的说吃掉就吃掉你了,姑娘们可明白。爱情可以有,但是要责任和承担与之并行,否则那只是情爱了。在这个走肾不走心的时代眼睛要擦亮一点,那是你们的下半辈子的归宿。

  贝爷干的事有些搞笑,他把他老妈买给他解暑的冰淇淋啥的统统都拿给人家姑娘了,人家照单全收,贝爷陪姑娘减肥跑步,满嘴跑火车,一脸献媚,我晚上体能训练的时候常常见俩人不是坐着聊天就是慢慢晃悠,我实在是看不下去,也不愿去当那个千瓦的大灯泡。

  贝爷有天突然问我,他说只有一个多月了他要不要表白,我一脸懵逼的问他那你俩在一起瞎逛个毛线,感情就是贝爷自个儿厚脸皮,我说我没啥经验,不懂。

  想来贝爷内心是苦苦挣扎了许久的,他终于在那个周末拨通了那个姑娘的电话朝着麦大吼了一句,吼得有些撕心裂肺,反正我是干不出来,这不符合我的逻辑。

  “我喜欢你!做我女朋友好不好?!”

  当贝爷吼完这句话后,那姑娘再也没有联系过他……

  这时候贝爷才开始疯狂的啃书,然而并没有什么卵用,复读之路上注定有他的脚步和孤独的背影了。

  比起贝爷,我好过多了,下学期有个漂亮的姑娘陪我在食堂吃了一个学期的午饭,姑娘姓唐,我一直称呼她糖姑娘,一个可爱、漂亮、身材很棒的姑娘,请不要怀疑我的纯真,我就是和糖姑娘一起吃个午饭,虽然她老是以不能长胖了的理由把肉一个劲的往我的碗里夹。我不挑食,和糖姑娘一起吃饭的时候我的饭量出奇的好,双份。我能吃到食堂只剩下两三人,糖姑娘老是笑我吃得多,说我浪费粮食,我从没反驳过,我吃得多是事实。高三突然的结束后,我居然有些不习惯,饭量骤减,一份的量都不到。

  糖姑娘喜欢着齐膝的连衣裙,不管是远远的看着还是凑近说说话很清新,她就是一个这样的姑娘,我曾开玩笑的说裙子的肩带会不会断掉,糖姑娘也会小脸微红说我是个不正经的家伙,我笑笑,装作很遗憾的的样子说太可惜了。

  很感谢糖姑娘从我的生活中路过,她的笑能带走我所有的不高兴,她时而扎着马尾,或者长发披肩,甜甜的笑容和银铃儿般的声音,我想起她的时候总是会笑那时候的我运气太好,能遇到那么有意思的姑娘。后来开玩笑问她,那时候我有没有机会成为他男票,她肯定的说,有。

  也许,当糖姑娘看见我送的那个牛奶杯会想起我这个很能吃的货。

  高三下学期的压力很大,然而不像以前那般每周都有时间去爬山了,只能抽空释放一下压力。

  我曾和班上的一个男生约定中午放学不吃午饭就以最快的速度爬山,那一次的记录是从校门口到山顶用了二十七分钟,那一次我几乎是手脚并用才上去的,也是那一次才明白一步一个脚印是多么的实在。下山用了两个小时,我俩绕着小镇走了半圈。

  真正差点把我弄休克的是和锐哥等人爬山,我非得一口气跑上四百多步的石阶,上是上去了,差点儿没有机会走下山顶,就那么的摊在阳光下晒了好一会儿我才缓过气儿。

  锐哥理综很棒,好的没话说。个子中等偏上,瘦削,细胳膊瘦腿是我对他的外表的描述,沉默是他最大的优点,他能静得下心,虽然他也在复读的路上留下了脚印。

  临近毕业,学校抽了一天的时间给我们拍照留念,全班合影留念的时候老苟没来,他是后来给P上去的。

  这天贝爷依旧很疯狂,他和一姑娘打赌一口气喝掉一罐蜂蜜,然后真的一口气喝掉了,只是贝爷喝完后着急到处找水喝,随手拿了个杯子就喝,那个杯子是向姑娘的,后来贝爷告诉我说他是故意的,我不禁感叹贝爷的套路深。

  班级合影留念后基本上就是各自发挥,我老远看见一排男生围成半圆站在一起合照,我也就毫不客气的凑了过去,难得有机会凑到一起留影,拍完后我说洗了给我留一张。

  唯一的合照是和物理老师,很壮实的一个中年人。

  安排考试程序,熟悉考场是避免不了的,我们得到市里面去参加高考,所以就环境而言是陌生的,住宿在宾馆,我和一哥们儿被分配到了478号房间,这个号实在是不敢恭维,也就一笑了之。

  我们是于高考前两天去市里的,出发的时候天空飘着小雨,路上行人密布,三辆警车开道,十三辆大巴随行。

  两天的时间我一刻也不敢停歇,把能复习的过了一遍又一遍,虽然我复习的一个也没有考到,但是至少我的内心是安稳的。

  关于考试,就是很紧张的环境下很紧张的作答。

  当录取通知书陆陆续续的下发,我们一处一处的瞎逛,不经意间在一同学家里看见了一群男生站成一个半圆的照片,我觉着眼熟,扫过照片的右下角的时候,我见着了我衣服的一角残留在照片上。那一刻,我所构造的三年轰然崩坍了,我强忍着没让眼泪窜出眼眶,像什么事都没有发生一样把夹着照片的相框放回桌子上。

  三年就这么的结束了,那时候还有些不敢相信,但是那段时光真真切切的走远在时间里了。自从散开后我一直还能联系着的就是这些小伙伴了,姑娘不在此列。

  我们随着时光的变迁,渐行渐远,时光模糊了你我的背影,生活又给罩上浓雾,从此便真的陌路了。

  我们,走散了。

几人行
于2017-04-21夜

后记
  几年前曾答应自己,整理一下过去的事情,尝试过用假名替换朋友,却没有想象的那般有趣,搁浅两年多后,前些日子又翻出以前的稿子整理了一下,觉得不写完有些过意不去,毕竟是给自己承诺过的,算起来已经不守信用了,但是我还是想慢慢的把这份回忆完成。这是一个给自己设的坎,得迈过去。