1.目的:调试、修改、运行模拟程序,通过形象化的状态显示,使学生理解进程的概念,了解同步和通信的过程,掌握进程通信和同步的机制,特别是利用缓冲区进行同步和通信的过程。
通过补充新功能,使学生能灵活运用相关知识,培养创新能力。
2.内容及要求:1)调试、运行模拟程序。
2)发现并修改程序中不完善的地方。
3)修改程序,使用随机数控制创建生产者和消费者的过程。
4)在原来程序的基础上,加入缓冲区的写互斥控制功能,模拟多个进程存取一个公共缓冲区,当有进程正在写缓冲区时,其他要访问该缓冲区的进程必须等待,当有进程正在读取缓冲区时,其他要求读取的进程可以访问,而要求写的进程应该等待。
5)完成1)、2)、3)功能的,得基本分,完成4)功能的加2分,有其它功能改进的再加2分3.程序说明:  本程序是模拟两个进程,生产者(producer)和消费者(Consumer)工作。
生产者每次产生一个数据,送入缓冲区中。
消费者每次从缓冲区中取走一个数据。
缓冲区可以容纳8个数据。
因为缓冲区是有限的,因而当其满了时生产者进程应该等待,而空时,消费者进程应该等待;
当生产者向缓冲区放入了一个数据,应唤醒正在等待的消费者进程,同样,当消费者取走一个数据后,应唤醒正在等待的生产者进程。
就是生产者和消费者之间的同步。
  每次写入和读出数据时,都将读和写指针加一。
当读写指针同样时,又一起退回起点。
当写指针指向最后时,生产者就等待。
当读指针为零时,再次要读取的消费者也应该等待。
为简单起见,每次产生的数据为0-99的整数,从0开始,顺序递增。
两个进程的调度是通过运行者使用键盘来实现的。
4.程序使用的数据结构进程控制块:包括进程名,进程状态和执行次数。
缓冲区:一个整数数组。
缓冲区说明块:包括类型,读指针,写指针,读等待指针和写等待指针。
5.程序使用说明  启动程序后,如果使用'p'键则运行一次生产者进程,使用'c'键则运行一次消费者进程。
通过屏幕可以观察到两个进程的状态和缓冲区变化的情况。
2019/3/25 13:35:58 306KB 操作系统 上机 实验报告 进程同步
1
P89LPC932硬件I2C软件包,此软件包由C语言编写,是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并使用看门狗,以防等待总线而形成死机。
2020/1/16 22:32:01 3KB P89LPC932 I2C C语言
1
模仿数据链路层的gobackn协议/*该协议是搭载ack的回退n步协议*/#include#include"protocol.h"#definemax_seq7#defineflag126#defineESC100#definewait_time2700 //发送计时器等待的时间#defineack_wait_time280staticintphl_ready=0;unsignedcharbuf[max_seq+1][270];unsignedcharack[8];//发送空的ack帧unsignedcharin_buf[600],last_buf[520];//接收时的缓冲区;去掉冗余之后的缓冲区,为防备因误码两帧合并为一帧而定义了很大一个数组intnbuffered=0;//发送的帧数intbuf_size[max_seq+1];//记下以发送各帧的帧长intnext_frame_to_send=0;intframe_in_phl=0;//用于成帧intframe_expected=0;intack_expected=0;intbetween(inta,intb,intc){ if(((a<=b)&&(b<c))||((c<a)&&(a<=b))||((b<c)&&(c<a))) return1; elsereturn0;}//判断帧尾,防止出现误判escescflag为数据的情况intend_flag(intin_len){ intcount=0; inti; if(in_len=0;i--)//记录flag前的esc数目 count++; returncount%2;//若flag前的esc为偶数,则为帧尾}//成帧函数--数据帧voidsend_frame(char*my_buf,intlen){ intn; buf[frame_in_phl][0]=(frame_expected+max_seq)%(max_seq+1); //ack buf[frame_in_phl][1]=frame_in_phl; //发送帧的帧号 for(n=0;n<len;n++) buf[frame_in_phl][n+2]=my_buf[n]; //将处理过的新帧赋值到缓冲区中 len=len+2; *(unsignedint*)(buf[frame_in_phl]+len)=crc32(buf[frame_in_phl],len); //在原始帧的基础上加检验和 buf_size[frame_in_phl]=len+4; //记录当前帧的长度,包括3个帧头,4个检验和 nbuffered=nbuffered+1; //缓冲区占用数加一 frame_in_phl=(frame_in_phl+1)%(max_seq+1);}//成帧函数--ack帧voidsend_ack() //ack帧的处理{ ack[0]=(frame_expected+max_seq)%(max_seq+1); ack[1]=max_seq+10; //ack帧的序号位,使ack[1]==frame_expected恒不成立 *(unsignedint*)(ack+2)=crc32(ack,2); //在原始帧的基础上加检验和}//主函数intmain(intargc,char**argv){intevent,arg,n,m,i,j,len=0,in_len=0; unsignedcharmy_buf[260]; intphl_wait=0;//在物理层中还没有被发送的帧protocol_init(argc,argv);enable_network_layer();for(;;){event=wait_for_event(&arg);switch(event){caseNETWORK_LAYER_READY:
2019/7/26 21:18:43 425KB go back n gobackn
1
Netty同步等待数据前往实例代码
2017/8/6 14:11:38 51KB netty 同步
1
DirectX修复工具(DirectXRepair)是一款系统级工具软件,简便易用。
本程序为绿色版,无需安装,可直接运行。
本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。
程序主要针对0xc000007b问题设计,可以完美修复该问题。
本程序中包含了最新版的DirectXredist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。
本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。
本程序适用于多个操作系统,如WindowsXP(需先安装.NET2.0,详情请参阅“致WindowsXP用户.txt”文件)、WindowsVista、Windows7、Windows8、Windows8.1、Windows8.1Update、Windows10,同时兼容32位操作系统和64位操作系统。
本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。
本程序的V3.8版分为标准版、增强版以及在线修复版。
所有版本都支持修复DirectX的功能,而增强版则额外支持修复c++的功能。
在线修复版功能与标准版相同,但其所需的数据包需要在修复时自动下载。
各个版本之间,主程序完全相同,只是其配套使用的数据包不同。
因此,标准版和在线修复版可以通过补全扩展包的方式成为增强版。
本程序自V3.5版起,自带扩展功能。
只要在主界面的“工具”菜单下打开“选项”对话框,找到“扩展”标签,点击其中的“开始扩展”按钮即可。
扩展过程需要Internet连接,扩展成功后新的数据包可自动生效。
扩展用时根据网络速度不同而不同,最快仅需数秒,最慢需要数分钟,烦请耐心等待。
本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。
新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;
但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。
程序有自动更新c++功能。
由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。
自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。
修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。
除常规修复外,新版程序还支持C++强力修复功能。
当常规修复无效时,可以到本程序的选项界面内开启强力修复功能,可大幅提高修复成功率。
请注意,此功能为试验性功能,请仅在常规修复无效时再使用。
程序有两种窗口样式。
正常模式即默认样式,适合绝大多数用户使用。
另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。
该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。
开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。
新版程序支持命令行运行模式。
在命令行中调用本程序,可以在路径后直接添加命令进行相应的设置。
常见的命令有7类,分别是设置语言的命令、设置窗口模式的命令,设置安全级别的命令、开启强力修复的命令、设置c++修复模式的命令、控制DirectDraw的命令、显示版权信息的命令。
具体命令名称可以通过“/help”或“/?”进行查询。
程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。
同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。
该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。
本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。
程序的“选项”对话框中包含了6项高级功能。
点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。
该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。
点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。
2020/2/2 15:40:18 30.7MB zhangyue DirectX 修复 工具
1
实验一Linux系统的安装及用户界面的使用一.实验目的1.了解Linux系统的安装、熟悉系统的启动过程和使用环境。
2.掌握Linux环境下vi编辑器的使用方法。
3.掌握Linux系统中编辑、编译、调试、运行一个C语言程序的全过程。
二.实验内容1、实验要求1.在VMWare虚拟机环境或真实物理机器上,安装一个Linux操作系统。
2.体验Linux操作系统中XWindows系统的使用。
3.尝试Linux系统键盘命令的使用,并熟练掌握常用的基本命令。
4.掌握命令行方式下vi编辑器的使用。
5.编写一段C程序,使用系统调用fork()创建两个子进程。
各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。
多次运行观察显示结果,并分析产生这种执行效果的原因。
实验二Linux进程控制一.实验目的1.掌握进程的概念,明确进程和程序的区别。
2.认识和了解并发执行的实质。
二.实验内容1、实验要求1.编写一段程序,使用系统调用fork()创建两个子进程。
各进程显示不同的信息,如父进程显示字符“a”,子进程分别显示字符“b”和“c”。
多次运行观察显示结果,并分析产生这种执行效果的原因。
2.修改上面编写的程序,将每个进程的输出由单个字符改为循环输出一句话,如父进程显示:“parent:”加上进程ID,子进程分别显示:“Child1:”(或“Child2:”)加上自己的进程ID。
再观察程序执行时屏幕上出现的现象,并分析原因。
3.一个父进程创建一个子进程,子进程通过exec系统调用执行另一个文件。
各自的代码中显示不同的信息,观察其运行结果,分析两个进程并发执行的效果。
4.编写程序创建如图所示的进程树,在每个进程中显示当前进程ID和父进程ID。
实验三Linux进程间通信一.实验目的(1)分析进程争用临界资源的现象,学习处理进程互斥的方法;
(2)学习如何利用进程的“软中断”、管道机制进行进程间的通信,并加深对上述通信机制的理解;
(3)了解系统调用pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程,利用共享存储区机制进行进程间通信。
二、实验内容1、实验要求(1)进程的控制修改已编制的程序,将每个进程输出一个字符修改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析出现问题的原因,进一步理解各个进程争夺临界资源的情况。
如果在程序中使用系统调用locking()来给每一个进程加锁,可以实现进程之间的互斥,试观察并分析出现的现象。
(2)进程的软中断通讯编制一段程序,实现进程的软中断通讯:使用系统调用fork()创建两个子进程;
再使用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del键);
在捕捉到中断信号后,父进程用系统调用kill()向两个子进程发信号;
子进程捕捉到信号后分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父进程等待两个子进程都终止以后,输出如下信息后终止:Parentprocessinkilled!(3)进程的管道通讯编制一段程序,实现进程的管道通讯:使用系统调用pipe()建立一条管道线;
两个子进程分别循环向这条管道写一句话:Child1issendingamessage!Child2issendingamessage!而父进程则循环从管道中读出信息,显示在屏幕上。
实验报告内含源代码
2019/6/17 5:27:26 267KB ubuntu
1
多个C#多线程开发实例usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceExample20{classProgram{classClass1:IDisposable{//析构函数,编译后变成protectedvoidFinalize(),GC会在回收对象前会调用调用该方法~Class1(){Dispose(false);}//通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率voidIDisposable.Dispose(){Dispose(true);}//将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力protectedvirtualvoidReleaseUnmanageResources(){//Dosomething...}//私有函数用以释放非托管资源privatevoidDispose(booldisposing){ReleaseUnmanageResources();//为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法//为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦if(disposing){GC.SuppressFinalize(this);}}}staticvoidMain(string[]args){//tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧Class1tmpObj1=newClass1();//tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些//个人认为是因为要逐个对象的查看其元数据,以确认能否实现了Dispose方法吧//当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率Class1tmpObj2=newClass1();((IDisposable)tmpObj2).Dispose();}}}
2022/10/20 4:05:14 301KB C# 多线程
1
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。
目录如下:第一章SV环境构建常识 1 1.1数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态静态变量 39 1.3设计例化和连接 45第二章验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 功能验证 410第三章SV组件实现 99 3.1接口 100 什么是interface 101 接口的优势 108 3.2采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4调试方法 150第四章验证的计划 166 4.1计划概述 166 4.2计划的内容 173 4.3计划的实现 185 4.4计划的进程评估 194第五章验证的管理 277 6.1验证的周期检查 277 6.2管理三要素 291 6.3验证的收敛 303 6.4问题追踪 314 6.5团队建设 321 6.6验证的专业化 330第六章验证平台的结构 48 2.1测试平台 49 2.2硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3激励发生器 67 channelinitiator 72 registerinitiator 73 2.4监测器 74 2.5比较器 81 2.6验证结构 95第七章激励发生封装:类 209 5.1概述 209 5.2类的成员 233 5.3类的继承 245 三种类型权限protected/local/public 247 thissuper 253 成员覆盖 257 5.4句柄的使用 263 5.5包的使用 269第八章激励发生的随机化 340 7.1随机约束和分布 340 权重分布 353 条件约束 355 7.2约束块控制 358 7.3随机函数 366 7.4数组约束 373 7.5随机控制 388第九章线程与通信 432 9.1线程的使用 432 9.2线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3线程的通信 458第十章进程评估:覆盖率 495 10.1覆盖率类型 495 10.2功能覆盖策略 510 10.3覆盖组 516 10.4数据采样 524 10.5覆盖选项 544 10.6数据分析 550第十一章SV语言核心进阶 552 11.1类型转换 552 11.2虚方法 564 11.3对象拷贝 575 11.4回调函数 584 11.5参数化的类 590第十二章UVM简介 392 8.2UVM简介 414 8.3UVM组件 420 8.4UVM环境 425
2022/10/19 15:18:43 47.25MB systemverilog
1
死锁检测算法:当任一进程Pj申请一个已被其他进程占用的资源ri时,进行死锁检测。
检测算法通过反复查找进程等待表和资源分配表,来确定进程Pj对资源ri的请求能否导致形成环路,若是,便确定出现死锁。
2020/10/7 19:51:09 37KB 死锁检测
1
V1.0.0.2增加分屏控制。
各个参数可自由设置软件没有任何限制,无毒无害。
手机打开开发者模式连接电脑,打开就可以刷抖音快手等观看视频任务。
物理模仿,随机位置,随机等待时间,避免被封号
2016/4/10 8:25:09 3.47MB 开发工具
1
共 401 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡