计算机操作系统试验上海大学
- 格式:docx
- 大小:4.48 MB
- 文档页数:41
上海大学计算机网络实验报告一、实验背景。
在上海大学学计算机网络这门课呀,实验那可是相当重要的一部分呢。
计算机网络就像是一个超级复杂又超级有趣的大迷宫,实验就是我们探索这个迷宫的小冒险。
这门课讲的都是网络怎么连接、数据怎么传输之类超级神奇的东西,所以实验就是让我们把那些听起来有点玄乎的理论变成实际能看到、摸到的操作。
二、实验目的。
咱做这个计算机网络实验呢,主要就是想搞清楚网络的那些原理到底是咋在实际里运作的。
比如说网络拓扑结构,是像星星一样散开的星型结构,还是一环套一环的环形结构,或者是其他奇奇怪怪的形状,通过实验就能很直观地看到不同结构下网络的特点。
还有网络协议,什么TCP/IP协议呀,就像网络世界里的交通规则,实验能让我们知道这个规则是怎么指挥数据在路上跑的。
再就是网络设备的配置,像路由器和交换机这些,就跟交通枢纽一样重要,学会配置它们就像学会怎么管理交通枢纽,让网络这个大城市里的数据车都能跑得顺畅。
三、实验设备和环境。
做实验嘛,当然得有工具啦。
在我们上海大学的实验室里,有一堆超酷的设备。
计算机那肯定是标配啦,而且都是装好了各种网络相关软件的。
还有交换机和路由器,这些小家伙看起来不起眼,但是在网络里可是起着超级大的作用呢。
环境的话,实验室里的网络设置得很有讲究,既有内部的局域网,模拟小范围的网络通信,也能连接到外部网络,这样就能看到网络数据在不同环境下的传输情况啦。
四、实验过程。
1. 网络拓扑结构搭建。
最开始就是搭网络拓扑结构,这就像搭积木一样,不过比搭积木难多了。
我们要根据实验要求,用网线把计算机、交换机和路由器连接起来。
有时候线多得像一团乱麻,但是只要按照规划来,慢慢就能理清楚。
比如说搭一个简单的星型拓扑结构,就把每台计算机的网线都插到交换机上,就像星星的光线都汇聚到中心一样。
这个过程中,要是有一根线插错了,那整个网络可能就不通了,所以得特别小心。
2. 网络设备配置。
搭好结构之后,就要配置网络设备了。
第一部分《操作系统(一)》课程实验实验一Linux操作系统基本命令一.实验目的1. 了解Linux运行环境,熟悉交互式分时系统、多用户环境的的运行机制。
2. 练习Linux系统命令接口的使用,学会Linux基本命令、后台命令、管道命令等命令的操作要点。
二.实验环境复习操作系统中相关的用户接口概念。
查阅Linux中Shell的资料,它既是一个命令解释程序,又是一个程序设计语言。
熟悉本《实验指导》第二部分,从中你可以学会Shell的一般命令。
三.实验内容通过终端或虚拟终端,在基于字符的交互界面中进行Shell的基本命令的操作。
四.操作过程查看信息命令文件操作命令文件链接的意思——在文件之间创建链接。
作用——给系统中u、已有的某个文件指定另外一个可用于访问它的名称。
对于新的文件名,我们可以为其指定不同的访问权限,以控制对信息的共享和安全性问题。
目录操作思考:Linux文件类型有哪几种?文件的存取控制模式如何描述?文件类型有普通文件(~)、目录文件(d)、块设备特别文件(b)、字符设备特别文件(c)、命名管道文件(p)等。
“存取控制模式”指对不同用户分配不同的操作权。
Linux文件系统将用户分为3类,即文件主、同组人、其他人。
每种人可以执行3种操作,r,w,x。
修改文件属性不能,文件已经不属于本个用户。
进程管理命令思考:系统如何管理系统中的多个进程?进程的家族关系是怎样体现的?有什么用?在linux系统上运行任何东西,每个用户的工作、每个系统监控程序等等都是已进程形式运行的。
因此进程管理师linux系统管理非常重要的一个方面。
交互式进程:一个由shell启动控制的进程,可在前台或后台运行;批处理进程:与终端无关,安排在指定时刻完成一系列进程;守护进程:在引导系统时动,以执行即时的操作系统任务。
当用户管理进程时,必须用到PID号。
实验二用户界面与Shell 命令一实验要求(1)(2)(3)(4)(1)掌握图形化用户界面和字符界面下使用Shell 命令的方法。
上海大学计算机组成原理实验报告11 上海大学_计算机组成原理实验报告8 2011级上海大学计算机学院《计算机组成原理二实验》报告8 姓名:学号:教师:xxx 时间:xxx 地点:xxx机位:xxx 实验名称:程序转移机制(综合实验)一、实验目的:1. 2. 3. 4.学习实现程序转移的硬件机制;掌握堆栈寄存器的使用;深入理解PC寄存器自动加1和打入初值功能对计算机程序的深远影响;掌握代码的分段连续存放技术和实现二、实验原理:程序转移:分支和循环总是可以相互替代,所以也常说程序段内的执行流程有顺序和转移两种,而程序段之间的调用也只是把执行流程转移到了另外一个程序段上。
所以,任何复杂的程序流程,在硬件实现机制上只有两种情况:顺序执行和转移。
硬件实现这两种情况的技术很简单:PC寄存器的自动加1功能实现程序顺序执行,PC寄存器的打入初值功能实现程序转移。
实验箱系统的程序转移硬件机制:当LDCP有效(0)时,PC被打入新值(赋初值),实现程序的转移。
这一刻DBUS上的值就是转移的目标地址(被打入PC),这个地址同转移指令所在地址的关系决定了转移类型。
子程序调用和保护断点:子程序的调用和返回是两次转移,特殊点在于:返回时转移的目标一定是调用时转移的出发点。
为实现这个特点,在调用转移时必须把出发地址(断点)保存起来。
这个“保存”还必须有两个要求:1.不被一般用户所知或改变。
2.返回转移时能方便地找到它。
第一个要求决定了它不能被保存在数据存储区或程序存储区,第二个要求决定了返回指令的目标地址获得方法与其它转移指令完全不同,返回指令的目标地址一定从这个特殊的“保存区”得到,指令本身不需要再带目标地址,而其他转移指令必须自带目标地址。
再考虑到子程序调用的“可嵌套性”,这个“保护区”里的数据应该有“先入后出”特点,这与“货栈”中堆放的货物相似,故称其为“堆栈”。
ST寄存器结构和子程序调用与返回控制信号:实验箱子程序调用和返回的结构由PC电路和ST电路组成。
SHANGHAI UNIVERSITY计算机操作系统实验报告(实验四、五、六)学院计算机工程与科学学院专业计算机科学与技术学号06122565姓名金玉倩教师吴绍春日期2010-2《计算机操作系统》实验报告实验四题目:Linux文件系统实验姓名:金玉倩学号:06122565 实验日期:2009.1实验目的:1.掌握操作系统中文件分类的概念。
2.了解Linux文件系统管理文件的基本方式和特点。
3.学会使用Linux文件系统的命令界面和程序界面的基本要领。
实验内容:1.用shell命令查看Linux文件类型。
Linux的文件类型包括:普通文件(—)、目录文件(d)、字符设备文件(c)、块设备文件(b)硬链接文件、套接口文件(s)、符号链接文件(l)和管道文件(p)。
2.用shell命令了解Linux文件系统的目录结构。
3.用命令分别建立硬链接文件和符号链接文件。
通过ls -il命令所示的inode、链接计数观察他们的区别。
◆思考题:建立硬链接文件和建立符号链接文件有什么区别?答:硬连接指通过索引节点来进行的连接。
在Linux中,多个文件名指向同一索引节点是存在的。
一般这种连接就是硬连接。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
其原因如上所述,因为对应该目录的索引节点有一个以上的连接。
只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。
也就是说,文件才会被真正删除。
与硬连接相对应的另一种连接,称为符号连接(软连接)。
软链接文件有点类似于Windows的快捷方式。
它实际上是特殊文件的一种。
在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
如上图实验所示:touch f1(创建一个f1的文件)ln f1 f2 创佳一个f2的硬连接ln -s f1 f3 创建一个f3的软连接此时如果删除f3,对f1、f2无影响;如果删除f2,对f1、f3也无影响,如果删除f1,那么因为f2也应用f1,所以并不影响f2节点的,cat创建的文件仍然存在;但是此时f3因为是软连接,导致f3失效。
第一章1.操作系统的目标方便性、有效性、可扩充性、开放性2.操作系统的作用1.OS作为用户与计算机硬件系统之间的接口(命令方式,系统调用方式和图标-窗口方式)2. OS作为计算机系统资源的管理者(处理机、存储器、I/O设备以及文件(数据和程序))3. OS实现了对计算机资源的抽象(铺设在计算机硬件上的多层软件的集合)3.推动操作系统发展的的主要动力1. 不断提高计算机资源利用率2. 方便用户3. 器件的不断更新换代4. 计算机体系结构的不断发展5. 不断提出新的应用需求4.未配置操作系统的计算机系统1. 人工操作方式2. 脱机输入/输出(Off-Line I/O)方式脱机I/O 是指事先将装有用户程序和数据的纸带或卡片装入纸带输入机或卡片机,在外围机的控制下,把纸带或卡片上的数据或程序输入到磁带上。
该方式下的输入输出由外围机控制完成,是在脱离主机的情况下进行的。
而联机I/O方式是指程序和数据的输入输出都是在主机的直接控制下进行的。
5.单道批处理系统内存中始终只保持一道作业在解决人机矛盾和CPU与I/O设备速度不匹配矛盾的过程中形成的批处理系统旨在提高系统资源的利用率和系统吞吐量缺点:系统中的资源得不到充分的利用(内存中仅有一道程序,每逢该程序在运行中发出I/O请求后,CPU便处于等待状态)6.三大经典OS(1)多道批处理系统从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中的各种资源优缺点:(1) 资源利用率高。
(多道程序交替运行,提高CPU,内存,I/O利用率)(2) 系统吞吐量大。
(CPU和其他资源保持忙碌状态,系统开销小)(3) 平均周转时间长。
(作业要排队依次进行处理)(4) 无交互能力(修改和调试程序不便)多道批处理系统需要解决的问题(1) 处理机争用问题。
(2) 内存分配和保护问题。
(3) I/O设备分配问题。
(4) 文件的组织和管理问题。
(5) 作业管理问题。
(6) 用户与系统的接口问题。
上海大学计算机组成原理实验报告十上海大学计算机学院《计算机组成原理实验》报告十姓名 XXX 学号 XXXXXX 教师王雪娟时间三 11-13 地点行健楼 6楼机位 4建立指令流水系统〔研究实验〕一.实验目的:1.了解指令流水操作的根本概念和工作原理。
2.了解指令流水系统的设计方式。
3。
编制一条可以流水方式运行的指令。
二.实验原理:1.硬部件的并行工作:在微指令编码上,当几个子操作的微指令码中为低电平〔有效〕的都不相同时,可以将这三个子操作的微指令码合并成一个微指令,这个微指令控制三局部硬件并行工作。
2.指令流水执行:把“使用不同硬件的操作可以同时工作〞的概念推广到相继的两条指令之间,就形成“指令的流水线执行模式〞。
这个模式下,同一时间有多条指令各自在不同的硬件中执行,而对同一条指令而言,不同时间顺序在不同的硬件中执行,这就是指令流水模式的名称来源。
要形成指令流水模式,每条指令都应该分成几个独立的子操作,当前趋指令的后几个子操作与后继指令的前几个子操作不使用同样的硬件时,系统就可设计成流水线方式。
3.实验箱系统的指令流水硬件根底:如果一条指令的最后一个微操作与取指无关,就可以把二者合并成一个微指令,这个指令的最后一个微操作与取下一条指令并行进行。
对下一条指令而言,其“取指〞与“其他操作〞在不同硬件中顺序执行——指令二级流水。
4.实验箱系统实现指令流水的技巧:一条指令的最后一个微操作与取指无关,就可以把二者合并成一个微指令。
这个原那么用微操作码表述就是:假设取指令操作〔CBFFFF〕与它前面的微操作码没有相同的位为0,那么这两个微操作码的“与〞就是二者合并后的微指令。
在程序中这条指令就会和它的后继指令形成二级流水模式。
三.实验步骤:1. 改造实验九中自己编制的指令集,使其中至少一条指令成流水方式: (1)翻开自己编制的MIC文件(2)将局部可以合并的指令修改成如下: A+W #* T2 10 C7FFEFT1 11 CBFE90 12 FFFFFF 13 FFFFFF OUTAT1 14 CBDF9F 15 FFFFFF 16 FFFFFF 17 FFFFFF以上都将原先的T0,T1指令合并,形成了指令流水。
《计算机组成原理实验》报告姓名 请叫我雷锋 学号时间 地点题目:编写一个独立的小型中文指令系统,其包含有下列中文指令:输入 A ; 乘积 3*A ; 跳到 *; 进位跳 *; 输出乘积 ; 赋值 A,#*。
并用一测试程序来测试之,当3倍的乘积有进位时,out 寄存器显示FF ,当无进位时,显示其值。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Mic 文件:Mic文件代码如下:_FATCH_ T0 00 CBFFFF指令寄存器IR PC输出A输出写入 +101 FFFFFF A 输出 +102 FFFFFF A 输出 +103 FFFFFF A 输出 +1乘积3*A T3 04 FFFB9F 寄存器值R? 寄存器W A 输出 +1 T2 05 FFF7EFT1 06 FFFE90 ALU直通寄存器A标志位C,Z 加运算T0 07 CBFE90赋值 A,#* T1 08 C7FFF7 存贮器值EM 寄存器A PC输出 A输出 +1 +1 T0 09 CBFFFF 指令寄存器IR PC输出 A输出写入 +10A FFFFFFA输出 +10B FFFFFFA输出 +1跳到 * T1 0C C6FFFF 存贮器值EM 寄存器PC PC输出 A输出 +1写入 T0 0D CBFFFF指令寄存器IR PC输出 A输出写入 +10E FFFFFFA输出 +10F FFFFFFA输出 +1进位跳 * T1 10 C6FFFF 存贮器值EM 寄存器PC PC输出A输出 +1 写入 T0 11 CBFFFF指令寄存器IR PC输出 A输出写入 +112 FFFFFFA输出 +113 FFFFFFA输出 +1输入 A T1 14 FFFF17 用户IN寄存器A A输出 +1T0 15 CBFFFF 指令寄存器IR PC输出 A输出写入 +116 FFFFFF A输出 +117 FFFFFF A输出 +1输出乘积 T1 18 FFDF9F ALU直通用户OUT A输出 +1T0 19 CBFFFF 指令寄存器IR PC输出 A输出写入 +11A FFFFFF A输出 +11B FFFFFF A输出 +1Mac文件:_FATCH_ 000000xx 00-03 1乘积 3*A 000001xx 04-07 2赋值 A,#* 000010xx 08-0B * 2跳到 * 000011xx 0C-0F * 2进位跳 * 000100xx 10-13 * 2输入 A 000101xx 14-17 * 1输出乘积 000110xx 18-1B 1Dat文件:乘积 3*A 04 1赋值 A,#* 08 2跳到 * 0C 2进位跳 * 10 2输入 A 14 1输出乘积 18 1源程序文件:L1:输入 A乘积 3*A进位跳 L2输出乘积跳到 L1L2:赋值 A,#FFH输出乘积跳到 L1。
SHANGHAI UNIVERSITY 《操作系统(一)》实验报告学院计算机工程与科学学院姓名吴学辉报告序号三实验题目进程管理及进程通信日期2016.11.1《操作系统(一)》实验报告一、实验目的与要求1. 利用Linux提供的系统调用设计程序,加深对进程概念的理解。
2. 体会系统进程调度的方法可效果。
3. 了解进程之间的通信方式以及各种通信方式的使用二、实验环境Linux Ubuntu系统三、实验内容实验方法:用vi编写C程序(假定程序文件名为prog1.c)编写程序$ gcc –o prog1.o prog1.o (编译prog1.c产生输出的目标程序prog1.o)或$ cc -o prog1.o prog1.c运行$./prog1.o操作过程:1.编写程序。
显示进程的有关标识(进程标识、组标识、用户标识等)。
经过5 秒钟后,执行另一个程序,最后按用户指示(如:Y/N)结束操作。
2.参考例程1,编写程序。
实现父进程创建一个子进程。
体会子进程与父进程分别获得不同返回值,进而执行不同的程序段的方法。
思考:子进程是如何产生的?又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:是由父进程用fork()函数创建形成的,通过exit()函数自我结束,子进程被创建后核心将其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程所有文件。
3.参考例程2,编写程序。
父进程通过循环语句创建若干子进程。
探讨进程的家族树以及子进程继承父进程的资源的关系。
思考题:①画出进程的家族树。
子进程的运行环境是怎样建立的?反复运行此程序看会有什么情况?解释一下。
②修改程序,使运行结果呈单分支结构,即每个父进程只产生一个子进程。
画出进程树,解释该程序。
2.修改之后的程序运行结果:解释:当该进程为父进程时就创建子进程并退出,当该进程为子进程时返回标识号4.参考例程3 编程,使用fork( )和exec( )等系统调用创建三个子进程。
SHANGHAI UNIVERSITY计算机操作系统实验报告(实验三、六)学院计算机工程与科学学院专业计算机科学与技术组号第28 组姓名11121763 盛俊教师沈俊赵正德日期2013-10-25实验三进程管理及进程通信一. 实验目的利用Linux提供的系统调用设计程序,加深对进程概念的理解。
体会系统进程调度的方法和效果。
了解进程之间的通信方式以及各种通信方式的使用。
二. 实验准备复习操作系统课程中有关进程、进程控制的概念以及进程通信等内容(包括软中断通信、管道、消息队列、共享内存通信及信号量概念)。
熟悉本《实验指导》第五部分有关进程控制、进程通信的系统调用。
它会引导你学会怎样掌握进程控制。
阅读例程中的程序段。
三. 实验方法用vi 编写c 程序(假定程序文件名为prog1.c)编译程序$ gcc -o prog1.o prog1.c 或$ cc -o prog1.o prog1.c 运行$./prog1.o四. 实验内容及步骤1. 编写程序。
显示进程的有关标识(进程标识、组标识、用户标识等)。
经过5 秒钟后,执行另一个程序,最后按用户指示(如:Y/N)结束操作。
2. 参考例程1,编写程序。
实现父进程创建一个子进程。
体会子进程与父进程分别获得不同返回值,进而执行不同的程序段的方法。
思考:子进程是如何产生的?又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:是由父进程用fork()函数创建形成的,通过exit()函数自我结束,子进程被创建后核心将其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程所有文件。
3. 参考例程2,编写程序。
父进程通过循环语句创建若干子进程。
探讨进程的家族树以及子进程继承父进程的资源的关系。
思考题:①画出进程的家族树。
子进程的运行环境是怎样建立的?反复运行此程序看会有什么情况?解释一下。
②修改程序,使运行结果呈单分支结构,即每个父进程只产生一个子进程。
画出进程树,解释该程序。
2.修改之后的程序运行结果:解释:当该进程为父进程时就创建子进程并退出,当该进程为子进程时返回标识号4. 参考例程3 编程,使用fork( )和exec( )等系统调用创建三个子进程。
子进程分别启动不同程序,并结束。
反复执行该程序,观察运行结果,结束的先后,看是否有不同次序。
思考:子进程运行其它程序后,进程运行环境怎样变化的?反复运行此程序看会有什么情况?解释一下。
答:子进程运行其他程序后,这个进程就完全被新程序代替。
由于并没有产生新进程所以进程标识号不改变,除此之外的旧进程的其他信息,代码段,数据段,栈段等均被新程序的信息所代替。
新程序从自己的main()函数开始进行。
反复运行此程序发现结束的先后次序是不可预知的,每次运行结果不一样。
原因是当每个子进程运行其他程序时,他们的结束随着其他程序的结束而结束,所以结束的先后次序在改变。
5. 参考例程4编程,验证子进程继承父进程的程序、数据等资源。
如用父、子进程修改公共变量和私有变量的处理结果;父、子进程的程序区和数据区的位臵。
思考:子进程被创建后,对父进程的运行环境有影响吗?解释一下。
答:子进程被创建后,对父进程的运行环境无影响,因为当子进程在运行时,他有自己的代码段和数据段,这些都可以作修改,但是父进程的代码段和数据段是不会随着子进程数据段和代码段的改变而改变。
6. 参照《实验指导》第五部分中“管道操作的系统调用”。
复习管道通信概念,参考例程5,编写一个程序。
父进程创建两个子进程,父子进程之间利用管道进行通信。
要求能显示父进程、子进程各自的信息,体现通信效果。
代码:思考:①什么是管道?进程如何利用它进行通信的?解释一下实现方法。
②修改睡眠时机、睡眠长度,看看会有什么变化。
请解释。
③加锁、解锁起什么作用?不用它行吗?答:1.管道是指能够连接一个写进程和一个读进程,并允许他们以生产者-消费者方式进行通信的一个共享文件,又称pipe文件。
由写进程从管道的入端将数据写入管道,而读进程则从管道出端读出数据来进行通信。
2.修改睡眠时机和睡眠长度都会引起进程被唤醒的时间不一,因为睡眠时机决定进程在何时睡眠,睡眠长度决定进程何时被唤醒。
3.加锁、解锁是为了解决临界资源的共享问题。
不用它将会引起无法有效管理数据,即数据会被修改导致读错了数据。
7. 编程验证:实现父子进程通过管道进行通信。
进一步编程,验证子进程结束,由父进程执行撤消进程的操作。
测试父进程先于子进程结束时,系统如何处理“孤儿进程”的。
思考:对此作何感想,自己动手试一试?解释一下你的实现方法。
答:只要在父进程后加上wait()函数,然后打印“子进程已经结束”,一旦子进程结束,父进程撤销进程。
当父进程先于子进程终止时.所有子进程的父进程改变为init进程称为进程由init进程领养。
8. 编写两个程序一个是服务者程序,一个是客户程序。
执行两个进程之间通过消息机制通信。
消息标识MSGKEY 可用常量定义,以便双方都可以利用。
客户将自己的进程标识(pid)通过消息机制发送给服务者进程。
服务者进程收到消息后,将自己的进程号和父进程号发送给客户,然后返回。
客户收到后显示服务者的pid和ppid,结束。
以下例程6 基本实现以上功能。
这部分内容涉及《实验指导》第五部分中“IPC系统调用”。
先熟悉一下,再调试程序。
思考:想一下服务者程序和客户程序的通信还有什么方法可以实现?解释一下你的设想,有兴趣试一试吗。
服务者程序客户程序:答:还可以用信号量机制来实现。
信号量是一个整形计数器,用来控制多个进程对共享资源的访问。
或者通过消息队列信号机制,通过向消息队列发送信息、接收信息来实现进程间的通信。
9. 这部分内容涉及《实验指导》第五部分中“有关信号处理的系统调用”。
编程实现软中断信号通信。
父进程设定软中断信号处理程序,向子进程发软中断信号。
子进程收到信号后执行相应处理程序。
思考:这就是软中断信号处理,有点儿明白了吧?讨论一下它与硬中断有什么区别?看来还挺管用,好好利用它。
答:硬中断是由外部硬件产生的,而软中断是CPU根据软件的某条指令或者软件对标志寄存器的某个标志位的设臵而产生的。
10.怎么样,试一下吗?用信号量机制编写一个解决生产者—消费者问题的程序,这可是受益匪浅的事。
本《实验指导》第五部分有关进程通信的系统调用中介绍了信号量机制的使用。
代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#include <signal.h>#define N 5 // 消费者或者生产者的数目#define M 10 // 缓冲数目//int M=10;int in = 0; // 生产者放臵产品的位臵int out = 0; // 消费者取产品的位臵int buff[M] = { 0 }; // 缓冲初始化为0,开始时没有产品sem_tempty_sem; // 同步信号量,当满了时阻止生产者放产品sem_tfull_sem; // 同步信号量,当没产品时阻止消费者消费pthread_mutex_tmutex; // 互斥信号量,一次只有一个线程访问缓冲intproduct_id = 0; //生产者idintprochase_id = 0; //消费者id//信号处理函数voidHandlesignal(intsigno){printf("程序退出\n",signo);exit(0);}/* 打印缓冲情况*/void print() {inti;printf("产品队列为");for(i = 0; i< M; i++)printf("%d", buff[i]);printf("\n");}/* 生产者方法*/void *product() {intid = ++product_id;while(1) {//重复进行//用sleep的数量可以调节生产和消费的速度,便于观察sleep(2);sem_wait(&empty_sem);pthread_mutex_lock(&mutex);in= in % M;printf("生产者%d在产品队列中放入第%d个产品\t",id, in);buff[in]= 1;print();++in;pthread_mutex_unlock(&mutex);sem_post(&full_sem);}}/* 消费者方法*/void *prochase() {intid = ++prochase_id;while(1) {//重复进行//用sleep的数量可以调节生产和消费的速度,便于观察sleep(5);sem_wait(&full_sem);pthread_mutex_lock(&mutex);out= out % M;printf("消费者%d从产品队列中取出第%d个产品\t",id, out);buff[out]= 0;print();++out;pthread_mutex_unlock(&mutex);sem_post(&empty_sem);}}int main() {printf("生产者和消费者数目都为5,产品缓冲为10,生产者每2秒生产一个产品,消费者每5秒消费一个产品,Ctrl+退出程序\n");pthread_tid1[N];pthread_tid2[N];inti;intret[N];//结束程序if(signal(SIGINT,Handlesignal)==SIG_ERR){//按ctrl+C产生SIGINT信号printf("信号安装出错\n");}// 初始化同步信号量intini1 = sem_init(&empty_sem, 0, M);//产品队列缓冲同步intini2 = sem_init(&full_sem, 0, 0);//线程运行同步if(ini1 && ini2 != 0) {printf("信号量初始化失败!\n");exit(1);}//初始化互斥信号量intini3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0) {printf("线程同步初始化失败!\n");exit(1);}// 创建N个生产者线程for(i = 0; i< N; i++) {ret[i]= pthread_create(&id1[i], NULL, product, (void *) (&i));if(ret[i] != 0) {printf("生产者%d线程创建失败!\n", i);exit(1);}}//创建N个消费者线程for(i = 0; i< N; i++) {ret[i]= pthread_create(&id2[i], NULL, prochase, NULL);if(ret[i] != 0) {printf("消费者%d线程创建失败!\n", i);exit(1);}}//等待线程销毁for(i = 0; i< N; i++) {pthread_join(id1[i], NULL);pthread_join(id2[i],NULL);}exit(0);}一.研究并讨论1.讨论Linux 系统进程运行的机制和特点,系统通过什么来管理进程?在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(Process Control Block,简称PCB)。