操作系统 - 哈尔滨工业大学 孙志刚 笔记

笔记目录:

  1. 操作系统结构
  2. 进程管理
  3. 线程
  4. CPU调度
  5. 死锁
  6. 内存管理

操作系统结构

  1. 为了保证稳定和安全,应用程序和操作系统内核之间通过系统调用接口实现通信,应用程序不能直接操纵内核的信息。
Screen Shot 2018-04-06 at 12.24.32.png
  1. 中断服务程序一定是操作系统编写的。

  2. 一般很少用到的系统程序,如系统分区,磁盘碎片整理,磁盘快照。系统级的功能有系统级的程序来完成,这部分程序普通的用户不常用,一般由系统管理员用。

  3. 功能和需求以及硬件和工作的环境 决定操作系统的结构。

操作系统的简单结构

聚内核(无结构内核)
UNIX的系统构造-内核部分无结构

Screen Shot 2018-04-06 at 13.57.47.png

微内核
MINIX3的结构

Screen Shot 2018-04-06 at 14.08.05.png

LINUX的诞生:
Torvalds在阅读了他当时操作系统老师写的MINIX操作系统后,完成了LINUX系统,但是他的老师觉得他写的LINUX一团糟,因为他认为LINUX仍然没有摆脱UNIX的设计范畴,仍然使用大内核。后来他的老师提出了微内核的概念,并在MINIX3系统中实现。

内核做尽量少的事情,把更多的任务放到用户空间(如磁盘操作等)。(效率问题是微内核的死穴)

Solaris System

运用了面向对象的思想,将磁盘操作,文件读写等功能仍然放在内核部分,但划分了不同的模块。

Screen Shot 2018-04-06 at 14.25.39.png

混合结构-MacOS
MacOS系统有两个内核,一个BSD内核(聚内核),一个Mach内核(微内核)。

虚拟机结构

Screen Shot 2018-04-06 at 14.32.47.png

未来虚拟机的结构:


Screen Shot 2018-04-06 at 14.34.15.png

硬件之上直接是虚拟机,虚拟机上面再分各种内核。

进程管理

计算机系统在启动后,会进入两种模式,一个叫用户模式,一个叫内核模式。用户程序在用户模式下运行,不能随意读写任意内存。

系统引导
计算机通了电之后都经历了哪些事情?

  1. (加电自检)当我们按下开机键之后,首先BIOS会加电自检(Power On Self Test -post)。BIOS执行内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序,对系统硬件(显卡,CPU及硬盘、内存、光驱信息,主板信息)进行检查。
  2. (磁盘引导)自检完成后,ROM BIOS会按照系统CMOS设置中的启动顺序搜索装有操作系统的磁盘驱动器。(ps:从磁盘加载操作系统的原因有二:一是操作系统升级简单容易,二是使用户拥有选择操作系统的自由。)BIOS将相应启动设备的第一个扇区(MBR扇区(存储着磁盘分区等信息,大小固定为512字节))读入内存地址为0000:7C00H
  3. (执行MBR程序)检查0000:7DFEH-0000:7DFFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示"NO ROM BASIC"然后死机。
  4. 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处, 然后继续执行。
  5. 根据MBR中的引导代码启动引导程序。
  6. 此时的机器才是真正意义上的计算机。
Screen Shot 2018-04-07 at 14.34.16.png

当操作系统内核被加载,开始运行内核时,就不是boot的内容了。

加载操作系统的程序叫bootstrap

在计算机的ROM(计算机主板ROM芯片)里会有一段引导的初始程序。计算机在加电后最先运行的程序就是存放在ROM中的引导程序。

百度百科:

BIOS(Basic Input Output System)。是个人电脑启动时加载的第一个软件。它是一组固化到计算机内主板上的一个ROM芯片上的程序。它保存着计算机最重要的基本输入输出程序,开机后自检程序和系统自启动程序,它可以从CMOS中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代作业系统会忽略BIOS提供的抽象层并直接控制硬件组件。

BIOS中主要存放:

  1. 自诊断程序:通过读取CMOSRAM中的内容识别硬件配置,并对其进行自检和初始化;
  2. CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中;
  3. 系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入DOS系统;
  4. 主要I/O设备的驱动程序和中断服务:由于BIOS直接和系统硬件资源打交道,因此总是针对某一类型的硬件系统,而各种硬件系统又各有不同,所以存在各种不同种类的BIOS,随着硬件技术的发展,同一种BIOS也先后出现了不同的版本,新版本的BIOS比起老版本来说,功能更强。

CMOS(Complementary Metal Oxide Semiconductor)互补金属氧化物半导体。CMOS是主板上一块可读写的RAM芯片,用于保存当前系统的硬件配置信息和用户设定的某些参数。CMOS RAM由主板上的钮扣电池供电,即使系统断电信息也不会丢失。对CMOS中各项参数的设定和更新可通过开机时特定的按键实现(一般是Del键)。进入BIOS设置程序可对CMOS进行设置。一般CMOS设置习惯上也被叫做BIOS设置。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。

参考: 磁盘引导程序原理及简介

进程的定义
简单来说,运行起来的程序叫进程。

进程在内存中:


Screen Shot 2018-04-08 at 22.54.15.png

进程的几个状态:

Screen Shot 2018-04-08 at 23.09.56.png
Screen Shot 2018-04-08 at 23.13.05.png

进程各个状态转换图:

Screen Shot 2018-04-08 at 23.17.30.png
  • 处于running态的进程拥有CPU
  • 当处于running态的进程需要等待I/O操作或者等待某个点击事件后才能进行下一步操作,则此时会进入waiting态,让出CPU。
  • 当处于waiting态的进程获得点击事件或者I/O资源时,则会进入 ready态。
  • 处于ready态的进程获得CPU后,便会运行起来,进入running态。

PCB
操作系统通过PCB来控制进程的状态。

进程的切换:

Screen Shot 2018-04-09 at 13.28.37.png

系统切换进程有两种方式:中断和系统调用
中断的作用就是CPU暂时停止当前程序的执行转而执行处理新情况。
比如,当一个进程运行了比较长的时间,操作系统会发出一个中断信号(如通过晶振发出),这时CPU会暂停当前进程的执行,来到操作系统中的代码块,此时操作系统占有CPU,操作系统利用CPU将当前进程的状态置为ready,切换到其他进程的执行。

操作系统进入到等待态是应用程序主动通过一些操作进入到等待态:
running态的到waiting态的进程状态切换,则是通过当前进程通过主动发起系统调用,将CPU的使用权转给操作系统,再由操作系统改变进程的状态。

PCB表的组织形式:


Screen Shot 2018-04-09 at 13.31.42.png

??下面这一块不太懂


Screen Shot 2018-04-09 at 14.11.45.png
Screen Shot 2018-04-09 at 14.12.07.png
Screen Shot 2018-04-09 at 14.12.27.png
Screen Shot 2018-04-09 at 14.12.56.png
Screen Shot 2018-04-09 at 14.11.17.png
Screen Shot 2018-04-09 at 14.13.26.png
Screen Shot 2018-04-09 at 14.17.37.png
Screen Shot 2018-04-09 at 14.22.27.png
Screen Shot 2018-04-09 at 14.24.32.png
Screen Shot 2018-04-09 at 14.24.37.png
Screen Shot 2018-04-09 at 14.26.41.png

进程间的协作:独立与合作

Screen Shot 2018-04-10 at 14.02.53.png

进程合作的优点:

  1. 信息共享


    Screen Shot 2018-04-10 at 14.04.21.png
  2. 计算速度加快

Screen Shot 2018-04-10 at 14.04.58.png
  1. 进程间的通信方式:消息传递和共享内存
    消息传递效率更高。因为共享内存的方式会进行大量的系统调用。


    Screen Shot 2018-04-10 at 14.07.18.png
Screen Shot 2018-04-10 at 14.07.45.png
Screen Shot 2018-04-10 at 14.08.30.png
Screen Shot 2018-04-10 at 14.11.59.png
Screen Shot 2018-04-10 at 14.26.34.png

阻塞方式指的是,在该进程没得到自己所需资源时,就会被阻塞,被置为waiting态。

Screen Shot 2018-04-10 at 14.28.48.png

接收方不拿走这个消息就会被丢弃


Screen Shot 2018-04-10 at 14.28.58.png

会被缓存一会,收的慢的情况下也会丢失


Screen Shot 2018-04-10 at 14.29.02.png

没有限制


Screen Shot 2018-04-10 at 14.29.08.png
Screen Shot 2018-04-10 at 14.30.07.png
Screen Shot 2018-04-10 at 14.33.33.png

线程

Screen Shot 2018-04-11 at 12.44.32.png

线程的下面这些资源是独享的,每个线程会有自己:

  • 线程ID
  • 程序计数器 (存放下一条指令的地址)
  • 寄存器集
  • 栈 (记录程序的执行路径)


    Screen Shot 2018-04-11 at 12.44.51.png

其他的进程的大部分资源会被线程们共享。


Screen Shot 2018-04-11 at 12.48.09.png

单线程与多线程:单线程只有一条执行路线。多线程有各自的执行路线。


Screen Shot 2018-04-11 at 12.49.23.png

为什么要创建多线程,而不是选择创建多进程。(比如把耗时的操作,fork一个进程放到里面):

多线程的好处是资源共享(协作起来更方便),经济实惠。进程与进程之间是完全分隔的,不共享(也可以共享,但比较麻烦),进程的创建,销毁,切换开销都大于线程。

Screen Shot 2018-04-11 at 16.26.41.png

线程分为用户级线程和内核级线程:


Screen Shot 2018-04-11 at 16.40.37.png

用户级线程指的是,一个程序在自己内部模拟出多个线程,比如,保存当前正在执行的线程的数据现场,切换到另一个现场,继续执行,这样模拟出了多线程。

用户级线程的优点:

Screen Shot 2018-04-11 at 16.46.47.png

用户级线程的优点:


Screen Shot 2018-04-11 at 16.57.02.png

而且用户级线程还有一个缺点,就是当模拟出多个线程中的一个发生系统级的阻塞时,该程序的所有(模拟出的)线程都将被阻塞。因为在系统看来,它就是一个线程。

Screen Shot 2018-04-12 at 13.27.44.png
Screen Shot 2018-04-12 at 13.28.19.png
Screen Shot 2018-04-12 at 13.46.44.png
Screen Shot 2018-04-12 at 13.50.56.png

结束线程:

  • 直接强制杀死。(会造成一些难以预料的错误,比如该保存的资料没保存)
  • 告诉线程该退出了。设置个退出条件,达到条件自己主动退出。

总结

各个进程之间是完全独立的
线程模型不稳定,任何一个线程出问题,导致整个进程的崩溃
从安全角度看,线程的安全性比进程的安全性差

进程与线程的区别:

  • 进程绝对隔离,线程完全共享
  • 进程效率低,线程效率高

CPU调度

调度的目的是最大限度的利用CPU。

Screen Shot 2018-04-16 at 15.31.41.png
Screen Shot 2018-04-16 at 15.32.16.png
Screen Shot 2018-04-16 at 15.34.19.png

CPU和I/O交替进行:


Screen Shot 2018-04-16 at 15.34.33.png

有些进程利用CPU比较多,有些利用I/O比较多:


Screen Shot 2018-04-16 at 15.35.24.png

CPU调度发生的情形:


Screen Shot 2018-04-16 at 15.38.20.png
Screen Shot 2018-04-16 at 15.38.33.png
Screen Shot 2018-04-16 at 15.38.40.png
Screen Shot 2018-04-16 at 15.38.58.png

CPU调度分为抢占式和非抢占式:


Screen Shot 2018-04-16 at 15.39.33.png

分配CPU(恢复上次运行状态等处理,效率靠硬件来决定):

恢复上次运行状态


Screen Shot 2018-04-16 at 15.48.52.png

从系统态切换到用户态


Screen Shot 2018-04-16 at 15.49.06.png

切换完成后跳转到正确的地址开始执行:


Screen Shot 2018-04-16 at 15.49.21.png

调度进程和分配资源所花费的时间:

Screen Shot 2018-04-16 at 15.50.34.png

调度准则:1.最大化利用CPU


Screen Shot 2018-04-16 at 15.57.44.png

调度准则:2.大的吞吐量(单位时间运行的进程数量)


Screen Shot 2018-04-16 at 15.58.33.png

调度准则:3.尽可能小的周转时间(从创建到结束一共经过多久wall time(周转时间))


Screen Shot 2018-04-16 at 15.59.00.png

调度准则:4.尽可能小的等待时间(在就绪队列等待时间)

Screen Shot 2018-04-16 at 16.00.03.png

调度准则:5.尽可能小的响应时间 (接收一个事件到处理该事件经过的时间)


Screen Shot 2018-04-16 at 16.00.27.png

先来先服务:


Screen Shot 2018-04-17 at 14.04.47.png

最短作业优先:


Screen Shot 2018-04-17 at 14.05.48.png
Screen Shot 2018-04-17 at 14.06.32.png

两种调度模式:

  • 非抢占式和抢占式


    Screen Shot 2018-04-17 at 14.06.32.png

最短剩余时间优先:


Screen Shot 2018-04-17 at 14.22.51.png

优先级调度(一种实现策略)

优先级调度可能会导致优先级低的进程被饿死。

Round Robin(时间片轮转)

Screen Shot 2018-04-17 at 15.04.58.png

如果时间片太大,就变成了先来先服务
如果时间片太小,各个进程就会被频繁切换,进程切换时比较耗时间的(保存当前进程的现场,调度算法决定下次调用哪个进程)

将时间片轮转和优先级结合进行调度:

Screen Shot 2018-04-18 at 16.00.23.png

多级队列(将队列分为不同的优先级)

Screen Shot 2018-04-18 at 16.13.56.png

系统进程应该处于最高的优先级队列中(I/O绑定的进程:用CPU的时间比较短,大部分在时间用来I/O)

Screen Shot 2018-04-18 at 16.16.22.png

在队列之间进行调度:


Screen Shot 2018-04-18 at 16.21.55.png

固定队列的优先级(有可能发生饥饿):


Screen Shot 2018-04-18 at 16.22.10.png

为了降低饥饿发生的概率,在具有优先级的队列之间采用时间片:

Screen Shot 2018-04-18 at 16.22.21.png

现在操作系统中大多采用多级反馈队列调度算法:

Screen Shot 2018-04-18 at 16.22.43.png
Screen Shot 2018-04-18 at 16.24.23.png
Screen Shot 2018-04-18 at 16.25.11.png

优先级从上到下依次降低


Screen Shot 2018-04-18 at 16.27.10.png

进程第一次运行时,都被放在优先级最高的队列中(quantum=8(分配的时间片)的队列),根据该进程运行的状况将其移到响应的队列中。如:当进程第一次被运行时,先被放到上图quantum=8的队列中(优先级从上到下依次降低),当给该队列分配的8个时间片全被该进行消耗完的情况下,将该进程移到下一个优先级较低的队列中;在quantum=16的队列中时,给该队列分配的16个时间片又全被该进程消耗完,则将其移到下一个优先级较低的队列。

多核处理器:


Screen Shot 2018-04-19 at 14.10.38.png
Screen Shot 2018-04-19 at 14.13.43.png

多处理器面临的问题:

Screen Shot 2018-04-19 at 14.14.28.png

对称多处理器:

Screen Shot 2018-04-19 at 14.21.04.png
Screen Shot 2018-04-19 at 14.21.36.png

所有处理器共享同一个就绪队列(会存在一个问题,当进程从一个CPU被切到另一个CPU时,会导致Cache刷新,有性能损耗)


Screen Shot 2018-04-19 at 14.21.51.png
Screen Shot 2018-04-19 at 14.23.22.png

CPU的亲和性:(可将某个进程与某个特定的CPU绑定)

Screen Shot 2018-04-26 at 18.14.47.png
Screen Shot 2018-04-26 at 18.15.22.png
Screen Shot 2018-04-26 at 18.18.04.png
Screen Shot 2018-05-10 at 20.29.27.png
Screen Shot 2018-05-10 at 20.27.23.png
Screen Shot 2018-05-10 at 20.28.09.png
Screen Shot 2018-05-10 at 20.32.47.png

防止两个进程同时访问临界区的方法1:

Screen Shot 2018-05-10 at 21.03.10.png
Screen Shot 2018-05-10 at 21.12.18.png

关了中断后就不会进行进程切换,当一个进程进入临界区后关中断


Screen Shot 2018-05-10 at 21.12.50.png
Screen Shot 2018-05-10 at 21.14.36.png
Screen Shot 2018-05-10 at 21.15.13.png
Screen Shot 2018-05-10 at 21.16.01.png
Screen Shot 2018-05-10 at 21.18.04.png
Screen Shot 2018-05-14 at 12.07.13.png
Screen Shot 2018-05-14 at 12.12.05.png
Screen Shot 2018-05-14 at 12.13.15.png

死循环等待消耗CPU,造成性能损耗。这种方式也称为自旋锁。

Screen Shot 2018-05-14 at 12.13.33.png
Screen Shot 2018-05-14 at 12.16.48.png
Screen Shot 2018-05-14 at 12.18.46.png
Screen Shot 2018-05-14 at 12.20.43.png
Screen Shot 2018-05-14 at 12.20.51.png
Screen Shot 2018-05-14 at 12.21.53.png
Screen Shot 2018-05-14 at 12.25.48.png
Screen Shot 2018-05-14 at 12.26.26.png
Screen Shot 2018-05-14 at 12.27.44.png
Screen Shot 2018-05-14 at 12.37.12.png
Screen Shot 2018-05-14 at 12.40.57.png
Screen Shot 2018-05-14 at 12.44.35.png
Screen Shot 2018-05-14 at 12.47.19.png
Screen Shot 2018-05-17 at 13.23.24.png
Screen Shot 2018-05-17 at 13.24.09.png
Screen Shot 2018-05-17 at 13.25.19.png
Screen Shot 2018-05-17 at 13.26.27.png
Screen Shot 2018-05-17 at 14.03.05.png
Screen Shot 2018-05-17 at 14.10.45.png
Screen Shot 2018-05-17 at 14.14.16.png
Screen Shot 2018-05-17 at 14.20.22.png

哲学家就餐问题的另外一种解决方案:

给每个就餐的哲学家按顺序编号,奇数号的哲学家第一次只能拿左边的筷子,偶数号哲学家第一次只能拿右边的筷子。这样便可以保证至少有一个哲学家可以拿到两只筷子。
Screen Shot 2018-05-17 at 14.34.23.png
Screen Shot 2018-05-17 at 14.37.13.png
Screen Shot 2018-05-18 at 10.31.17.png
Screen Shot 2018-05-18 at 12.40.44.png
Screen Shot 2018-05-18 at 12.42.17.png
Screen Shot 2018-05-18 at 15.47.50.png
Screen Shot 2018-05-18 at 15.49.21.png
Screen Shot 2018-05-18 at 15.49.46.png
Screen Shot 2018-05-18 at 15.51.39.png

不死锁:


Screen Shot 2018-05-18 at 15.52.17.png

死锁:


Screen Shot 2018-05-18 at 15.54.02.png

不死锁:


Screen Shot 2018-05-18 at 15.54.53.png
Screen Shot 2018-05-18 at 15.55.39.png

死锁的四个条件:

  1. 互斥
  2. 保持和等待
  3. 不可剥夺
  4. 循环等待(我要你的,你要他的,他要我的)
Screen Shot 2018-05-18 at 15.56.25.png

解决死锁:

  1. 预防死锁
  2. 避免死锁
  3. 死锁的检测和恢复
  4. 鸵鸟算法(死锁装作没看见)(让软件开发者自己去解决)
Screen Shot 2018-05-18 at 15.56.41.png
Screen Shot 2018-05-18 at 16.00.52.png
Screen Shot 2018-05-18 at 16.01.14.png
Screen Shot 2018-05-18 at 16.02.20.png
Screen Shot 2018-05-18 at 16.03.42.png
Screen Shot 2018-05-18 at 16.04.29.png
Screen Shot 2018-05-18 at 16.04.52.png
Screen Shot 2018-05-18 at 16.05.22.png
Screen Shot 2018-05-18 at 16.12.22.png
Screen Shot 2018-05-19 at 14.41.01.png
Screen Shot 2018-05-19 at 14.42.16.png
Screen Shot 2018-05-19 at 14.44.23.png
Screen Shot 2018-05-19 at 15.18.14.png
Screen Shot 2018-05-19 at 15.18.21.png
Screen Shot 2018-05-19 at 15.19.07.png
Screen Shot 2018-05-19 at 15.21.33.png
Screen Shot 2018-05-19 at 15.25.32.png
Screen Shot 2018-05-19 at 15.25.40.png
Screen Shot 2018-05-19 at 15.25.56.png
Screen Shot 2018-05-19 at 15.26.02.png
Screen Shot 2018-05-19 at 15.42.10.png
Screen Shot 2018-05-19 at 15.42.18.png
Screen Shot 2018-05-19 at 15.42.43.png
Screen Shot 2018-05-19 at 16.09.57.png
Screen Shot 2018-05-19 at 16.10.22.png
Screen Shot 2018-05-19 at 16.11.39.png
Screen Shot 2018-05-19 at 16.18.22.png
Screen Shot 2018-05-19 at 16.18.37.png
Screen Shot 2018-05-19 at 16.19.10.png
Screen Shot 2018-05-19 at 16.23.45.png
Screen Shot 2018-05-19 at 16.24.47.png
Screen Shot 2018-05-19 at 16.25.40.png
Screen Shot 2018-05-19 at 16.26.19.png
Screen Shot 2018-05-19 at 16.26.58.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 操作系统概论 操作系统的概念 操作系统是指控制和管理计算机的软硬件资源,并合理的组织调度计算机的工作和资源的分配,...
    野狗子嗷嗷嗷阅读 11,920评论 3 34
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,796评论 0 27
  • 第一天 二、 “哦操,行不行啊!到底她妈咋回事啊!”桃子有点慌了。 “你别说,没准她它妈世界末日了”孙子蒙说了一句...
    孤独的郭先生阅读 258评论 4 1
  • .box{height: 100px;overflow-y: auto;} .box::-webkit-scrol...
    甘蔗夫阅读 1,134评论 0 0