第3章 3-1、3-2处理机调度与常见算法

一.处理机调度相关基本概念

        处理机调度:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。

        提高处理机的利用率、改善系统性能,很大程度上取决于处理机调度的性能。

        处理机调度便成为OS设计的中心问题之一。分配的任务由处理机调度程序完成。

        作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度。

                1、高级调度(High Scheduling)

                        又称作业调度或长程调度(Long-Term Scheduling),接纳调度(Admission Scheduling)

                          主要在早期批处理阶段,处理在外存上的作业。

�                                决定外存后备队列中的哪些作业调入内存;

�                                为它们创建进程、分配必要的资源;

�                                将新创建的进程排在就绪队列上,准备执行。

                                *管理的方面比较多。

                        作业调度决定的细节

                                在每次执行作业调度时,都须作出两个决定:

                                        接纳多少作业——取决于多道程序度。应根据系统的规模和运行速度等情况综合考虑。

                                        接纳哪些作业——取决于采用的调度算法。如先来先服务,短作业优先等(后面详细介绍)

                        系统运行并不一定存在高级调度

                                批处理系统:作业进入系统后先驻留外存,故需要有作业调度。

                                分时系统:为及时响应,作业由终端直接送入内存,故不需作业调度。

                                实时系统中,通常也不需作业调度。

                2、低级调度(Low Level Scheduling)

                        也称为进程调度、微观调度或短程调度(Short-Term Scheduling)

                         决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。

                        进程调度方式

                                1)非抢占方式(Non-preemptive Mode)

                                          一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。

                                2)抢占方式(Preemptive Mode)

                                          允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。

                        调度程序的任务职能:调度和分派。

                                (1) 记录系统中所有进程的有关情况

                                (2) 确定分配处理机的原则

                                (3) 分配处理机给进程

                                (4) 从进程收回处理机

3、中级调度(Intermediate-Level Scheduling)

        又称交换调度或中程调度(Medium-Term Scheduling)

        引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。

三种调度的频率和复杂度

        进程调度:运行频率最高,算法不能太复杂,以免占用太多的CPU时间。分时系统通常10~100ms便进行一次。

        作业调度:一个作业运行完毕退出系统时即触发重新调度一个新作业入内存,周期较长,大约几分钟一次。因而也允许作业调度算法花费较多的时间。

        中级调度:运行频率基本上介于上述两种调度之间。

4、调度队列模型

        不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三类调度队列模型。从这三种方式中体验调度的过程。

        1)仅有进程调度的调度队列模型

                常见情况:

                        分时系统。

                        通常仅设置进程调度,用户键入的命令和数据,都直接送入内存。

                调度对象:

                        处于就绪状态的进程。

                组织形式:

                        栈、树或一个无序链表

                        用何种形式取决于OS类型和采用的调度算法。如:分时系统中把就绪进程组织成FIFO队列形式:按时间片轮转方式运行。

                  进程调度过程如下图:

                        每个进程在执行时按规定的时间片算法,在给定时间片内任务有三种执行情况:

                                ①完成工作,释放处理机进入完成状态

                                ②未完成,将该任务再放入就绪队列末尾

                                ③因某事件而被阻塞,被OS放入阻塞队列


        2)具有高级和低级调度的调度队列模型

                批处理系统中,还需要作业调度

        3)同时具有三级调度的调度队列模型

                引入中级调度后,进程的状态变化:

                        就绪状态:分为内存就绪和外存就绪。

                        阻塞状态:分为内存阻塞和外存阻塞。

                  中级调度使进程在上述状态间变化,并使数据在内外存间互换。

5. 选择调度方式和调度算法的若干准则

        什么算法是好算法?

                不同的情况和对象需求不同,适用的方式和算法也不同。

        1)面向用户的准则

                周转时间短:

                          针对批处理系统的性能指标。作业从提交到完成所经历的时间。

�                        CPU执行用时Ts

                        �总的等待时间Tw = 在后备队列中等待 + 就绪队列上等待+阻塞队列中等待(等待I/O操作用时)

�                        周转时间T=Ts+Tw

�                        带权周转时间W= T/Ts

�                        平均周转时间、平均带权周转时间(n个作业求平均)

                响应时间快:针对分时系统。用户输入一个请求(如击键)到系统给出首次响应(如屏幕显示)的时间

                均衡性:系统响应时间的快慢与用户所请求的复杂性相适应。

                截止时间的保证:针对实时系统的性能指标。开始截止时间和完成截止时间。任务必须按规定的时间开始或完成,调度方式和算法必须能保证该要求。

                优先权准则:三大基本OS在调度算法的选择时都可遵循。可以使关键任务达到更好的指标。

        2)面向系统的准则

                系统吞吐量高:批处理系统的重要指标。

�                        单位时间内所完成的作业数,跟作业本身(与作业平均长度密切相关)和调度算法都有关系;

                处理机利用率好(主要针对大中型主机)

                各类资源的平衡利用(主要针对大中型主机)

                不同系统需求各有侧重

                        批处理系统 

�                                平均周转时间短

�                                系统吞吐量高

�                                处理机利用率好

                        分时系统

                        �        响应时间快

�                                均衡

                        实时系统

                                �截至时间的保证

                                �可预测性

二.常用调度算法

调度的实质就是一种资源分配。不同的系统和系统目标,通常采用不同的调度算法——适合自己的才是最好的。

�        如批处理系统为照顾为数众多的短作业,应采用短作业优先的调度算法;

        �如分时系统为保证系统具有合理的响应时间,应采用轮转法进行调度。

�        目前存在的多种调度算法中,有的算法适用于作业调度,有的算法适用于进程调度;但有些算法作业调度和进程调度都可以采用。

1、先来先服务调度算法FCFS(First Come First Service)

        一种最简单的调度算法,按先后顺序进行调度。既可用于作业调度,也可用于进程调度。

        按照作业提交,或进程变为就绪状态的先后次序分派CPU;

        新作业只有当当前作业或进程执行完或阻塞才获得CPU运行

        被唤醒的作业或进程不立即恢复执行,通常等到当前作业或进程出让CPU。 (所以,默认即是非抢占方式)

        不足:短作业C的带权周转时间竟高达100,这是不能容忍的;而长作业D的带权周转时间仅为1.99。

        关于应用:有利于CPU繁忙型的作业,而不利于I/O繁忙的作业(进程)。

                从程序规模上看,一般I/O繁忙型作业CPU进行处理的用时相对比较短,CPU繁忙型的作业相对较长。而FCFS不利于短作业,I/O繁忙型作业一旦排队靠后就会处于劣势。

                另一方面,I/O繁忙型作业需频繁的请求I/O,即使排队靠前,但由于I/O请求阻塞,重新排队可能就会排到队尾(这一情况在其他算法下也是普遍的,但不同的算法,排队情况不同,相对的在照顾公平性上也会有所不同)。

                目前大多数事务处理都属于I/O繁忙型作业。

2. 短作业(进程)优先调度算法SJF/SPF(Shortest Job First) OR (Shortest Process First)

        优点

                通过上表可见采用SJF/SPF算法,平均周转时间、平均带权周转时间都有明显改善。SJF/SPF调度算法能有效的降低作业的平均等待时间,提高系统吞吐量。

        方式

                分抢占和非抢占两种方式,上例为简单的非抢占式。

        SJF/SPF的不足

                1.对短作业有利,但同时造成了对长作业的不利。

                2.由于作业(进程)的长短含主观因素,不一定能真正做到短作业优先。

                3.未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)的及时处理。

3. 高优先权优先调度算法HPF Highest Priority First

        照顾紧迫性作业,使其获得优先处理而引入调度算法。常用于批处理系统中的作业调度算法,以及多种操作系统中的进程调度算法

        1)分两种方式:

                非抢占式优先权算法

                抢占式优先权算法 关键点:新作业产生时

        2)优先权的类型

                静态优先权:创建进程时确定,整个运行期间保持不变。一般利用某一范围的一个整数来表示,又称为优先数。

                动态优先权:创建进程时赋予的优先权可随进程的推进或随其等待时间的增加而改变。

        关于进程优先权的确定?依据如下:

                ①进程类型:一般来,系统进程高于用户进程。

                ②进程对资源的需求:如进程的估计时间及内存需要量的多少,对要求少的进程赋予较高优先权。

                ③用户要求:由用户进程的紧迫程度及用户所付费用的多少来确定优先权的。

        3)高响应比优先调度算法HRRN Highest Response Raito Next

                短作业优先算法是一种比较好的算法(相当于根据作业长度设定的静态优先权算法),适用于短作业较多的批处理系统中,其主要不足是长作业的运行得不到保证。

                HRRN为每个作业引入动态优先权,使作业的优先级随着等待时间的增加而以速率a提高:

                优先权 =(等待时间+要求服务时间)/要求服务时间= 响应时间 / 要求服务时间

        *对不同作业都有照顾*

                ①同时到达的作业优先权相同。

                        初始t=0,随着时间增长,如果等待时间 t相同,执行时间愈短的优先权愈高,利于短作业。

                        对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长也可获得处理机。长作业有照顾。

                ②当执行时间相同的作业,优先权的高低决定于其等待时间的长短,也就是先来先服务。

        什么时候计算各进程的响应比优先权

                需要进行调度选择的时候比较各自优先权

�                        作业完成时

�                        新作业产生时(抢占、非抢占)

                        �时间片完成时

�                        进程阻塞时

4.基于时间片的轮转调度算法RR(Round Robin)

        分时系统新需求:及时响应用户的请求;采用基于时间片的轮转式进程调度算法。

        早期分时系统采用的是简单的时间片轮转法,进入90年代后广泛采用多级反馈队列调度算法。

        (1)时间片轮转算法

                ①将系统中所有的就绪进程按照FCFS原则,排成一个队列。

                ②每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。

                ③在一个时间片结束时,发生时钟中断。

                ④调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。

                进程阻塞情况发生时,未用完时间片也要出让CPU

                能够及时响应,但没有考虑作业长短等问题。

        关于时间片长度

                时间片长度的选择要与完成一个基本的交互过程所需的时间相当,保证一个基本的交互过程可在一个时间片内完成。

                设置不合适反而都会导致响应时间长。

                        �过长会怎样?——FCFS

�                        过短会怎样?——频繁切换

        影响时间片长度的主要因素

                系统的处理能力和系统的负载状态。(依据系统的处理能力确定时间片长度,使用户输人通常在一个时间片内能处理完,否则使响应时间、平均周转时间和平均带权周转时间延长。为了保证不同负载状态下用户交互的响应时间,需要对时间片长度进行适当调整。)

        争议:若同时有时间片到放弃CPU的A进程、新就绪的进程B,二者在就绪队列中如何排序。

        做题时给出统一的假设:

                若设新进程就绪比较快,就统一按BA的顺序排入就绪队列。

                �若设旧进程该为就绪比较快,则统一按AB排序

        (2)多级反馈队列算法FB(Multiple-level Feed Back Queue)

                特点:多个就绪队列,循环反馈;动态优先级、时间片轮转

                ①设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。

                ②赋予各队列进程执行时间片大小不同, 优先权越高,时间片越短。

                ③当一个新进程进入内存,引发的调度过程

                        a.准备调度:先将它放入第一个队列的末尾,按FCFS原则排队等待调度。

                        b.IF时间片内完成,便可准备撤离系统;

                        c.IF时间片内未能完成,调度程序便将该进程转入第二队列的末尾等待再次被调度执行。

                        d.当第一队列中的进程都执行完,系统再按FCFS原则调度第二队列。在第二队列的稍放长些的时间片内仍未完成,再依次将它放入第三队列。

                        e.依次降到第n队列后,在第n队列中便采取按时间片轮转的方式运行。

        注意

                各队列的时间片逐渐增大。优先级逐渐降低

                仅当优先权高的队列(如第一队列)空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。

                高优先级抢占问题:

�                        第i队列中为某进程正占有CPU,又有新进程进入优先权较高的队列(第1~i-1队中);

                        �被抢占的进程放回原就绪队列末尾;

        * 多级反馈队列调度算法的性能 *

                多级反馈队列调度算法具有较好的性能,能较好的满足各种类型用户的需要。

                终端型作业用户。大多属于较小的交互性作业,只要能使作业在第一队列的时间片内完成,便可令用户满意。

                短批处理作业用户。周转时间仍然较短,至多在第二到三队列即可完成。

                长批处理作业用户。将依次在1~n级队列中轮转执行,不必担心作业长期得不到处理。

        基于公平原则的更多算法

                ①保证调度算法

                        �处理机分配的公平性:

                        �已经执行时间/应获得执行的时间,比值小的优先获得处理机

                ②公平分享调度算法

�                        针对用户考虑,如根据a(4个进程),b(2个进程)用户所拥有进程数目,决定一个比率

                        �a1,a2,b1,a3,a4,b2……

        优先级倒置问题的讨论

�                        有人罩着就是好^_^

                        �p1,p2,p3 优先级从高到低

                        �p3(运行)先占有一互斥信号mutex

                        �p2(运行)可以抢p3(就绪)

�                        p1来申请mutex,即使优先级高,但信号量拿不到只能阻塞,又回到p2

�                        p2来了,p3

三.实时调度

        什么是实时系统?

                指系统能够在限定的响应时间内提供所需水平的服务。

                指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。

        实时任务:具有明确时间约束的计算任务,有软/硬,随机/周期性之分。

        硬实时任务:必须满足任务对截止时间的要求

        软实时任务:联系着一个截止时间,但不严格,可偶尔错过,不会对系统造成大的影响。

�                实时系统的任务往往带有某种程度的紧迫性,因而实时系统的调度有某些特殊要求。

        为此引入适合的实时调度算法

        为保证系统正常工作,调度应具备下列条件

1. 实现实时调度的基本条件

        1)提供必要的信息

                为了实现实时调度,系统应向调度程序提供有关任务的下述信息:

                就绪时间。该任务成为就绪状态的时间。

                开始截止时间、完成截止时间

                处理时间。从开始执行到完成所需时间。

                资源要求。任务执行时所需的一组资源。

                优先级。根据任务性质赋予不同优先级。

        2)系统处理能力足够强

                处理能力不足可能会出现某些实时任务不能得到及时处理,导致难以预料的后果。

                如:

                        系统中有M个周期性的硬实时任务,处理时间为Ci,周期时间表示为Pi,单机系统中必须满足条件

                        一个系统,6个硬实时任务,周期都是50ms,每次处理时间10ms。根据公式,系统是不可调度的。10*6/50

        提高系统处理能力的方法

                增强单机系统的处理能力

                采用多处理机系统

                此情况下需满足

                        ∑( Ci / Pi )≤N,N为处理机数

        3)采用抢占式调度机制

                硬实时任务:广泛采用抢占机制。

                小的实时系统:如能预知任务的开始截止时间,为简化调度程序和对任务调度时所花费的系统开销,可采用非抢占调度机制

        4)具有快速切换机制

                ①对外部中断的快速响应能力。

                        利用快速硬件中断机构,可在紧迫的外部事件请求中及时响应。

                ②快速的任务分派能力。

                        使系统中的运行功能单位适当的小,提高切换速度。类如线程的思想

2. 实时调度算法的分类

        根据实时任务的性质                                根据调度时间不同

                硬实时调度算法                                        静态调度算法

                软实时调度算法;                                    动态调度算法。

        按调度方式                                                多处理机环境下

                非抢占调度算法                                        集中式调度

                抢占调度算法;                                        分布式调度

        1)非抢占调度算法

                该算法较简单,用于一些小型实时系统或要求不太严格的实时系统中,又可分为:

                        ①非抢占式轮转调度算法。常用于工业生产的群控系统中,要求不太严格。

                        ②非抢占式优先调度算法。要求相对严格,根据任务的优先级安排等待位置。可用于有一定要求的实时控制系统中。(精心设置可获得百ms级的响应时间)

        2)抢占式调度算法

                较严格的实时系统中(t约为数十ms),选择采用抢占式优先权调度算法。根据抢占发生时间可分为:

                        ①基于时钟:某高优先级任务到达后并不立即抢占,而等下一个时钟中断时抢占。

                        ②立即抢占:一旦出现外部中断,只要当前任务未处于临界区,就立即抢占处理机。

3. 常用的几种实时调度算法

        目前有许多实时调度算法,在常用的算法中简单介绍两种实时调度算法:

        1)最早截止时间优先EDF(Earliest Deadline First)

                根据任务的开始截止时间来确定任务的优先级。截止时间越早,其优先级越高。

                        系统保持一个实时任务就绪队列

                        队列按各任务截止时间的早晚排序

                        调度程序总是选择就绪队列中的第一个任务,分配处理机使之投入运行。

                新任务产生时,是否等当前程序执行完:

                        抢占式/非抢占式

                可能会使作业错过,但可适用于软实时系统

        2)最低松弛度优先LLF(Least Laxity First)

                根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高(松弛度值越小),优先级就越高。

                松弛度= 截止完成时间 – 还需执行时间 - 当前时间

                可理解为当前时刻到开始截止时刻间的差距,随着时间的推进,这个差值逐渐变小,任务越来越紧迫。

        进程切换发生的时机

                进程执行完

                进程I/O阻塞

                新进程出现时可能的抢占

                某进程松弛度为0时发生抢占

                有的时刻,其他并发的实时任务下一周期未到来,会出现只有一个任务的情况。

        多处理机系统中的调度

                提高计算机系统性能的途径:

                提高计算机元器件速度

                改进计算机系统体系结构

                20世纪70年代出现多处理器系统MPS(MultiProcessor System)。90年代中后期,功能较强的主机或服务器都采用了MPS。

1. 多处理器系统的类型

        不同角度分类

        1)紧密耦合MPS和松弛耦合MPS

                紧密耦合(Tightly Coupted)

                        高速总线或高速交叉开关来实现多个处理器之间的互连。

                        共享主存储器系统和I/O设备。系统中所有进程和资源由OS统一控制管理。

                松散耦合(Loosely Coupted)

                        通过通道或通信线路来实现多台计算机之间互连。

                        每台计算机都有自己的存储器和I/O设备,可以独立工作。

        2)对称MPS和非对称MPS

                对称多处理系统SMPS(Symmetric MultiProcessor System)平等型:在系统中所包含的各处理器单元在功能上和结构上都相同。当前的绝大多数MPS属于此类。

                非对称多处理器系统。主从型:系统中有多种类型的处理单元,它们的功能和结构各不相同,其中只有一个主处理器,其余为从处理器。

2. 进程分配方式

        在多处理器系统中,进程的调度与系统结构有关。

                同构性系统中,所有处理器都相同,可将进程分配到任一处理器上运行;

                非对称MPS,对任一进程而言,都只能将其分配到某一适合于其运行的处理机上去执行。下面分别介绍对称MPS和非对称MPS中的进程分配方式。

        1)对称MPS中的进程分配方式

                ①静态分配(Static Assignment)方式

                        进程从开始至完成被固定分配到一个处理器上。

                        优点是进程调度开销小,缺点是各处理器可能出现忙闲不均。

                ②动态分配(Dynamic Assignment)方式

                        系统中仅设置一个公共的就绪队列,分配进程总是给空闲处理器。某一进程的执行可能曾在不同的处理器上。

                        优点是消除忙闲不均现象。但松散耦合系统增大调度开销。

        2)非对称MPS中的进程分配方式

                OS的核心部分驻留在一台主机上,而从机上只是用户程序,进程调度只由主机执行。主机中保持有一个就绪队列。

                每当从机空闲时向主机发一索求进程信号,然后等待主机分配进程。

                优点是系统处理比较简单,缺点是处理靠一台主机导致不可靠。(克服缺点的方法是利用多台而非一台管理系统)

3. 进程(线程)调度方式

        MPS已广为流行多年,存在着多种调度方式,许多都是以线程作为基本调度单位的,比较有代表的如下:

1)自调度(Self-Scheduling)方式

        自调度机制,最简单的一种调度方式。

        系统中设置一个公共的进程或线程就绪队列,所有的处理器空闲时,都可自己到该队列中取得一进程(线程)来运行。

        调度算法:可采用FCFS、FPF和抢占式最高优先权优先调度算法等。经实验证明FCFS算法在多处理器环境下简单开销小,目前成为较好的调度算法。

自调度方式的特点

        优点:

                  1)易将单机环境下的调度机制移植到MPS中;

                  2)不会发生处理器忙闲不均的现象,有利于提高处理器的利用率。

        缺点:   

                  1)瓶颈问题。多处理器互斥访问唯一就绪队列。

                  2)低效性。高速缓存的使用效率很低。

                  3)线程切换频繁。相关的其他线程未必会同时获得处理器导致切换频繁。

2)成组调度(Gang Scheduling)方式

        为解决自调度方式中线程频繁切换的问题

        将进程的一组线程分配到一组处理器上去执行。分配处理器时间的方式:

                ①面向所有应用程序平均分配处理器时间

                ②面向所有线程平均分配处理器时间

        优点:

                相互合作的进程或线程能并行执行,可有效的减少阻塞,减少切换使系统性能得到改善;

                每次调度都可以解决一组线程的处理器分配问题,故可显著减少调度频率,减少了调度开销。

3)专用处理器(Dedicated Processor Assignment)方式

        1989年Tucker提出该方式。在一个应用程序的执行期间,专为该应用程序分配一组处理器,每一个线程一个处理器。

        这种方式很浪费。但仍有利用市场,适用于并发程度相当高的多处理机环境:

                对系统的性能和效率来讲,单个处理器的利用率已不太重要。

                “专用”完全避免了切换,从而大大加速了程序运行。

                同时加工的应用程序,线程总和不应超过系统处理机的数目。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容