精华内容
下载资源
问答
  • 怎么软件问题报告?

    2021-03-23 15:43:33
    为了便于管理测试发现的软件错误,通常要采用软件缺陷数据库,将每一个发现的错误输入到 怎么软件问题报告?软件测试 在软件测试过程中,对于发现的每个软件错误(缺陷),都要进行记录该错误的特征和复现步骤等...
  • 大二下学期的操作系统实验,本项目含源代码、实验报告,简单的解决方法。

    转载请指明出处

    !!!本文严格按照实验报告规格所写,如果仅需要代码详情,可直接参考代码部分

    项目地址ReaderAndWriter(希望能动动小手,点个star)

    一、需求分析

    (一)、实验相关概念

    在某些进程并发运行的过程中,可能会频繁的访问共享资源,那么不同的读写执行顺序一般来说可能会导致不同的结果,换句话说,并发通常会导致数据的同步问题

    其中最著名的问题之一就是读者-写者问题,该问题的定义如下:

    存在一个多线程共享的数据区(临界区),有些进程(读进程)只读取这个数据区中的数据,有些进程(写进程)只往数据区中写数据,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误(数据同步问题)。因此要求:

    • 任意数量的读进程可以同时读这个文件。
    • 一次只有一个写进程可以写文件。
    • 若一个写进程正在写文件,则禁止任何读进程读文件

    也就是说,读进程不需要排斥其他读进程,而写进程需要排斥其他所有进程,包括读进程和写进程

    (二)、实验任务概括

    在读者-写者问题中,有多种解决方案:读者优先写者优先公平竞争

    读者优先策略中,读进程具有优先权,也就是说,当至少有一个读进程在读时,随后的读进程就无需等待,可以直接进入;在这过程中,写进程会被阻塞,直到所有的读进程读完(写进程可能会饥饿)。

    本次实验主要针对读者优先这个解决方案展开,利用多线程模拟读者与写者对临界区的互斥访问。

    (二)、测试数据要求

    本实验的测试数据保存在文件中。

    测试数据文件包括 n 行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间

    每行测试数据包括四个字段,各个字段间用空格分隔:

    • 第一字段为一个正整数,表示线程序号。
    • 第二字段表示相应线程角色,R 表示读者,W 表示写者。
    • 第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。
    • 第四字段为一个正数,表示读写操作的持续时间:当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。

    测试数据随机生成,为简化起见,假设每个线程只执行一次读或写操作,之后运行结束。

    下面是一个测试数据文件的例子:

    为了方便排版,因此用表格表示。其中每一行对应文件中的一行。

    线程序号角色何时开始读写读写持续时间
    1R35
    2R45
    3W52

    二、概要设计

    (一)、抽象数据类型

    在并发的问题中,关键的是要解决互斥问题。而在互斥的解决方案中,通常采用信号量、管程等工具。

    在本次实验中,我采用的是信号量这个不要求忙等的同步互斥工具。由于要实现互斥功能,所以应该将相应的信号量初始化为1。

    由一开始的需求分析可知,在读者-写者问题的临界区使用中,读者与读者之间不存在互斥问题,写者与写者之间存在互斥问题,写者与读者之间也存在互斥问题。所以需要设计一个信号量wr来实现一个写者与其他读者或写者之间的互斥

    到这里就完成了基于信号量的读者-写者问题的抽象数据类型定义,这个抽象类型在读者优先策略和写者优先策略都能用到。

    (二)、程序实现流程

    流程

    三、详细设计

    (一)、读者优先策略实现

    在本次实验中,由于采用的是读者优先策略,所以要针对这个策略来进行进一步详细的设计。

    在读者优先策略中,当至少有一个读进程在读时,随后的读进程就无需等待的要求,因此需要设计一个记录读者数量的变量readCount

    当有读者进入临界区时,readCount就自动加1;当有读者离开临界区时readCount就自动减1。所以当readCount为1时,说明第一个读者进入临界区,此时可以对临界区进行加锁(即将信号量wr递减),这就使得后来的写者无法进入临界区,而随后的读进程无需进行临界区加锁,可以直接进入临界区;只有当所有的读者离开后,即readCount为0时,才释放临界区的锁(即将信号量wr递增),这时被阻塞的写者才能进入临界区,并进行加锁操作。

    虽然在临界区中,读者与读者并不存在互斥问题,但是在多个读者修改readCount变量时,可能导致数据同步问题。所以还应该设计一个信号量x来确保readCount变量互斥访问

    流程图如下(可能难以理解,其中是多线程操作):

    流程

    实现上述操作的伪代码如下(用semWait和semSignal模拟加锁、解锁操作):

    1.	Reader(){  
    2.	    semWait x  
    3.	    readcount++  
    4.	    if readcount == 1  
    5.	        semWait wr  
    6.	    semSignal x  
    7.	    read() //读操作  
    8.	    semWait x  
    9.	    readcount--  
    10.	    if readcount == 0  
    11.	        semSignal wr  
    12.	    semSignal x  
    13.	}  
    14.	  
    15.	Writer(){  
    16.	    semWait wr  
    17.	    write() //写操作  
    18.	    semSignal wr  
    19.	}
    

    在这次实验中,我采用了java语言来进行代码的实现。由于之前学习过java的并发编程,我知道在java中有一个现成的信号量类Semaphore(Semaphore是synchronized的加强版,作用是控制线程的并发数量。——摘自百度)。它将基本的信号量操作都进行了封装,使用起来也很方便。由于实验的重点是实现读者-写者问题,并没有要求要自行定义和封装信号量这个类,所以我打算直接引用这个类,方便后面代码的实现。

    因此,所有的全局变量定义如下(java代码):

    1.	private final Semaphore x = new Semaphore(1);  
    2.	private final Semaphore wr = new Semaphore(1);  
    3.	private int readCount = 0;  
    

    (二)、其他函数、方法实现(太过基础,代码略)

    在读者类、写者类的实现中,应该实现Runnable接口,并重写run方法(在run方法中具体实现读者或写者的读或写操作),这样就能实现用多线程来模拟读者、写者过程。

    由于本次实验要读取测试数据文件,并根据每一行的数据生成响应的线程,其中每个线程要含有该线程的序号、对临界区的申请操作时间、对临界区的执行时间。所以应该将这三个变量绑定到每个线程上(作为类的成员变量),并在线程中利用Thread.sleep()这个函数来模拟读、写操作和申请操作的时间延迟

    另外,实验还要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,这个也能很容易的实现。

    四、调试分析

    (一)、调试过程

    在测试几组数据之后,我发现了一个和我想象中结果不一致的问题:

    就是当一个写者在写的时候,后面有写者和读者在等待。我一直以为,当写者结束操作释放信号量wr后,下一个访问临界区一定是读者(毕竟叫读者优先策略),所以一直在检查前面分析的步骤,并且查阅资料(可惜百度并没有这方面的资料)。

    最后还是请教了老师,然后才知道下一个访问临界区的对象,是要通过抢占信号量wr来决定谁是下一个访问临界区

    测试文件数据如下:

    1 W 2 4

    2 R 3 5

    3 W 5 4

    4 W 8 5

    5 W 10 3

    6 R 12 3

    测试结果如下:

    结果

    (二)、设计过程的经验和体会

    ​ 由于先前学习过java并发编程,对多线程的同步互斥比较熟悉,因此这次实验对我来说并没有想象中那么困难。

    ​ 这个程序我认为唯一有缺陷的地方就是:所有线程并不是同时创建的(本该同时申请操作的线程可能会有一个先后顺序),而是在对文件逐行扫描时创建,因此对实验中这个要求可能无法完美实现(线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请)。每个线程的创建之间可能会有几微秒的延迟,在文件行数少的情况下完全可以忽略。但如果文件行数是百万级别的,可能这个延迟就会被放大,第一个线程和最后一个线程创建时间可能相差几秒,这对结果可能会产生影响。在我目前的水平来说,并没有办法完美解决这个问题,通过百度也得知,几乎无法在让线程绝对的同时创建,这是我比较遗憾的一个地方了。

    ​ 在实验中我也发现我很容易进入思维的定势。就如同调试过程中提及的一样,很容易被文字的字面意思所误导。这要求我应该反思自己,并改正这个不良的习惯。

    五、用户使用说明

    按照需求分析里的要求创建一个测试数据文件,将其命名为test.txt并放到源代码目录下的src目录(与主要代码同级);或者直接修改源代码目录下的src目录中的test.txt文件,输入想要测试的数据,之后运行Main程序即可看到结果(按照java方式运行)。

    六、测试与运行结果

    (一)、第一次测试

    测试文件数据如下:

    1 R 3 5

    2 R 4 5

    3 W 5 2

    4 R 10 3

    5 W 11 3

    6 R 13 4

    测试结果如下:

    结果2

    (二)、第二次测试

    测试文件数据如下:

    1 W 2 4

    2 R 3 5

    3 R 5 2

    4 W 7 4

    5 R 11 3

    测试结果如下:

    结果3

    七、源代码

    (一)、信号量、读者类和写者类定义

    import java.util.concurrent.Semaphore;
    
    /**
     * @author 思而常青
     * @since 2020-08-20 15:30
     */
    public class RWProblem {
        private final Semaphore x = new Semaphore(1);
        private final Semaphore wr = new Semaphore(1);
        private int readCount = 0;
    
        /**
         * 读者
         */
        class Reader implements Runnable {
            /**
             * 线程的序号
             */
            private final String num;
            /**
             * 线程操作申请时间
             */
            private final long startTime;
            /**
             * 线程操作申请时间
             */
            private final long workTime;
    
            Reader(String num, long startTime, long workTime) {
                this.num = num;
                this.startTime = startTime * 1000;
                this.workTime = workTime * 1000;
                System.out.println(num + "号读进程被创建");
            }
    
            /**
             * 读过程
             */
            private void read() {
                System.out.println(num + "号线程开始读操作");
                try {
                    Thread.sleep(workTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(num + "号线程结束读操作");
            }
    
            @Override
    
            public void run() {
                try {
                    Thread.sleep(startTime);
                    System.out.println(num + "号线程发出读操作申请");
                    x.acquire();
                    readCount++;
                    if (readCount == 1) {
                        wr.acquire();
                    }
                    x.release();
                    read(); //读过程
                    x.acquire();
                    readCount--;
                    if (readCount == 0) {
                        wr.release();
                    }
                    x.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 写者
         */
        class Writer implements Runnable {
    
            private final String num; //线程的序号
            private final long startTime; //线程操作申请时间
            private final long workTime; //线程的执行时间
    
            Writer(String num, long startTime, long workTime) {
                this.num = num;
                this.startTime = startTime * 1000;
                this.workTime = workTime * 1000;
                System.out.println(num + "号写进程被创建");
    
            }
    
            /**
             * 写过程
             */
            private void write() {
                System.out.println(num + "号线程开始写操作");
                try {
                    Thread.sleep(workTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(num + "号线程结束写操作");
            }
    
            @Override
            public void run() {
                try {
                    Thread.sleep(startTime);
                    System.out.println(num + "号线程发出写操作申请");
                    wr.acquire();
                    write(); //写过程
                    wr.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    (二)、 主程序(读取文件等操作)

    import java.io.BufferedReader;
    import java.io.FileReader;
    
    /**
     * @author 思而常青
     * @since 2020-08-20 15:36
     */
    public class Main {
        public static void main(String[] args) {
            RWProblem readerAndWriter = new RWProblem();
            String filepath = "src/test.txt";
            try (BufferedReader br = new BufferedReader(new FileReader(filepath))) {
                String line;
                while ((line = br.readLine()) != null) {
                    String[] words = line.split(" ");
                    //线程数
                    String num = words[0];
                    //线程类型
                    String type = words[1];
                    //线程操作申请时间
                    long startTime = Long.parseLong(words[2]);
                    //线程的执行时间
                    long workTime = Long.parseLong(words[3]);
                    if ("R".equals(type)) {
                        RWProblem.Reader reader = readerAndWriter.new Reader(num, startTime, workTime);
                        new Thread(reader).start();
    
                    } else if ("W".equals(type)) {
                        RWProblem.Writer writer = readerAndWriter.new Writer(num, startTime, workTime);
                        new Thread(writer).start();
                    } else {
                        System.out.println("测试文件出错");
                        throw new Exception();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    项目地址ReaderAndWriter(希望能动动小手,点个star)

    请大家多多支持!!!

    展开全文
  • 如何好一个BUG报告

    千次阅读 2018-08-02 14:47:22
    “编写问题报告(bug报告)的目的是修复bug”-由CemKaner编写。如果测试人员没有正确报告错误,程序员很可能会拒绝此错误,称其为不可复制的。 这会伤害测试员的道德,有时也会伤害自我。(我建议不要保持任何自我。...

    为什么是好的Bug报告?

    如果您的错误报告是有效的,那么它得到修复的机会就会更高。因此,修复bug取决于您如何有效地报告它。报告错误只是一种技能,我将解释如何实现这一技能。

    “编写问题报告(bug报告)的目的是修复bug”-由CemKaner编写。如果测试人员没有正确报告错误,程序员很可能会拒绝此错误,称其为不可复制的。

    这会伤害测试员的道德,有时也会伤害自我。(我建议不要保持任何自我。自我就像“我正确地报告了错误”、“我可以复制它”、“为什么他/她拒绝了这个错误?”、“这不是我的错”等等)。

    一个好的软件缺陷报告的质量是什么?
    任何人都可以写错误报告。但并不是每个人都能写出有效的bug报告。

    您应该能够区分一般的bug报告和好的bug报告。如何区分好的和坏的错误报告?非常简单,应用以下特性和技术报告错误。

    特点和技术包括:

    1)有明确规定的虫号:

    始终为每个bug报告分配一个唯一的编号。这反过来将帮助您识别错误记录。如果您正在使用任何自动错误报告工具,则每次报告错误时都会自动生成此唯一编号。

    请注意您报告的每个bug的数量和简要描述。

    2)可重复性:

    如果您的错误是不可复制的,那么它将永远不会被修复。

    您应该清楚地提到重现bug的步骤。不要假设或跳过任何复制步骤。一步描述的bug很容易复制和修复。

    3)具体:

    不要写关于这个问题的文章。

    具体点,切中要害。试着用最少的词来概括这个问题,但要用一种有效的方法。不要将多个问题结合在一起,即使它们看起来是相似的。为每个问题写不同的报告。

    有效的Bug报告
    错误报告是软件测试的一个重要方面。一份有效的bug报告与开发团队进行了良好的沟通,避免了混乱或错误沟通。

    一个好的bug报告应该是简明扼要没有遗漏关键点。任何不明确的情况都会导致误解,也会减缓开发过程。缺陷写入和报告是测试生命周期中最重要但却被忽略的领域之一。

    好的写作对于错误的归档是非常重要的。测试人员应该记住的最重要的一点是不要用威严的语气在报告里。这破坏了士气,造成了一种不健康的工作关系。用暗示的语气。

    别以为开发人员犯了一个错误,因此您可以使用严厉的话。在报告之前,同样重要的是检查是否报告了相同的bug。

    重复的错误是测试周期中的一个负担。检查所有已知bug的清单。有时,开发人员可能已经知道了这个问题,并在以后的版本中忽略了这个问题。也可以使用Bugzilla这样的工具自动搜索重复的bug。但是,最好手动搜索任何重复的bug。

    错误报告必须通信的导入信息是“怎么做?”和“在哪里?”报告应该清楚地回答测试是如何进行的,缺陷发生在哪里。读者应该很容易地复制错误,并找到错误所在。

    记住编写错误报告的目的就是让开发人员可视化这个问题。他/她应该清楚地理解错误报告中的缺陷。请记住提供开发人员正在寻找的所有相关信息。

    另外,请记住,bug报告将保留下来供以后使用,并且应该用所需的信息很好地编写。使用有意义的句子和简单的单词来描述你的虫子。不要使用令人费解的语句来浪费审阅者的时间。

    将每个bug报告为一个单独的问题。在单个错误报告中出现多个问题时,除非所有问题都得到解决,否则无法关闭它。

    所以最好是把问题分成不同的错误。这确保了每个bug都可以单独处理。一个写得很好的bug报告可以帮助开发人员在他们的终端复制bug。这也有助于他们诊断问题。

    怎么报告臭虫?
    使用以下简单的Bug报告模板:

    这是一个简单的错误报告格式。根据您正在使用的bug报告工具,它可能会有所不同。如果您正在手动编写bug报告,那么需要特别提到一些字段,比如Bug编号,应该手动分配。

    记者: 你的名字和电子邮件地址。

    产品:你在哪种产品里发现了这个漏洞。

    版本: 产品版本(如果有的话)。

    构成部分:这些是产品的主要子模块。

    平台:提到你发现这个错误的硬件平台。各种平台如“PC”、“MAC”、“HP”、“Sun”等。

    操作系统: 提到所有你发现错误的操作系统。操作系统,如Windows,Linux,Unix,SunOS,MacOS。提到不同的操作系统版本,如Windows NT,Windows 2000,WindowsXP等,如果适用的话。

    优先事项:什么时候应该修复bug?优先级通常从P1设置为P5。P1为“以最高优先级修复错误”,P5为“时间允许时的修正”。

    严重程度:
    这描述了bug的影响。
    严重程度类型:

    阻滞剂:没有进一步的测试工作可以做。
    关键:应用程序崩溃,数据丢失。
    专业:主要功能丧失。
    未成年人:轻微的功能丧失。
    琐碎的:一些UI增强。
    增强:请求新特性或现有功能中的某些增强。
    现状:

    当您将错误记录到任何bug跟踪系统中时,默认情况下,bug状态将是‘New’。
    后来,这个bug经历了不同的阶段,比如修复、验证、重新打开、不会修复等等。

    分配给:

    如果您知道哪个开发人员负责bug发生的特定模块,那么您可以指定该开发人员的电子邮件地址。否则保持空白,因为这样会将错误分配给模块所有者,如果不是,Manager将错误分配给开发人员。可能在CC列表中添加经理的电子邮件地址。

    URL:

    错误发生的页面URL。

    摘要:

    一个简要的错误摘要,大部分是在60个字或以下。确保你的总结反映了问题所在。

    描述:

    对错误的详细描述。

    对Description字段使用以下字段:

    复制步骤:显然,请提到重现bug的步骤。
    预期结果:应用程序在上述步骤上的行为方式。
    实际结果:运行上述步骤的实际结果是什么,即错误行为。
    这些是bug报告中的重要步骤。您还可以添加“报告类型”作为另一个字段来描述错误类型。

    报告类型包括:

    1)编码错误
    2)设计误差
    3)新建议
    4)文件问题
    5)硬件问题

    Bug报告中的重要特征
    以下是bug报告中的重要特性:

    1)Bug编号/id:

    bug编号或标识号(如swb 001)使错误报告和引用bug变得更加容易。开发人员可以很容易地检查某个特定的bug是否已经修复。它使整个测试和再测试过程更加顺畅和简单。

    2)Bug标题:

    bug标题比bug报告的任何其他部分都更频繁地被读取。它应该能说出bug的全部内容。

    bug标题应该具有足够的暗示性,使读者能够理解它。一个清晰的bug标题可以让读者更容易理解,并且读者可以知道错误是先前报告的还是已经修复的。

    3)优先事项:

    根据bug的严重程度,可以为其设置优先级。一个bug可以是一个积木,批评,主要,小,琐碎,或一个建议。可以给出从P1到P5的bug优先级,以便首先查看重要的错误。

    4)平台/环境:
    操作系统和浏览器配置对于明确的错误报告是必要的。这是最好的方式来沟通的错误如何可以被复制。

    如果没有确切的平台或环境,应用程序的行为可能会有所不同,测试端的错误可能不会在开发人员端复制。因此,最好清楚地提到检测bug的环境。

    (5)说明:
    bug描述有助于开发人员理解bug。它描述了遇到的问题。糟糕的描述会造成混乱,也会浪费开发人员和测试人员的时间。

    有必要在描述中清楚地说明效果。使用完整的句子总是有帮助的。一个很好的做法是分开描述每个问题,而不是把它们完全分解。不要使用“我认为”或“我相信”这样的术语。

    6)复制步骤:
    一个好的bug报告应该清楚地提到复制的步骤。这些步骤应该包括导致错误的操作。不要做一般的陈述。在接下来的步骤中要明确。

    下面是一个很好的书面程序的例子

    步骤:

    选择产品Abc 01。
    单击“添加到购物车”。
    单击“移除”将产品从购物车中移除。
    7)预期和实际结果:
    一个错误描述是不完整的,没有预期的和实际的结果。有必要概述测试的结果和用户应该期望的结果。读者应该知道测试的正确结果是什么。很明显,提到在测试期间发生了什么以及结果是什么。

    8)截图:
    一幅画胜过千言万语。以失败实例的截图为例,配上适当的标题,突出显示缺陷。用浅红色高亮显示意外错误消息。这提请注意所需的领域。

    写一份好的Bug报告的一些奖励小窍门
    下面给出了一些更多关于编写好的bug报告的提示:

    1)立即报告问题:

    如果在测试过程中发现任何错误,则不必等待稍后编写详细错误报告。相反,请立即编写错误报告。这将确保一个良好的和可重复的错误报告。如果稍后决定编写bug报告,那么很有可能错过报告中的重要步骤。

    (2)在编写bug报告之前复制该错误三次:

    你的窃听器应该是可复制的。确保您的步骤足够健壮,可以在没有任何歧义的情况下重现bug。如果您的bug不是每次都可以复制,那么您仍然可以提交一个bug,其中提到了bug的周期性。

    3)在其他类似模块上测试相同的bug:

    有时,开发人员对不同的相似模块使用相同的代码。因此,一个模块中的bug也更有可能发生在其他类似模块中。您甚至可以尝试找到您发现的更严重版本的bug。

    4)编写一个很好的bug摘要:

    bug摘要将帮助开发人员快速分析bug的性质。质量不佳的报告会不必要地增加开发和测试时间。与错误报告摘要进行良好的沟通。请记住,bug摘要被用作在bug目录中搜索bug的参考。

    5)点击提交按钮前阅读错误报告:

    阅读错误报告中使用的所有句子、单词和步骤。看看是否有任何句子会造成歧义,从而导致误解。为了有一个清晰的错误报告,应该避免误导性的词语或句子。

    6)不要使用辱骂性语言:

    很好,你做了一个很好的工作,发现了一个bug,但不要用这个信用来批评开发人员或×××任何个人。

    结语
    毫无疑问,你的错误报告应该是一份高质量的文件.

    专注于编写好的bug报告,并花一些时间在这个任务上,因为这是测试人员、开发人员和管理人员之间的主要交流点。管理者应该让他们的团队意识到,编写一个好的bug报告是任何测试人员的首要责任。

    您为编写一个好的bug报告所做的努力不仅可以节省公司的资源,而且还可以在您和开发人员之间建立良好的关系。

    展开全文
  • 学习了读者、问题,在完成读者优先的算法时发现了一个简单的方法论,感觉豁然开朗,所以首先讲讲我发现的方法论,然后按照这个来解决这个问题。1、找出问题2、分析问题成因3、根据成因提出解决方案读者优先://...

    学习了读者、写者问题,在完成读者优先的算法时发现了一个简单的方法论,感觉豁然开朗,所以首先讲讲我发现的方法论,然后按照这个来解决这个问题。

    1、找出问题

    2、分析问题成因

    3、根据成因提出解决方案

    这里写图片描述

    读者优先:

    //此版本有瑕疵,完整版本烦请继续阅读
    
    Semaphore rwmutex = 1;//用于写者与其他读者/写者互斥访问共享数据
    int rcount = 0;//读者计数器
    cobegin
        proceduer reader
        {
            rcount ++ ;//----------1
            if(rcount == 1) P(rwmutex);
            //----------2
            读数据;//----------3
            rcount -- ;
            //----------4
            if(rount == 0) V(rwmutex);
        }
    
        proceduer writer
        {
            P(rwmuten);
            写数据;//----------5
            V(rwmutex);
        }
    coend

    以上1-5处都会出现错误,自行分析~

    //完整版本
    Semaphore rwmutex = 1;//用于写者与其他读者/写者互斥访问共享数据
    Semaphore rmutex = 1;//用于读者互斥访问
    int rcount = 0;//读者计数器
    cobegin
        proceduer reader
        {
            P(rmutex);//防止“++”操作被打断
            rcount ++ ;
            if(rcount == 1) P(rwmutex);
            V(rmutex);
            读数据;
            P(rmutex);//防止“--”操作被打断
            rcount -- ;
            if(rount == 0) V(rwmutex);
            V(rmutex);
        }
    
        proceduer writer
        {
            P(rwmuten);
            写数据;
            V(rwmutex);
        }
    coend

    写者优先:

    即唤醒时优先考虑写者。
    假设读者数固定为10。

    Semaphore rwmutex = 1;//用于写者与其他读者/写者互斥的访问共享数据
    Semaphore rmutex = 10;//表示最多10个读者进行读操作
    cobegin
        procedure reader
        {
            P(rwmutex);//读者、写者互斥
            P(rmutex);
            V(rwmutex);//释放读写互斥信号量,允许其他读、写进程访问资源;
            读数据;
            V(rmutex);
        }
    
        procedure writer
        {
            P(rwmutex);
            for(int i = 1;i <= 10;i++) P(rmutex);//禁止新读者,并等待已进入的读者退出
            写数据;
            for(int i = 1;i <= 10;i++) V(rmutex);//恢复允许rmutex 值为10
            V(rwmutex);
        }
    coend

    算法代码参考王昭礼的《操作系统之PV金典》

    展开全文
  • 从最先开始的需求调研,到最后的产品成型,自己亲自过手的需求报告大概也有十来篇了,与高层领导过会并定型的报告有6篇。这些报告既有关于新产品规划的,又有老产品迭代升级的。作为一个阶段性的总结,我认为有必要...

    从最先开始的需求调研,到最后的产品成型,自己亲自过手的需求报告大概也有十来篇了,与高层领导过会并定型的报告有6篇。这些报告既有关于新产品规划的,又有老产品迭代升级的。作为一个阶段性的总结,我认为有必要将自己的心得体会记录下来,方便同仁之间交流,也方便日后的反思与进步。

    首先,需求报告(或者产品报告)与科技论文有一定的相似之处,但又有很大的不同。
    其二,不管是新产品还是老产品的报告,他们的好坏都会有东家为此买单,如果是自己创业的话,你得为自己买单。
    其三,别说空话套话,来点实在的,有些人甚至连百度都不愿意搜一下,然后跟你大谈特谈怎么做,可笑。殊不知,你想到的,可能别人也想到了,或者想的更好。
    最后,别只是想想,哪怕动手搜一下呢,要学习的东西很多。


    我所处的行业是计算机系统集成,同时也有软件算法的开发,但是本文虽然与大多数领域有一定的偏差,但是也希望有借鉴作用。总的来说,报告是要给领导看的,给出建议,如何做,怎么做,优势劣势讲清楚。让领导觉得做这件事情是有意义的,而不是把报告拿给客户看,实际上就是说服领导以及具体干事情的人。整个报告就要围绕这个来写。那么,你就得有理有据,条理清晰,要不然会打架的,真的会打架。(时时刻刻牢记这一点)

    不多说,我就从两个方向来整理。一个是新产品的报告,另外一个是既有产品的报告。在写的时候,我会列出提纲,然后说,每一个章节都写些什么东西。


    一、新产品的需求报告(产品报告)

    新体现在两个方面,一个方面是,对公司来说是新的(市场上有其他的公司在做)。第二个方面是对市场上来说是新的。目前我所规划的产品,都是在市场上是新的。这是因为,市场上的新产品是有先发优势的。而去做别人已经在做的产品,难度大,需要投入的人力物力很大。
    新产品的报告不同于既有产品,如果是你规划的,那么再没正式实施之前,你就是负责人,整个公司就只有你自己懂。那么,像这样的报告怎么写呢?
    新产品的报告,主要目的是在你看好这个市场的情况下,结合公司的自身条件,说服你的老板,投入人力物力进行研发,然后上市形成产值,带来利润。所以,报告一定要围绕这个目的来写,要不然很容易被否决掉。

    新产品的报告包括一下几个部分:

    1、背景
    新产品的报告,就相当于进入一个新的产品模式。公司里面大部分人都不知道,或者不懂。这个时候,你就需要从大方向上,小细节上有一个全面的介绍。比如说,在国家层面上,在行业上。具体到实际的场景时,又是怎么样的。这些大的宏观性的东西要说清楚。另外,在介绍具体的实际场景时,一定要说明白这个场景的一些信息,有哪些东西,发生过哪些事情,这些事情造成了哪些不好的影响,所以我们要做这件事情,帮助解决这个不好的影响,如果我们解决了这个问题,会带来哪些好处(好处不光是对公司而言的,更是对客户而言的,同时也是对这个行业而言的。要把各方的厉害关系都说明白,如果确实很重要,可以用一些很吓人的词,比如说,影响仕途,掉脑袋,人命关天,对半的利润等等等)。

    2、业务模式分析
    在规划这个产品之前,最好有一个可以落地的地方。在写报告之前,肯定要做一些前期的调研准备工作,找到一个产品可以落地的地方(我在规划新产品时,在客户的沟通中,使得客户明白做这个事情是有必要的,当客户确认要上之后,后面的事情就好做了。因为大多数的客户基本也都是这个模式)。在落地的地方找到之后,就要对目标客户做一个详细的业务模式调研。比如说,客户在做某件事情的时候,都是个怎么样的流程,先干什么,再干什么,数据是怎么样记录的,记录之后还干了哪些事情,如果出现了问题,又是如何处理的,怎样处理的,处理结果是怎么上报的,多久干一次,一次花多少时间,要多少人,是否有倒班,倒班是怎样安排的,整个流程中都有哪些人参与。这些都是很重要的信息。有时候,客户可能自己都不清晰,这个时候,就需要你来帮客户整理了,你要主动发问,有目的问。

    3、存在问题分析

    这个部分主要是聚焦于要解决的核心问题。不同于业务模式,业务模式偏重于数据的展示和利用以及用户体验等。而这个部分则是整个产品的一个核心。解决的问题,不是要解决所有问题,而是要解决关键的,哪些直接关系到客户运营和使用的问题。对于哪些小的,并不是很急切的问题,可以放在后面的产品迭代升级时来做。
    同样的,在这一部分,最好列出所有的问题,同时说明哪些是亟待解决的,哪些是可以放在后面解决的。另外,还要调研一下这些问题产生的原因是什么,这样才能有的放矢。找出针对性的解决方案。

    4、竞品分析(潜在对手)
    虽然我们可以做这个产品,那是不是也有其他的厂家可以做呢?这个就看调研的是不是仔细了。主要是看客户那边有没有让其他公司进来的意愿。

    5、需求项点描述

    通过第2,3,4章的说明,已经基本上对要干什么事情做了说明,那么具体需要做哪些,就需要有一个总结。
    这一章的需求项点,要清楚简明的说明要解决哪些问题,不用太啰嗦。(最好按照功能模块来,有哪些模块,每个模块的功能是啥)

    6、可行性分析

    这个部分就要从多个方面来阐述,包括,公司既有的研发能力、公司既有的市场拓展能力,产品前景,时间节点行业技术条件限制是否满足,有没有专利等的技术纠纷等。各个方面分析到位,这个也是展示给领导看时的一个关键环节。告诉你的领导,我们能行。

    7、技术要求及技术路线
    首先,既然是新产品,要有总体的设计架构,各个部分的设计架构,功能设计,软件设计,硬件设计等等。然后针对每个功能点做详细的技术说明。

    8、验证方式及验证指标
    技术路线等等都提出来了,等研发出来就要去测试,所以如何验证,以及验证指标是什么,你得明白,因为是你跟客户聊的,只有你知道客户想要一个怎样的效果。所以你得定。

    9、知识产权
    明确的说明你需要保护哪些项点,这个时候,你要去专利查询网站,看看别人是不是已经申请专利了(这个时候,你要搞清楚,保护的是你提出的技术方案,而不是你得想法,也不是你的需求点)。

    10、成本费用
    大致说明,做这件事情,需要花多少钱(你要针对你提出的技术方案来说,提了几个方案,你就把这几个方案的成本都统计一下)。这个就需要你好好调研了,领导看了批不批,大部分还是看成本。

    11、市场前景及商业模式
    这个部分就是如何买产品了,有很多方法可以参考,而且也是很考验功底的地方。
    第一个就是市场前景,告诉你得老板,可以买多少钱,赚多少钱。
    第二个就是怎么样运作这个产品,卖得越多越好(我也不知道怎么写,看个人,最好跟高层,跟市场多接触,然后提出你的想法)。

    二、既有产品迭代升级需求报告(产品报告)

    既有产品的报告主要包含以下几个部分
    1、背景
    背景说明实际上就是你对前期工作的一个总结,这个工作包括你大量的沟通调研、现场调研、问题总结分析、各部门的沟通协调等等。通过这样一个背景,告诉大家,你要干什么,最好是总结的话语。(就像是论文的摘要一样)
    既然是产品迭代,那么肯定要对既有的产品做一个总结,以及你自己的调研。这个过程务必要详细了解,它主要是看你对产品的了解程度。比如说,这个设备,这个系统都有哪些部分构成,每个部分的原理是怎样的,如果是软件的话,得搞清楚编程软件,编程语言,系统架构,功能架构等等这些。同时,通过与各个部门责任人的沟通的过程中,也要搞清楚,有哪些问题在解决,哪些问题待解决,还有他们知道的,但是没有去跟踪的问题。

    2、存在问题分析
    存在问题分析就考研个人能力了。我的方法是:
    首先,通过与各部门负责人、现场业务调研、现场使用人员的沟通(你需要多调研几个客户,以便有说服力),了解产品有哪些问题,还有哪些地方需要改进
    其次,将前期收集的资料进行整理,罗列所有的存在的问题,并对问题进行分类,例如,硬件的,软件的等等。
    再次,将分类好的每个问题进行详细的描述,也就是说要说明白这个到底是什么问题。
    第四,进行存在问题的分析。就是说,是什么原因导致这个问题。为什么要做个呢,因为只有知道了是什么原因导致的,才可以对症下药。
    第五,跟各部门负责人沟通,自己总结的问题里面,哪些是已经解决的,哪些正在解决的,解决的时间,解决的计划时间是多少。
    第六,针对哪些没有解决的问题,按照优先级次序进行分门别类,说明那个要先解决,那个后解决。

    3、竞品分析

    竞品分析是一个主要的也是很重要的部分。这个过程就是要了解都有哪些竞争对手,竞争对手的产品是怎样的,用户体验怎么样。可以通过实际操作、客户走访等方式获得,必要的时候,可以请市场部配合。
    注意,在第二章中,罗列了很多问题,在竞品分析的时候,要搞清楚竞争对手的产品是不是也有这些问题。

    4、已有客户业务模式分析

    客户业务模式分析是定义产品,以及规划产品的主要依据。产品好不好,不是看产品的功能多不多,而是看产品好不好用,能不能解决实际使用中的问题。
    客户的业务模式,需要通过实际使用中,与客户了解沟通才行。必要的时候,可以请吃个饭,搞点夜宵啥的。业务模式最好用个流程图来说明,这样方便说明。

    5、需求项点描述

    通过第2,3,4章的说明,已经基本上对要干什么事情做了说明,那么具体需要做哪些,就需要有一个总结。
    这一章的需求项点,要清楚简明的说明要解决哪些问题,正在解决的就不要再罗列了。

    6、技术要求及技术路线
    针对第5章提出的各个需求项点,总得有办法解决才行。一般,我的做法是,先跟开发联络,这些项点能不能被他解决,解决方式是怎样的,不能解决的先给个大致方案,会上讨论。这个也是很难做的一个工作,如果开发不配合,就很那推进,而且,绕过开发之后,你会发现后面你再做其他工作的时候,推进的时候就很困难。所以。务必搞好关系。但是你也得有原则,解决客户问题也是关键,不能随便就不做了,哪怕花的时间多点,也无所谓。
    综上,就是把每个需求项点,所对应的你找到的(不管用什么方法)解决方案写上去。
    最好多提几条解决方案,不要乱提。。。。。

    7、验证方式及验证指标
    既然是对既有产品做了升级改造,你就得明白,做完之后,怎么去验证呢?这个是要考虑的问题。为了验证,需要做大量的测试,测试就要有大量的测试样本。不多说了,不懂得话,就去问开发,问测试。我之前是做开发的。

    8、知识产权
    明确的说明你需要保护哪些项点,这个时候,你要去专利查询网站,看看别人是不是已经申请专利了(这个时候,你要搞清楚,保护的是你提出的技术方案,而不是你得想法,也不是你的需求点)。

    9、成本费用
    大致说明,做这件事情,需要花多少钱(你要针对你提出的技术方案来说,提了几个方案,你就把这几个方案的成本都统计一下)。这个就需要你好好调研了,领导看了批不批,大部分还是看成本。

    10、市场前景
    做这件事情,有哪些好处,到底是提升竞争力,还是提升买点,等等这些。你得跟领导说明白,告诉领导,很重要,必须做,要快,再快点。
     

    展开全文
  • 性能测试报告怎么

    2020-08-13 16:13:37
    对性能测试报告的具体分析
  • 咋一看,好像这段代码并没有什么问题,但是在测试的时候发现无论发送多少条短信,每次都只能获取第一条短息的送达报告!!这个问题当时困扰了我很久,感觉自己明明没有错啊,为什么会出现这样莫名其妙的问题呢?...
  • 数据分析报告怎么(三)

    千次阅读 2020-04-29 10:04:42
    写报告是一回事,讲报告又是另一回事。很多新人抱怨,每天只有日报、周报、月报的常规报表,压根没有做真正分析的机会。可往往给了机会,让他做一个报告给大家听,开讲5分钟台下听众就纷纷掏出手机,愉悦的搓了起来...
  • (为了方便描述把服务器以及客户端都简称为程序) ...如果程序没有出错,那么他们会请您继续关注这个问题,收集相关的信息。 在bug报告里,要设法搞清什么是事实(例如:“我点击了XX”和“XX出现了”)什么是推测
  • 如何一篇简洁易懂的测试报告

    千次阅读 2020-01-17 10:32:29
    ##一、 什么是测试报告? 测试报告是指把测试的过程和结果成文档,对发现问题和缺陷进行分析,为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。 ...
  • 如何毕业设计——开题报告

    千次阅读 2019-06-11 21:42:30
    开题报告是指开题者对科研课题的一种文字说明材料。这是一种新的应用写作文体,这种文字体裁是随着现代科学研究活动计划性的增强和科研选题程序化管理的需要而产生的。 开题者把自己所选的课题的概况(即"开题报告...
  • 软件测试问题报告的写法

    千次阅读 2014-02-11 10:45:33
    为了便于管理测试发现的软件错误,通常要采用软件缺陷数据库,将每一个发现的错误输入到软件缺陷数据库中,软件缺陷数据库的每一条记录称为一个软件问题报告。  软件问题报告包括头信息、简述、操作步骤和注释。 ...
  • 测试报告是指把测试的过程和结果成文档,对发现问题和缺陷进行分析,为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。 二、测试执行和结束的准则 1. 测试执行的结束原因 1)测试达到预期...
  • 迷宫问题【数据结构实验报告

    万次阅读 多人点赞 2017-10-27 12:31:01
    数据结构实验报告 实验名称:实验二 迷宫问题 学号:*** 姓名:gnosed 实验日期:2017.10.23   一、实验目的 1、了解回溯法在求解迷宫问题中的应用 2、进一步掌握栈的使用   二、实验具体内容 1、实验...
  • 最近面了十多个数据分析师,聊一聊我发现的一些问题团队缺数据分析的小伙伴,因此最近一段时间一直在面试,这俩月差不多也和十多个小伙伴聊过,居士发现了不少的问题,在此和大家分享一下。分享的内容...
  • 由于近日工作汇报 交一份概要和 excel版本 发现手写 太麻烦 想个代码来自动 读取一个文本中的所有内容 按需求写入 对应excel和概要中 自动完成 就找了找python 的类库,发现了挺多小问题.和大家分享一下 如果对你...
  • C语言课程设计-球队管理系统(课设报告

    千次阅读 多人点赞 2019-07-06 22:42:43
    C语言课程设计-球队管理系统 ...仅作为参考,作为一个小白能力有限,的有点简单啊,如果想实现更多的功能可参考别的信息管理系统作为参考。 二,直接上代码 #include<stdio.h> #include<stdlib...
  • 测试报告是把测试的过程和结果成文档,并对发现问题和缺陷进行分析,为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。
  • 写报告这种文字活实在太烧脑了。。 回忆的时候思绪万千, 这一年,每天起早贪黑,工作兢兢业业, 但提起笔来,不禁泪流满面: 这一年,我特么都干了些啥呀!??   宝宝们
  • 好一份数据分析报告需要注意的13个要点先说说一份好的数据分析报告的重要性,很简单,因为分析报告的输出是是你整个分析过程的成果,是评定一个产品、一个运营事件的定性结论,很可能是产品决策的参考依据,既然...
  • 关于粮食浪费问题的调查报告

    千次阅读 2019-01-14 23:30:17
    关于粮食浪费问题的调查报告 ** 活动时间:10月29日—11月4日 活动地点:学子,银桦食堂门口,网上问卷调查。 调研人员:通信三班严劲涛2018190603033,谢双阳2018190603031,吴漾2018190603015,刘沐荻...
  • 如何好周报的思考

    千次阅读 2020-03-18 15:47:55
    现在的周报有什么问题? 最好不,不是因为占用时间,而是觉得了等于没,没人看,没人正向有内容的回复。 不知道怎么,没有参考模板,觉得流水账就够了。也不清应该从哪些方面思考。 为什么要好周报? ...
  • 问题描述  有 N 个传教士和 N 个野人来到河边渡河,河岸有一条船,每次至多可供 k 人乘渡。问:传教士为了安全起见,应如何规划摆渡方案,使得任何时刻, 河两岸以及船上的野人数目总是不超过传教士的数目(否则不...
  • 通过述职报告可以让员工发现问题,比较发现差距==》缺点==》进步述职员工: 1、涉及到BUG的问题,要突出“量”,可量化,因为量化才是可比较的。 2、下个月的工作安排,要突出压力、紧迫感。压力、紧迫感的突出可以...
  • 如何好缺陷报告

    万次阅读 多人点赞 2012-11-01 21:19:54
    今天开始和大家分享缺陷报告的内容,在这部分会讲一下缺陷的基本属性,缺陷的处理过程和如何书写缺陷报告。 一、什么是缺陷 在第一章我们说过了什么事缺陷,一切不满足用户需求的都是缺陷。 下面我们对缺陷的概念...
  • 高效利用Sentry追踪日志发现问题

    万次阅读 2017-01-05 11:19:14
    面临的问题 程序运行的日志是一个必不可少的东西,可能是一些系统信息,比如 gc 的情况;可能是一些正常的模块...我们知道日志如此重要,并乐于记录日志,然而在发现并解决问题的过程中,日志并没有想象中的高效率。
  • 不过,最近我的确有一个新发现——我发现“归类分组”在我们解决问题中起着巨大的作用。而这里的“问题”不仅仅限于软件设计,从日常生活、产品设计到公司战略、生物分类。都有它的身影。 这是为什么呢?究其原因...
  • python实现回溯法与分支限界 一、开发环境 ...1.请用回溯法求对称的旅行商问题(TSP问题) 2.请用分支限界法求对称的旅行商问题(TSP问题) 三、实验内容 旅行商问题的简单说明: 旅行商...
  • 如何好一份竞品运营分析报告

    千次阅读 2016-05-20 08:36:32
    网络上关于产品竞品分析的文章很多,做运营类竞品分析的文章比较少,所以今天抛砖引玉和大家分享一下,我在分析竞品运营中的思考和心得。 每天发生在我们APP里各种变化都是值得运营学习的最好材料,尤其是竞品的...
  • 测试开发需要学习的知识结构

    万次阅读 多人点赞 2018-04-12 10:40:58
    3、白盒测试&黑盒测试对比 白盒测试技术 (White Box Testing) : 深入到代码一级的测试,使用这种技术发现问题最早,效果也是最好的。该技术主要的特征是测试对象进入了代码内部,根据开发人员对代码和对程序的熟悉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 198,740
精华内容 79,496
关键字:

发现问题的报告怎么写