搜档网
当前位置:搜档网 › 善用SourceMonitor+Astyle,让代码维护者不再骂娘

善用SourceMonitor+Astyle,让代码维护者不再骂娘

善用SourceMonitor+Astyle,让代码维护者不再骂娘
善用SourceMonitor+Astyle,让代码维护者不再骂娘

1. 什么样的代码让你想骂娘?

什么样的代码最想让你骂娘,是这样的,代码层层嵌套

或者是这样的密密麻麻,舍不得多一行免费空格

又或者是那种又臭又长的代码呢?

代码除了用来运行外,还有很重要的就是阅读,给自己阅读,或者给他人阅读,如果几个月后你自己都看不下去自己以前写的代码,呵呵…

2. 我们需要漂亮的代码

爱美之心,人皆有之。漂亮的代码,也是我们程序猿的追求,它不仅能够完成要求的功能,而且还要整齐,有条理,易于理解。

漂亮的代码能够增强可读性,同时也减弱了出错的概率。最关键的一点,漂亮的代码不会被骂娘。

具体来说,漂亮的代码通常:

1. 代码缩进

2. 分支语句嵌套的层数较少

3. 每个函数的代码行数不会太多

4. 变量的命名有统一的风格

5. 文件命名有统一的风格

6. 注释有统一的风格

如此等等,这些都是实践中总结出来的结晶。也许你也注意到了,这些东西不就是编程规范吗?确实是如此。为了写出漂亮的代码,很多公司都会有自己的编程规范。

某些公司,还会对编程规范进行考试,足见其重视程度。

3. 善用佳软,助力代码变身

3.1 AStyle:一键代码格式化

作为一个狂放不羁的男子,我写代码从来不回头,怎么可能管你什么代码风格。尤其个人偏爱Linux,代码风格也是Linux的。对于一些非Linux代码风格的项目来说,在写完代码后,难道让我对着编程规范将函数内的大括号一个一个单独一行?

我需要一键格式化,就让我的代码风格由Linux变成GNU风格,变成JAVA风格。在我不高兴的时候,还能瞬间变回来。

我需要的就是AStyle –支持”魔法换肤”,一键变换代码风格,堪称编码界的美图秀秀。

AStyle(Artistic style),可以集成到Eclipse,VS,SourceInsight等工具中,对代码进行格式化、规范风格。AStyle默认支持Linux,ANSI,GNU,JAVA等风格,也支持自定义风格。

当不同编码风格的程序员为一个项目共同贡献代码时,特别项目周期紧张时期,经常会出现各式各样的代码导致极低的可读性和可维护性。这个时候AStyle就能很好的解决这个问题。对于我这样的懒人来说,不用去管代码缩进,将精力花在更重要的地方,就是一种减负。

3.2 SourceMonitor:识别坏味道

解决了代码风格后,是否就可以算做漂亮的代码了呢?

要知道再漂亮的衣服穿到胖子身上,也漂亮不到哪去(阿门,原谅我吧)。对于代码来说,符合代码风格只是第一步,漂亮的代码还要易于理解。让人容易理解的话,单个函数的代码行就不能太长,嵌套层数就不能太多,分支条件判断不能太多。这些工作不是代码风格能解决的。我们需要能够自动检查代码质量的工具-SourceMonitor。

SourceMonitor是一款代码质量检查的软件。能够检查文件中函数的个数,每个函数的代码行数,注释比例,函数的调用深度,圈复杂度等。

其中需要最关键的是每个函数圈复杂度和每个函数的代码行数。圈复杂度是指函数中可独立执行的路径,因此函数中每出现一次if/else/while,switch/case/break等,圈复杂度就加1.圈复杂度越高,说明函数中可执行的路径越多,也就越复杂。超过一定值如(15或者10)以后就要考虑能否将函数重构了。此外一个函数的代码行数如果太长,不能一屏显示的话,不容易让人记住和理解,也需要对该函数进行提炼。

3.3 Eclipse的半自动重构

利用SourceMonitor找出需要重构或提炼的函数后,难道又要我手工重构吗,有没有重构的工具呢?全自动的目前还没见过,如果有同学见到,请留言。相比来说,半自动的重构工具还是比较多的,Eclipse中就有一个重构菜单,提供函数提炼,变量或方法重命名等不少基础的重构功能。

Eclipse的半自动的重构能减少人工重构的错误,降低开发人员所耗费的精力,这也是为什么一个我作为C/C++程序员越来越喜欢Eclipse的原因。

回到最开始的话题中,我觉得想骂娘的代码无非有两种,一种是难用,一种是难看。

代码难用,这个问题比较深奥,本文没有讨论。

代码难看,可以通过格式化使程序变得美观,通过SourceMonitor识别代码中的坏味道,利用Eclipse半自动重构等方式使程序变得已读。

我相信,通过这样处理后的代码至少看上去是不会再被骂了。

java实现读者写者问题(写着优先)

实验一实验报告 学号:20092128 姓名:徐卓远 实验序号:1 实验名称:用信号量来实现读者-写者问题 实验目的:理解进程同步与互斥的概念,掌握用信号量来实现进程的同步与互斥。 实验设计及实现: 为了实现读者和写者的读写过程,将每个读者和每个写者作为了一个单独的线程,所以设置了两个类,一个是读者类Reader,一个是写者类Writer.以读者类为例: 一个读者的动作过程为由睡眠->等待->开始读->结束读->睡眠的一个循环过程,而一个写者的动作过程也为此. 读者调用方法napping()进行等待,调用startRead()方法开始读,最后在调用endReading()方法结束读入,释放运行空间.写者同读者. 但是为了实现读者写者之间的写-写互斥,读-写互斥,读-读允许,需要另外一个类Database,类中分别用关于读者的方法和写者的方法来控制读写之间的这种关系. 首先要实现睡眠的方法napping(),读者和写者在睡眠过程都应该是一样的,只是他们睡眠的时间不同,所以只需写出一个方法: public static void napping() {

int sleepTime = (int) (NAP_TIME * Math.random()); try { Thread.sleep(sleepTime * 1000); } catch (Exception e) { e.printStackTrace(); } } 在方法中,控制线程休眠随机的时间,由于每个读者或写者都是一个线程,而每个读者或写者他们工作休眠的时间都不一定相同,他们请求工作的时间也不一定相同,所以取了随机时间其次设置了读者的两个方法,开始读和结束读,由于这只是个模拟读写问题,所以只需要知道结果就行,就不用显示出他是怎么读的. 在开始读中,当有写者在写时,读者需要等待wait(),在没有人在工作时,如果有写者和读者同时请求,那么就让写者先进,这是写者优先.所以这就归纳于一种情况, 当读者布尔变量dbReading为FALSE时,如果有需要工作的写者,那么读者就等待. 当读者请求读入后,计数有多少读者需要工作的变量readerCount +1,如果这是第一个进入工作的读者就需要将显示是否有读者在工作的读者布尔变量变为TRUE. public synchronized int startRead() { if (dbReading == false) {

读者写者问题课程设计说明书

-- 数学与计算机学院 课程设计说明书 课程名称: 操作系统原理-课程设计课程代码: 题目:读者写者问题 年级/专业/班: 学生姓名: 学号: 开始时间:2011 年12月05日完成时间:2011 年12月25 日课程设计成绩: 学习态度及平时成绩(30) 技术水平与实际 能力(20) 创新(5)说明书撰写质量(45) 总分 (100) 指导教师签名:年月日

目录 1 引言?错误!未定义书签。 1.1问题的提出?错误!未定义书签。 1.2任务于分析?错误!未定义书签。 2程序的主要功能?错误!未定义书签。 2.1测试文本录入功能.................................... 错误!未定义书签。 2.2读者优先判断功能.................................... 错误!未定义书签。2.3写者优先判断功能.................................. 错误!未定义书签。 3 程序运行平台........................................... 错误!未定义书签。 4 总体设计............................................... 错误!未定义书签。5模块分析 ............................................... 错误!未定义书签。 5.1测试文本录入模块.................................... 错误!未定义书签。 5.2读者优先判断模块.................................... 错误!未定义书签。 5.3写者优先判断模块.................................... 错误!未定义书签。6系统测试............................................. 错误!未定义书签。 7 结论................................................................. 8致谢.................................................. 错误!未定义书签。参考文献 (10)

实验二 读者写者问题实验报告..

实验二读者写者问题实验报告 一、实验目的 Windows2000/XP提供了互斥量(mutex)、信号量(semapore)、事件(event)等三种同步对象和相应的系统调用,用于线程的互斥与同步。通过对读者写者问题的调试,了解Windows2000/XP中的同步机制。 二、实验内容及实验步骤 利用Windows2000/XP信号量机制,实现读者写者问题。 在Windows 2000环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制(包括读者优先和写者优先): 写-写互斥,即不能有两个写者同时进行写操作。 读-写互斥,即不能同时有一个线程在读,而另一个线程在写。 读-读允许,即可以有一个或多个读者在读。 读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结果读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 三、实验结果及分析 图2.1 选择界面 第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建

后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子: 1 R 3 5 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5.1 3 测试结果如下: 图2.2 读者优先运行结果

操作系统课设: 实现读者写者(Reader-Writer Problem)问题

学 号: 课 程 设 计 2014——2015学年 第1学期 课程名称 操作系统 学 院 计算机科学与技术学院 专 业 软件工程 班 级 姓 名 指导教师

1《操作系统原理》课程设计指导书 课程编号: 课程名称:操作系统/Operating System 周数/学分:1周/1学分 先修课程:高级语言程序设计、汇编语言、数据结构、计算机组成原理 适用专业:计算机科学与技术、软件工程 开课学院、系或教研室:计算机科学与技术学院 一、课程设计的目的 通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。 二、课程设计的内容和要求 1.系统调用 学习在Linux中产生一个系统调用以及怎样通过往Linux内核中增加一个新函数从而在该内核空间中实现对用户空间的读写。这个函数的功能是返回当前的系统时间。 实验条件要求:每人一台Linux主机且有超级用户权限。 2.内核定时器 通过研究内核的时间管理算法学习内核源代码。然后应用这些知识并且使用“信号”建立一种用户空间机制来测量一个多线程程序的执行时间。 实验条件要求:每人一台Linux主机且有超级用户权限。 3.实现生产者消费者(Bounded – Buffer Problem)问题 通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。 实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。 4.实现读者写者(Reader-Writer Problem)问题 通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并

操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码

淮北师范大学 课程设计 采用读写平等策略的读者写者问题 学号: 姓名: 专业: 指导教师: 日期:

目录 第1部分课设简介 (3) 1.1 课程设计题目 (3) 1.2 课程设计目的.................. 错误!未定义书签。 1.3 课程设计内容 (3) 1.4 课程设计要求 (4) 1.5 时间安排 (4) 第2部分实验原理分析 (4) 2.1问题描述 (4) 2.2算法思想 (5) 2.3主要功能模块流程图 (5) 第3部分主要的功能模块 (6) 3.1数据结构 (6) 3.2测试用例及运行结果 (7) 第4部分源代码 (7) 第5部分总结及参考文献 (22) 5.1 总结 (22) 5.2 参考文献 (23)

第1部分课设简介 1.1 课程设计题目 采用读写平等策略的读者写者问题 1.2课程设计目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 1)进一步巩固和复习操作系统的基础知识。 2)培养学生结构化程序、模块化程序设计的方法和能力。 3)提高学生调试程序的技巧和软件设计的能力。 4)提高学生分析问题、解决问题以及综合利用C语言进行课程设计的能力。 1.3课程设计内容 用高级语言编写和调试一个采用“读写平等”策略的“读者-- 写者”问题的模拟程序。 1.4课程设计要求 1)读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。

2) 读者与写者均有两个以上,可在程序运行期间进行动态增加 读者与写者。 3)可读取样例数据(要求存放在外部文件中),进行读者/写者、 进入内存时间、读写时间的初始化。 4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看 阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。 5) 读写策略:读写互斥、写写互斥、读写平等(严格按照读 者与写者到达的顺序进入阅览室,有写着到达,则阻塞后续到 达的读者;有读者到达,则阻塞后续到达的写者)。 1.5时间安排 1)分析设计贮备阶段(1 天) 2)编程调试阶段(7 天) 3)写课程设计报告、考核(2 天) 第2部分实验原理分析2.1问题描述 有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程reader和一些只往数据区中写数据的进程writer 以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满

操作系统读者写者实验报告

《操作系统》上机实验报告 实验项目读者写者 学院(部)信息学院 专业计算机科学与技术班级 学生姓名 学号

读者写者问题 一.实验目的: 1.熟悉读者优先和写者优先的过程。 2.更好地理解进程同步的概念及其实现方法。 二.实验要求: 分别实现读者优先和写者优先。 “读-写”互斥,即不能同时有一个读者在读,同时去有一个写者在写; “写-写”互斥,即不能有两个写者同时进行写操作; “读-读”允许,即可以有两个以上的读者同时进行读操作。 三.实验内容: 读者优先: 如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount 记录当前的读者数目,用于确定是否释放写者线程,(当readcout=0 时,说明所有的读者都已经读完,释放一个写者线程),每个读者开始读之前都要修改readcount,为了互斥的实现对readcount 的修改,需要一个互斥对象Mutex来实现互斥。 另外,为了实现写-写互斥,需要一个临界区对象write,当写者发出写的请求时,必须先得到临界区对象的所有权。通过这种方法,可以实现读写互斥,当readcount=1 时,(即第一个读者的到来时,),读者线程也必须申请临界区对象的所有权. 当读者拥有临界区的所有权,写者都阻塞在临界区对象write上。当写者拥有临界区对象所有权时,第一个判断完readcount==1 后,其余的读者由于等待对readcount的判断,阻塞在Mutex上! 写者优先: 写者优先和读者优先有相同之处,不同的地方在:一旦有一个写者到来时,应该尽快让写者进行写,如果有一个写者在等待,则新到的读者操作不能读操作,为此添加一个整型变量writecount,记录写者的数目,当writecount=0时才可以释放读者进行读操作!为了实现对全局变量writecount的互斥访问,设置了一个互斥对象Mutex3。 为了实现写者优先,设置一个临界区对象read,当有写者在写或等待时,读者必须阻塞在临界区对象read上。 读者除了要一个全局变量readcount实现操作上的互斥外,还需要一个互斥对象对阻塞在read这一个过程实现互斥,这两个互斥对象分别为mutex1和mutex2。

操作系统课程设计-读者写者问题

操作系统课程设计报告

一、开题报告 (一)该项课程设计的意义; 1.更加深入的了解读者写者问题的算法; 2.加深对线程,进程的理解; 3.加深对“线程同步”概念的理解,理解并应用“信号量机制”; 4.熟悉计算机对处理机的管理,了解临界资源的访问方式; 5.了解C++中线程的实现方式,研读API。 (二)课程设计的任务 多进程/线程编程:读者-写者问题。 ●设置两类进程/线程,一类为读者,一类为写者; ●随机启动读者或写者; ●显示读者或写者执行状态; ●随着进程/线程的执行,更新显示; (三)相关原理及算法描述; 整体概况: 该程序从大体上来分只有两个模块,即“读者优先”和“写者优先”模块. 读者优先: 如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录读者数目,用于确定是否释放读者线程,readcount的初值为0.当线程开始调入时. 每个读者准备读. 等待互斥信号,保证对readcount 的访问,修改互斥.即readcount++. 而当读者线程进行读操作时,则读者数目减少(readcount--).当readcout=0 时,说明所 有的读者都已经读完,离开临界区唤醒写者(LeaveCriticalSection(&RP_Write);), 释 放互斥信号(ReleaseMutex(h_Mutex)). 还需要一个互斥对象mutex来实现对全局变量Read_count修改时的互斥. 另外,为了实现写-写互斥,需要增加一个临界区对象Write。当写者发出写请求时, 必须申请临界区对象的所有权。通过这种方法,可以实现读-写互斥,当 Read_count=1时(即第一个读者到来时),读者线程也必须申请临界区对象的所有 权 写者优先: 写者优先与读者不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当填加 一个整形变量write_count,用于记录正在等待的写者的数目,write_count的初值 为0.当线程开始调入时.只允许一个写者准备读. 等待互斥信号,保证对write_count 的访问,修改互斥.即write_count++.而当写者线程进行读操作时,则相应写者数目减 少(write_count--).当write_count=0 时,说明所有的读者都已经读完,离开临界区唤 醒读者,释放互斥信号. 为了实现写者优先,应当填加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上。

操作系统课程设计--读者-写者问题

操作系统课程设计报告 一、操作系统课程设计任务书 读者- 写者问题实现 1设计目的通过实现经典的读者写者问题,巩固对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。 2设计要求 在Windows 2000/XP 环境下,使用多线程和信号量机制实现经典的读者写者问题,每个线程代表一个读者或一个写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者- 写者问题。 读者-写者问题的读写操作限制: (1)写-写互斥,即不能有两个写者同时进行写操作 (2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写 (3)读-读允许,即可以有二个以上的读者同时读读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。 3测试数据文件格式 测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时

操作系统实验 读者写者问题

《计算机操作系统》实验报告 题目读者写者问题 学院(部)信息学院 专业计算机科学与技术 班级 学生姓名 学号 指导教师(签字)

一、问题描述 一个数据文件或者记录,可以被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会是数据文件混乱。但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象,因为这种访问将会引起混乱。所谓“读者——写着问题(Reader—Writer Problem)”是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题 二、解决问题 为实现Reader与Writer进程间在读或写是的互斥而设置了一个互斥的信号量Wmutex。另外,在设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer去写。因此,仅当Readercount=0时,表示尚无Reader进程在读时,Reader进程才需要进行Wait(wmutex)操作。若Wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader进程在执行了Readercount-1操作后其值为0时,才执行Signal(Wmutex)操作,以便让Writer进程写。又因为Readercount是一个可被多个Reader进程访问的临界资源,因此也应该为它设置一个互斥信号量rmutex。 三、代码实现 1、读者优先 #include #include using namespace std; CRITICAL_SECTION rmutex,wmutex; int wr; int readernum; DWORD WINAPI reader(LPVOID IpParamter){ cout<<"读者申请\n"; wr++; EnterCriticalSection(&rmutex); if(readernum==0) EnterCriticalSection(&wmutex); readernum++; cout<<"读者进入成功正在读取\n"; LeaveCriticalSection(&rmutex); Sleep(2000); EnterCriticalSection(&rmutex); readernum--; cout<<"读者退出\n"; wr--;

读者写者问题写者优先代码

读者写者问题-写者优先代码 #include<stdio.h> #include<stdlib.h> int rcount=0;//正在读的读者数量 int wcount=0;//写者队列中等待写操作的写者数量 int rid=0;//读进程号 int wid=0;//写进程号 int w=1;//读写互斥信号量 char temp[300] = {'\0'}; int sign; //标识temp空的信号量0表示temp空 void WFwakeup(); void RFwakeup(); struct rqueue{//读者等待队列 int readers[200]; int index; }rq; struct wqueue{//写者等待队列 int writers[200]; int index; }wq; void read(){ int i = 0; rid++; if(rcount == 0){//当前没有读进程在读可能有写进程在写可能CPU空闲if(w==1) {//如果CPU空闲,读者拿到CPU w--;// 相当于一个P操作 rcount++; if(temp[0] == '\0'){ sign = 0; rq.readers[rq.index++]=rid;//将读者进程加入等待队列 WFwakeup(); return; }//if printf("读者%d正在读\n",rid);

for(i = 0;i < 300;i++){//读取temp内容即写者写的内容 if(temp[i] == '\0'){ printf("\n"); return; }//if printf("%c",temp[i]); }//for }//if else{//写者线程正在执行 printf("有写者在写不能读!\n"); rq.readers[rq.index++]=rid;//将读者进程加入等待队列 }//else }//if else{//rcount !=1 则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读 printf("读者%d正在读\n",rid); for(i = 0;i < 300;i++){ if(temp[i] == '\0'){ printf("\n"); return; } printf("%c",temp[i]); }//for }//else } //***************************写进程写操作 void write(){ wid++; if(w == 0){ if(rcount != 0 ){//有读者进程在执行 printf("有读者在读不能写!\n"); wq.writers[wq.index++]=wid;//将写者进程加入等待队列 wcount++; return; } if(rcount == 0 ){//rcount == 0则当前无读者,但w = 0,所以有写者在写 printf("有写者在写不能写!\n"); wq.writers[wq.index++]=wid;//将写者进程加入等待队列 wcount++; return; } }

读者写者问题

一设计概述 所谓读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。 读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。 信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者问题则是这一机制的一个经典范例。 与记录型信号量解决读者—写者问题不同,信号量机制它增加了一个限制,即最多允许RN个读者同时读。为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait(L,1,1)操作,来控制读者的数目,每当有一个读者进入时,就要执行wait(L,1,1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN+1 个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。对利用信号量来解决读者—写者问题的描述如下: Var RN integer;L,mx:semaphore: =RN,1; Begin Parbegin Reader :begin Repeat Swait(L,1,1); Swait(mx,1,0); . Perform reader operation; Ssignal(L,1); Until false; End

Writer :begin Repeat Swait(mx ,1,1,l,RN,0); Perform writer operation; Ssignal(mx,1); Until false; End Parend End 其中,Swait(mx,1,0)语句起着开关作用,只要无Writer进程进入些,mx=1,reader进程就都可以进入读。但是要一旦有Writer进程进入写时,其MX=0,则任何reader进程就都无法进入读。Swait(mx ,1,1,l,RN,0)语句表示仅当既无Write 进程在写(mx=1),又无reader进程在读(L=RN)时,writer进程才能进入临界区写。 本设计方案就是通过利用记录型信号量对读者写者问题的解决过程进行模拟演示,形象地阐述记录型信号量机制的工作原理。 二设计目的与内容 一实验目的 l. 用信号量来实现读者写者问题。 2. 理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。二、二实验内容 读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件; (2)一次只有一个写进程可以往文件中写; (3)如果一个写进程正在进行操作,禁止任何读进程度文件。

信息安全恶意代码防范方案

恶意代码防范方案 目录 1 前言 (1) 2 恶意代码种类 (2) 3 恶意代码防范方案举例 (2) 3.1 IE主页被篡改 (2) 3.2 IE默认页被篡改 (5) 3.3格式化硬盘 (6) 3.4 注册表和IE设置被篡改 (6) 4恶意代码三级防范机制 (7) 4.1 恶意代码初级安全设置与防范 (7) 4.2 恶意代码中级安全设置与防范 (8) 4.3 恶意代码高级安全设置与防范 (9) 5小结 (10) 1 前言 目前,恶意代码问题成为信息安全需要解决的,迫在眉睫的、刻不容缓的安全问题。在Internet安全事件中,恶意代码造成的经济损失占有最大的比例。恶意代码主要包括计算机病毒(Virus)、蠕虫(Worm)、木马程序(Trojan Horse)、后门程序(Backdoor)、逻辑炸弹(Logic Bomb)等等。与此同时,恶意代码成为信息战、网络战的重要手段。日益严重的恶意代码问题,不仅使企业及用户蒙受

了巨大经济损失,而且使国家的安全面临着严重威胁。 2 恶意代码种类 常见的恶意代码有计算机病毒网络蠕虫逻辑炸弹特洛伊木马漏洞利用下载器/流氓软件玩笑程序流氓软件网页脚本等。 网页恶意代码的攻击形式是基于网页的,如果你打开了带有恶意代码的网页,你所执行的操作就不单是浏览网页了,甚至还有可能伴随有病毒的原体软件下载,或木马下载,以达到修改注册表等目的。一般形式有:修改默认首页、修改默认的微软主页、将主页的设置屏蔽,使用户对主页的设置无效、修改默认IE搜索引擎、对IE标题栏添加非法信息、在鼠标右键快捷菜单中添加非法网站广告链接、使鼠标右键快捷菜单的功能禁止失常、在IE收藏夹中强行添加非法网站的地址链接、在IE工具栏中强行添加按钮、锁定地址下拉菜单及其添加文字信、用IE"查看"菜单下的"源文件"选项。 3 恶意代码防范方案举例 为此我们需要针对网页恶意代码攻击的具体形式制定防范方案。 3.1 IE主页被篡改 篡改IE主页:打开IE浏览器打开的并不是以前设置的主页。这是由于注册表中的项目Strat Page"的键值被修改。 解决办法:“开始”→“运行(cmd)”→“DOS界面(输入rgedit)”

北理工操作系统实验二读者写者问题

本科实验报告 实验名称:操作系统原理实验(读者写者问题) 课程名称:操作系统原理实验时间:2015.10.30 任课教师:王耀威实验地点:10#102 实验教师:苏京霞 实验类型: 原理验证□综合设计□自主创新 学生姓名:孙嘉明 学号/班级:1120121474/05611202 组号:学院:信息与电子学院同组搭档:专业:信息对抗技术成绩:

实验二:读者写者问题 一、实验目的 1.通过编写和调试程序以加深对进程、线程管理方案的理解; 2.熟悉Windows多线程程序设计方法; 二、实验要求 在Windows环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先问题。 读者-写者问题的读写操作限制(包括读者优先和写者优先) 1)写-写互斥:不能有两个写者同时进行写操作 2)读-写互斥:不能同时有一个线程在读,而另一个线程在写。 3)读-读允许:可以有一个或多个读者在读。 读者优先的附加限制:如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 测试数据文件包括 n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,每个字段间用空格分隔。第1个字段为正整数,表示线程的序号。第2个字段表示线程的角色,R表示读者,W表示写者。第3个字段为一个正数,表示读写开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第4个字段为一个正数,表示读写操作的延迟时间。当线程读写申请成功后,开始对共享资源进行读写操作,该操作持续相应时间后结束,释放该资源。 下面是一个测试数据文件的例子(在记事本手工录入数据): 1 R 3 5 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5.1 3

操作系统课程设计读者写者问题

计算机与信息学院 操作系统课程设计报告一、开题报告 (一)该项课程设计的意义; 1.更加深入的了解读者写者问题的算法; 2.加深对线程,进程的理解; 3.加深对“线程同步”概念的理解,理解并应用“信号量机制”; 4.熟悉计算机对处理机的管理,了解临界资源的访问方式; 5.了解C++中线程的实现方式,研读API。 (二)课程设计的任务 多进程/线程编程:读者-写者问题。 ●设置两类进程/线程,一类为读者,一类为写者; ●随机启动读者或写者; ●显示读者或写者执行状态; ●随着进程/线程的执行,更新显示; (三)相关原理及算法描述; 整体概况: 该程序从大体上来分只有两个模块,即“读者优先”和“写者优先”模块. 读者优先: 如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录读者数目,用于确定是否释放读者线程,readcount的初值为0.当线程开始调入时.每个读者准备读. 等待互斥信号,保证对readcount 的访问,修改互斥.即readcount++.而当读者线程进行读操作时,则读者数目减少(readcount--).当readcout=0 时,说明所有的读者都已经读完,离开临界区唤醒写者(LeaveCriticalSection(&RP_Write);), 释放互斥信号(ReleaseMutex(h_Mutex)). 还需要一个互斥对象mutex来实现对全局变量Read_count修改时的互斥. 另外,为了实现写-写互斥,需要增加一个临界区对象Write。当写者发出写请求时,必须申请临界区对象的所有权。 通过这种方法,可以实现读-写互斥,当Read_count=1时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权 写者优先: 写者优先与读者不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当填加一个整形变量write_count,用于记录正在等待的写者的数目,write_count的初值为0.当线程开始调入时.只允许一个写者准备读. 等待互斥信号,保证对write_count 的访问,修改互斥.即write_count++.而当写者线程进行读操作时,则相应写者数目减少(write_count--).当write_count=0 时,说明所有的读者都已经读完,离开临界区唤醒读者,释放互斥信号. 为了实现写者优先,应当填加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上。

读者写者问题

操作系统实验报告 实验:读者-写者问题 姓名:张金志 学号:U201313788 班级:通信1306班

一、实验目的: 1、熟练使用VC++6.0编译环境,调试并正确运行程序。 2、理解阅读者和写入者中出现的问题,进而掌握信号量的使用。 3、理解源程序中管理阅读者和写入者权限的算法,及相关窗口操作。 4、阅读演示程序源代码,熟悉阅读者写入者问题流程; 5、写出ReaderThread()和WriterThread()函数伪码; 二、实验原理: 1、问题描述: 有一个公用的数据集,有很多人需要访问,其中一些需要阅读其中的信息,一些需要修改其中的消息。阅读者可以同时访问数据集,而写入者只能互斥的访问数据集,不能与任何的进程一起访问数据区。 2、源程序算法实现调度说明: 要求(书上): (1)允许多个读者同时对文件进行读操作 (2)只允许一个写者对文件进行写操作 (3)任何写者完成操作前,不允许其他读者或者写者进行操作 (4)写者在进行写操作前,要让所有的读者或者写者全部退出 3、在本程序中用于表现的图形界面说明: 在程序编译运行后会出现中间一个大的圆圈表示公用的资源,上面一排五个矩形表示5个读者,下面的五个矩形表示五个写入者。每个读者和写入者都有3种状态,休息,等待和操作(读入或者写入)分别用黑颜色,绿颜色,红颜色表示休息,等待和操作。一旦操作者获得资源,可以进行读或者写,我们就划一条从操作者中心到资源中心的线,表示开始操作。

三、实验伪码 ReadThread() { i=0 While(true) { Rreadstate[i]=waiting; P(mutex); Readercount++; i++; If(readcount==1) P(write); V(mutex); Resourcestate[i]=read; Resourcestate[i]=reading; P(mutex); Readcount--; If(readcount==0) v(writeblock); V(mutex) Readerstate[i]=resting; Readersource[i]=unused; } } WriteThread(){ Writerstate[i]=resting; While(1) { writerstate[i]=waiting; P(write); Writerstate[i]=writing; Resourcestate[i]=wirte; v(writeblock);

读者写者问题写者优先参考答案

【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。给出读者、写者问题的另一个解决方案:即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。 让我们先回顾读者写者问题[1]: 一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。在读者、写者问题中,任何时刻要求“写者”最多只允许有一个执行,而“读者”则允许有多个同时执行。因为多个“读者”的行为互不干扰,他们只是读数据,而不会改变数据对象的内容,而“写者”则不同,他们要改变数据对象的内容,如果他们同时操作,则数据对象的内容将会变得不可知。所以对共享资源的读写操作的限制条件是: 允许任意多的读进程同时读; 一次只允许一个写进程进行写操作; 如果有一个写进程正在进行写操作,禁止任何读进程进行读操作。 为了解决该问题,我们只需解决“写者与写者”和“写者与第一个读者”的互斥问题即 可,为此我们引入一个互斥信号量Wmutex,为了记录谁是第一个读者,我们用一个共享整 型变量Rcount 作一个计数器。而在解决问题的过程中,由于我们使用了共享变量Rcount,

该变量又是一个临界资源,对于它的访问仍需要互斥进行,所以需要一个互斥信号量Rmutex, 算法如下:

void writer() /*写者进程*/ { while (true) { P(Wmutex); ??; write; /* 执行写操作 */ ??; P(Wmutex); } } 现在回到【写者优先】优先问题 【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。给出读者、写者问题的另一个解决方案:即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。 【解题思路】在上面的读者写者问题基础上,做以下修改: 增加授权标志authFlag,当写者到来,发现有读者在读,则取消授权,然后等待缓冲区; 增加“等待授权计数器waitAuthCount”,写者离开时,如果 waitAuthCount大于0,则迭代唤醒等待授权的读者; 读者到来,首先看授权标志,如果有授权标志,则继续,否则等待授权,

读者写者问题,操作系统课程设计

某某大学 课程设计报告课程名称:操作系统课程设计 设计题目:读者写者问题 系别:计算机系 专业:计算机科学与技术 组别:第四组 学生姓名: 某某某学号: 起止日期: 指导教师:

目录 1、需求分析 (1) 1.1 课程设计题目 (1) 1.2课程任务及要求 (1) 1.3课程设计思想 (1) 1.4软硬件运行环境及开发工具 (2) 2、概要设计 (2) 2.1程序流程图 (2) 2.2所用原理 (3) 2.2.1 并发原理 (3) 2.2.2 互斥操作原理 (4) 2.2.3 面向对象编程编程原理 (4) 2.2.4 锁机制原理 (5) 2.2.5 线程的原理 (6) 2.2.6 读者写者问题的一般应用 (6) 3、详细设计 (6) 4、调试与操作说明 (11) 5、课程设计总结与体会 (12) 6、致谢 (13) 7、参考文献 (13)

1、需求分析 1.1课程设计题目 课程设计题目:读者写者问题 1.2课程任务及要求 编写程序实现读者写者算法(读_写互斥,读_读允许,写写互斥) 给出解决方案(包括说明设计实现的原理,采用的数据结构等) 画出程序的基本结构框图和流程图 分析说明每一部分程序的的设计思路 实现源代码 按期提交完整的程序代码和可执行程序 根据要求完成课程设计报告 总结 1.3课程设计思想 读者-写者问题是一个经典的并发程序设计问题。有两组并发进程:读者和写者,共享文件F,要求: (1)允许多个读者同时对文件执行读操作; (2)只允许一个写者对文件执行写操作; (3)任何写者在完成写操作之前不允许其他读者或写者工作; (4)写者在执行写操作前,应让已有的写者和读者全部退出。 单纯使用信号量不能解决此问题,必须引入计数器readcount对读进程记数。 为了有效的解决读者写者问题,需要引进读者-写者锁,允许多名读者同时以只读的方式存取有锁保护的对象;或一位写者以写方式存取有锁保护的对象。当一名或多名读者上锁后,此时形成读锁,写者将不能访问有锁保护的对象;当锁被请求者用于写操作时,形成写锁,其他进程的读写操作必须等待。

读者写者问题-操作系统实验报告

实验内容 1、定义一个数据缓存buffer 及用于实现同步互斥的信号量。 2、定义一个读者函数: 当有写者在占用buffer 时,读者应该等待,直到写者不再使用该buffer。 当有其他读者在占用buffer 时,读者可对buffer 进行读取操作。 当buffer 中有数据时,则从其中读取一个数据,并显示然后退出。 当buffer 中没有数据时,应等待,直到buffer 中有数据可读。 3、定义一个写者函数 当有读者在占用buffer 时,写者应该等待,直到所有的读者都退出为止。 当有其他写者占用buffer 时,该写者应该等待,直到占用buffer 的写者退出为止。 当buffer 有空闲时,写者应该在buffer 中写入一个数据并退出。 当buffer 满时,写者应该等待,直到buffer 有空闲为止。 4、定义主函数,在其中可以任意创建读者与写者。 可根据用户输入创建读者或写者进程(线程)。 5、用户界面 写出的内容: 实验当堂所要完成事情列表:

现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列) 2. 根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够读出并显示出 来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读 3. 根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式 源代码: #include #include int rcount=0;// int wcount=0;// int read_id=0;// int write_id=0;// 正在读的读者数量写者队列中等待写操作的写者数量读进程号 写进程号 int w=1;// 读写互斥信号量char temp[300] = {'\0'}; int choice; // 用户选择读者优先OR写者优先 int sign; // 标识temp 空的信号量0 表示temp 空 void WFwakeup(); void RFwakeup(); struct rqueue{// 读者等待队列 int readers[200]; int index; }rq; struct wqueue{// 写者等待队列int writers[200]; int index; }wq; /*void first(){ // 初始化int i; rq.index = 0; wq.index = 0; for(i = 0;i<20;i++){ rq.readers[i] = 0; wq.writers[i] = 0; } }*/ //******************************************* 读进程读操作void read(){ int i = 0; read_id++; if(rcount == 0){// 当前没有读进程在读可能有写进程在写可能CPU空闲 if(w==1) {// 如果CPU空闲,读者拿到CPU w--;// 相当于一个P 操作

相关主题