《计算机操作系统》上机实验指导_第1页
《计算机操作系统》上机实验指导_第2页
《计算机操作系统》上机实验指导_第3页
《计算机操作系统》上机实验指导_第4页
《计算机操作系统》上机实验指导_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《计算机操作系统》

上机实验指导

计算机学院

第一部分.实验要求

《计算机操作系统》课程实验的目的是为了使学生在课程学习的

同时,通过做实验理解计算机操作系统的资源限制;通过进程调度算

法的实现,了解计算机操作系统的核心功能。

在《计算机操作系统》课程的实验过程中,要求学生做到:

(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验

可能出现的情况提前做出思考和分析。

(2)按照使用要求认真编写程序,要求有写出程序设计说明,给出

程序清单(包括可读性好的注释)。

(3)认真书写实验报告,并在规定的时间内提交实验报告。

(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。

(5)分散上机时,积极主动上机完成任务;集中检查时,不迟到。

如有事不能出席,所缺实验一般不补。

(6)实验的验收将分为两个部分。

第一部分是上机操作,包括检查程序运行和即时提问。

第二部分是提交书面的实验报告。

计算机操作系统实验将采用阶段检查方式,每个实验都将应当在

规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩。

以避免期末集中检查方式产生的诸多不良同题,希望同学们抓紧时

间,合理安排,认真完成。

实验L操作系统安装检查点

实验目的:

通过动手安装linux虚拟机,来初步了解一个操作系统。了解虚拟机,

能够在windows下安装linux系统和对VMware虚拟机进行操作。

实验要求:

在windows平台下使用Vmware安装Linux系统:fedoraT5。完成安

装后提交两个截图并回答linux相关的问题。

实验步骤:

(1)在^^:〃202・207・12.210/1@6$/必1)1/文件夹中下载£6(101@-15

安装包。

(2)安装VMwarewcrkstation:实验室中自带了VMwarestationACE,

如果上机时系统自带VMware贝I」可跳过下列安装步骤。

1.双击VMware-workstation-ful1-7.1.4-385536,

2.在弹出界面:安装提示和版权警告中选择“next”;

3.在安装类型界面中的安装类型:Typical(典型)和Custom(自定

义)中选择“Typical”o

4.在安装目录中选择change,将安装目录转换为F:\os\vmware(如

果没有目录则自行建立)。

5.自动更新界面:将自动更新的选项复选掉,选择不自动更新。

6.帮助vm收集资料界面中:选择不帮助vm收集资料;

7.创立快捷键界面中:选择Start...(开始菜单中快捷方式)建立

快捷方式。

8.选择contilue,开始安装。

9.安装完毕后选择restartnow。

10.注:其安装sn放于ftp:〃202.207.12.210/grades/gradesl/

文件夹

(3)安装linux:fedora-15:

开始-所有程序-VMware-VMworkstation,进入VMware。

点击上方工具栏中文件-新建-虚拟机。

首先:在弹出界面中选择典型;

下一步:在上方的系统类型中选择linux,在下方的版本选择中不选

择;

下一步:在虚拟机名称中输入Fodora-15,下方对话中选择浏览,选

择Linux所要安装的文件位置F:\os\fedora(如果没有请自行建

立);

下一步:在网络连接设置中选择使用桥接网络;

下一步:先输入虚拟磁盘的大小,建议:10GB。

完成以上步骤后,我们就回到了最初打开VMware的界面,在左边

favourites中出现了我们建立的FedoraT5虚拟机;

左键单击FedoraT5,在右侧的设备栏由双击Memory,向右拖动滑

动块,使得内存分配大于600nb建议1024nl以上,点击ok;在右侧的

设备栏中双击CD-ROM,在弹出的窗口中选择使用ISO镜像,点击浏览,

找到我们下载的FedoraT5-i686-Live-Desktop.iso镜像文件,点ok。

在左侧的命令栏中点击“启动该虚拟机”,启动Fedora-15.

进入漂亮的fedora系统后,我们需要把他从光盘启动安装到硬盘上。

•首先:点击左上角的Applications-SystemTools-Installto

HardDriveo

•下一步:在弹出的键盘语言选择中选择U.S.Englisho

•下一步:在安装硬盘选择中选择BasicStorageDevices.

•下一步:在数据是否保留中选择Yes,discardanydata。

•下一步:在网络主机名名输入一个自己喜欢的ID,譬如:Chaoso

•下一步:选择自己计算机所在的时域,在图中找到中国上海,

shanghai,Asia,单击确定。

•下一步:设置系统中root用户(管理员)的密码,并重复一次。

密码为:000000。在弹出框中点UseAnywayo

•下一步:在这一步中截图,并逐条解释每一个选项的意思。选项

不做改变,点击next。

•下一步:确认安装,点击WriteChangetoDisk。

•在安装完毕后出现的窗口中点击close,在右上角的中选择live

systemuser-ShutDown,然后选择Restart。

在Restart后我们进入了我们安装的Fedora的设置界面。

•Welcome

•LicenseInformation

•CreateUser在这里输入全名用户名密码,密码重复两次。(密

码为:000000)

•DateandTime修改时间

•HardwareProfile上传硬件信息不做选择点击Finish。在弹出框

中选择No,donotsend.

稍后,我们键入自己的密码:000000进入了我们安装的Fedora系统。

为了记录我们成功的安装,打开Application-System

Tools-Add/RemoveSoftware后截图。

《计算机操作系统》实验报告

姓名学号

成绩年月日

一、回答问题

(1)在LINUX环境下系统设备管理,如何知道本机CPU、内存等系统配置?

例如查询显示器、键盘、鼠标等属性

(2)磁盘管理,WINDOWS系统分区、LINUX分区各占多大?各分区所在位

置?

(3)磁盘文件系统管理,包括WINDOWS文件系统类型、LINUX文件系统类

型、LINUX所占三个分区容量和用途、启动挂接点等

(4)Fedora或Ubuntu系统下集成的C/C++语言开发环境是哪个?怎样启动进

入和使用?

实验2Shell基本命令

背景知识:

Shell

Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件

(命令解析器)。它接收用户命令,然后调用相应的应用程序。同时它又

是一种程序设计语言,作为命令语言,它交互式解释和执行用户输入的命

令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,

它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,

包括循环和分支。

基本上shell分两大类:

—:图形界面shell(GraphicalUserInterfaceshell即GUIshell)

例如:应用最为广泛的WindowsExplorer(微软的windows系列制

作系统),还有也包括广为人知的Linuxshell,其中linuxshell包括X

windowmanger(BlackBox和FluxBox),以及功能更强大的CDE>GNOME、

KDE、XFCEo

二:命令行式shell(CommandLineInterfaceshell,即CLIshell)

例如:

bash/sh/ksh/csh(Unix/1inux系统)

COMMAND.COM(MS-DOS系统)

cmd.exe/命令提示字符(WindowsNT系统)

WindowsPowerShell(支援.NETFramework技术的WindowsNT系

统)

传统意义上的shell指的是命令行式的shell,以后如果不特别注明,

shell是指命令行式的shell。

文字操作系统与外部最主要的接口就叫做sheikshell是操作系统最

外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系

统解释你的输入,并且处理各种各样的操作系统的输出结果。

shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式

(从键盘输入,并且可以立即得到响应),或者以shellscript(非交互)

方式执行。shellscript是放在文件中的一串shell和操作系统命令,它

们可以被重复使用。本质上,shellscript是命令行命令简单的组合到一

个文件里面。

Shell基本上是一个命令解释器,类似于DOS下的command,com。它接

收用户命令(如1s等),然后调用相应的应用程序。较为通用的shell有

标准的Bourneshel1(sh)和Cshell(csh)o

实验目的:通过学习Shen指令,并成功运行相应指令,来对Shell有个直观

的概念。并且熟悉linux关于调用和监测操作系统的重要命令

实验要求:

学习调用和监测操作系统的重要命令:

(1)查看系统硬件配置

(2)查看操作系统类型和版本

(3)查看软件配置情况

(4)监测系统资源使用情况

(5)查看文件系统配置情况

实验步骤:

(1)进入linux。完成要求的操作。

(2)记录操作后系统的状态。

(3)提交实验报告。

《计算机操作系统》实验报告

姓名学号

成绩年月日

一、回答问题

(1)查看系统硬件配置

(2)查看操作系统类型和版本

(3)查看软件配置情况

(4)监测系统资源使用情况

(5)查看文件系统配置情况

(6)简述windos和linux两者shell的区别

实验3Shell脚本编程

背景知识:

计算机语言是为了各种目的和任务而开发的,一个常见任务就是把各

种不同的已有组件连接起来以完成相关任务。大多脚本语言共性是:良好

的快速开发,高效率的执行,解释而非编译执行,和其它语言编写的程序

组件之间通信功能很强大。

许多脚本语言用来执行一次性任务,尤其是系统管理方面。它可以把

服务组件粘合起来,因此被广泛用于GUI创建或者命令行,操作系统通常

提供一些默认的脚本语言,即通常所谓shell脚本语言。

脚本通常以文本(如ASCH)保存,只在被调用时进行解释或编译。

有些脚本是为了特定领域设计的,但通常脚本都可以写更通用的脚本。

在大型项目中经常把脚本和其它低级编程语言一起使用,各自发挥优势解

决特定问题。脚本经常用于设计互动通信,它有许多可以单独执行的命令,

可以做很高级的操作,(如在传统的Unixshell(sh)中,大多操作就是程

序本身。)

这些高级命令简化了代码编写过程。诸如内存自动管理和溢出检查等

性能问题可以不用考虑。在更低级或非脚本语言中,内存及变量管理和数

据结构等耗费人工,为解决一个给定问题需要大量代码,当然这样能够获

得更为细致的控制和优化。脚本缺少优化程序以提速或者降低内存的伸缩

性。

综上所述,脚本编程速度更快,且脚本文件明显小于如同类C程序文

件。这种灵活性是以执行效率为代价的。脚本通常是解释执行的,速度可

能很慢,且运行时更耗内存。在很多案例中,如编写一些数十行的小脚本,

它所带来的编写优势就远远超过了运行时的劣势,尤其是在当前程序员工

资趋图和硬件成本趋低时。

然而,在脚本和传统编程语言之间的界限越来越模糊,尤其是在一系

列新语言及其集成畅出现时。在一些脚本语言中,有经验的程序员可以进

行大量优化工作。在大多现代系统中通常有多种合适的脚本语言可以选择,

所以推荐使用多种语言(包括C或汇编语言)编写一种脚本。

在本实验中推荐使用bashshell或者cshell编写程序,当然,我们

也欢迎使用其他语言完成实验。

参考资料:

I.《UNIX系统基础与SHELL编程》,作者:章卫国,李爱军,西北工业大学出版社出版。

2.《精通UNIXShell脚本编程》,作者:(美)RandalK.Michael,电子工业出版社。

3.中国IT实验室Shell编程:http:〃I/List129.html

4.LinuxManPages:http:〃linuxmanD/manI/bash.1.ph。

实验目的:

复习shell脚本语言编程,并能完成•些相关于操作系统的基础操作。

实验要求:

使用脚本编程语言调用操作系统共用例程:

(1)查看主机名、IP地址

(2)创建目录、文件

(3)修改目录文件属性

(4)基本输入输出

实验步骤:

(1)进入linux。编写程序完成实验要求。

(2)记录程序运行的结果。

(3)提交实验报告(截图放在实验报告里)。

《计算机操作系统》实验报告

姓名学号

成绩年月日

一、程序功能

二、程序代码

三、程序结果截图

实验4Linux进程控制

背景知识:

进程通信:

进程间通信的目的

数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据

量在一个字节到几兆字节之间。

共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,

别的进程应该立刻看到。

通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它

们)发生了某种事件(如进程终止时要通知父进程)。

资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内

核提供锁和同步机制,

进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),

此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知

道它的状态改变。

进程通过与内核及其它进程之间的互相通信来协调它们的行为。Linux

支持多种进程间通信(IPC)机制,信号和管道是其中的两种。除此之外,

Linux还支持SystemV的TPC机制(用首次出现的Unix版本命名)。

进程间通信有三种

1.发送信号,是同步的,可以带参数,也可以不带参数,如kill或者是sigqueue

2.管道,建立管道进行通讯

3.共享内存,开辟一块内存区域,多个应用程序都可以访问,达到通讯的目的,

但是是异步的。

进程间通信的部分函数

列举其中部分相关于进程的函数:fork,getpid,getppid,system,exec..

1.fork():可以建立了进程。

函数原型:pid_tfork(void);

注:pid_t是一个宏定义,其实质是定义在#历&11(1©<5丫5/1)^©5.11>中的

int型,是用来保存进程ID的变量。

fork函数会创建一个新的子进程。其子进程会会获得父进程的数据空间与

堆栈能资源的副本。并对父进程的环境变量、组代码、用户代码、已打开的文

件代码、工作目录和资源限制进行继承。同时需要注意的是,子进程复制父进

程的地址空间的内容,因此,子进程有自己的地址空间,父子进程间对于这些

存储空间不共享。

其返回值将会在父子进程中各返回一次,如果fork失败则会返回.1,将其

正确的返回值记录在实验报告中记录。

2.getpid():取得进程识别码。函数原型为pid_tgetpid(void),由pid_t记录

目前进程的进程识别码。

示例:

“pid_tp=getpid()f,

3.getppid():取得父进程识别码。其与getpid类似。区别在于其返回的是目

前进程的父进程识别码。

4.system(string):system。会调用fork。产生子进程,由子进程来调用

/bin/sh-cstring来执行参数string字符串所代表的命令。

5.exec..():装入并运行其它程序的函数。

exec..是一个函数族,这里列出了他的六个函数。

intexecl(constchar*path,constchar*arg,…);

intexeclp(constcharconstchar*arg,…);

intexecle(constchar*path,constchar*arg,...,char*const

envp[]);

intexecv(constchar*path,char*constargv[]);

intexecvp(constchar*file,char*constargv[]);

intexecve(constchar*path,char*constargv[],char*constenvp[]);

其中,*palh说明由路径名指定执行程序,$11:execl("/bin/ls",…)

*file说明由文件指定执行程序;其第二个参数以及用省略号表示的其他

参数一起组成了该程序执行时的参数表,按照linux中的惯例,参数表

的第一项是不带路径的程序文件名。被调用的程序可以访问这个参数

表,它相当于shell下的命令行参数。实际上,shell本身对命令的调用

也是用exec来实现的。由于参数的个数是任意的,所以需要用一个NULL

指针来标记参数表的结尾。

下面列举了一个简单的范例:

intexecl(constchar*fullpath,constchar*arg,….)

execl(“/bin/ls",“Is”,"-L”,NULL);

〃如果execl返回,说明其调用失败

Perror(uexeclfailedtorunIs");

以上儿个函数都是包含在头文件unistd.h中。下面介绍一下wait()

函数。其表头文件为#include<sys/types.h>

#include<sys/wait.h>0

6.wait():原型为pid_twait(int*status);暂停目前进程的执行,直到

有信号来临或者子进程结束。如果在调用wait()时子进程已经结束,

则wait()会立即返回子进程结束状态值。子进程的结束状态值会由

参数status返回,而子进程的进程识别码也会一起返回。如果不在意

结束状态值,则参数status可以设成NULL。

实验目的:

理解进程的概念,并通过实验明确程序与进程的区别:通过对于操作系统的

交互操作对于并发进程有一个直观的概念;培养在linux系统下关于进程编写程

序的能力。

实验要求:

编写程序:

1.用fork函数由一个父进程生成两个子进程,并屏显三个进程的进程ID。

2.要求父进程创建子进程,在子进程中分别用exec函数与system函数执行

“dir-a”。并分析其区别。

3.分析以下代码为什么不是只打出来一句话,而是两句话。

main()

{pid_tpid;

pid=fork();

if(pid<0)

printf(,zerrorinfork!”);

elseif(pid==0)

printf(^iamthechildprocess,myprocessidis%d\n〃,getp

idO);

else

printf("iamtheparentprocess,myprocessidisget

pidO);

)

结果是

[root@localhostc]#./a.out

iamthechildprocess,myprocessidis4286

iamtheparentprocess,myprocessidis4285

4.编写代码,父进程输出:“falher:”后缀pid,子进程输出:“child",后缀pid;

多次运行,并以此解释程序并行原理。

实验步骤:

(1)进入linux。编写程序完成实验要求。

(2)记录程序运行的结果。

(3)提交实验报告。

《计算机操作系统》实验报告

姓名学号

成绩年月日

四、程序功能

五、程序框图或描述

六、程序代码

实验5进程间的通信机制

背景知识:

进程间通信的定义

为了进程相互之间交换数据,引入了进程间通信(ipc)0常用的机制有:

■共享内存段(sharedmcmoi-ysegment)o在内存中划分一段公共区域供多个进

程共享,以达到在多进程间快速、大量的共享数据。

■管道(pipe)是先进先出的单向数据通道,可在相关进程间传递未结构化的数

据流。

■FIFO(即命名管道)是拥有永久名称的管道。

除了上述机制之外,还有信号量和消息队列,在本次实验里不做要求:

■信号量(Semaphore)。允许进程相互同步,主要特点为,避免多个进程共享资

源时的冲突。

■消息队歹U(Messagequeue)。在进程间以队列形式异步传递少量数据,例如消

息。

而在UNIX中也有着面向客户/服务器模型而设计的,针对客户和服务器程序提

供不同的socket系统调用。我们通常可以称为套接字。

■套接字(Socket)端口式进程通信方式。类似于插槽,针对客户和服务器模型,

客户随即申请一个Socket,系统为之分配一个Socket号,双方根据Socket

号进行通信。

实验目的:

理解进程通信的概念,在前一次学习了相关进程控制函数的基础上,实现

进程间的通信。

实验要求:

编写程序:

1.题目1:使用父进程创建四个子进程,在进程间用pipe函数进行通信。

2.题目2:使用FIFO函数进行通行,由进程A生产数据,由进程B读取数据。

3.题目3:使用管道或者套接字进行通信,编写程序建立四个进程。分别试验

三写一读、两写两读情况,多次执行后观察果是否,并对记录的执行结果进

行解释。

《计算机操作系统》实验报告

姓名学号

成绩年月日

七、程序功能

八、程序框图或描述

九、程序代码

实验6Linux线程控制

背景知识:

线程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指

令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,

是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有

一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进

程所拥有的全部资源,一个线程可以创建和撤消另一个线程,同一进程中

的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运

行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程

序都至少有一个线程,那就是程序本身。线程是程序中一个单一的顺序控

制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

使用多线程的理由之一是和进程相比,它是一种非常〃节俭〃的多任务

操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它

独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,

这是一种〃昂贵〃的多任务工作方式。而运行于一个进程中的多个线程,它

们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费

的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需

的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进

程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个

数据可能会有较大的区别。

使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,

它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,

这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程

之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不

仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不

能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给

多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的

地方。

除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、

并发的工作方式,当然有以下的优点:

1)提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作

耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、

菜单的操作,而使用多线程技术,将耗时长的操作(timeconsuming)置

于一个新的线程,可以避免这种尴尬的情况。

2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目

时,不同的线程运行于不同的CPU上。

3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成

为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

线程函数

(1)进程创建函数

创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是

pthread_create()o在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,该

线程也就退出了,这也是线程退出一种方法。

所需头文件#include<pthrcad.h>

intpthread_crea(e((pthread_t*thread,p(hread_attr_t*attr,

函数原型

void*(*start_routine)(void*),void*arg))

thread:线程标识符

函数传入值

allr:线程属性设置(其具体设置参见9.2.3小节),通常取为NULL

siart_routine:线程函数的起始地址,是一个以指向void的指针作为参数和返回值的函数

指针

arg:传递给siartjouline的参数

成功:0

函数返回值

出错:返回错误码

(2)进程退出函数

线程退出时使用函数pthreadexit,是线程的主动行为。注意进程退出时使

用exit函数,线程中用pthread_exit替代exito

所需头文件#includc<pthrcad.h>

函数原型voidpthread_exit(void*retval)

函数传入值retval:线程结束时的返回值,可由其他函数如3hread」oin()来获取

(3)等待函数(等待一个线程的结束)

由于一个进程中的多个线程共享数据段,因此通常在线程退出后,退出线程所占用的

资源并不会随线程结束而释放。所有需要pthroad_join函数来等待线程结束。类似

于wait系统调用。

所需头文件#include<pthread.h>

函数原型intpthreadjoin((pthread_tth,void**thread_return))

th:等待线程的标识符

函数传入值

thread_retum:用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)

成功:0

函数返回值

出借:返回错误码

(4)互斥锁线程控制

互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。这个互斥锁只有

两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。在同

一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进

行操作。若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直

到上锁的线程释放掉互斥锁为止。可以说,这把互斥锁保证让每个线程对共享资

源按顺序进行原子操作。

互斥锁机制主要包括下面的基本函数。

■互斥锁初始化:pthread_mutex_init()

■互斥锁上锁:pthread_mutex_lock()

■互斥锁判断上锁:pthread_mutex_trylock()

■互斥锁接锁:pthread_mutex_unlock()

■消除互斥锁:pthread_mutex_destroy()

其中,互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。这3种锁的区别

主要在于其他未占有互斥锁的线程在希望得到互承锁时是否需要阻塞等待。快速

锁是指调用线程会阻塞直至拥有互斥锁的线程解锁为止。递归互斥锁能够成功地

返回,并且增加调用线程在互斥上加锁的次数,而检错互斥锁则为快速互斥锁的

非阻塞版本,它会立即返回并返回一个错误信息。默认属性为快速互斥锁。

所需头文件#include<p(hread.h>

函数原型intpthread_mutex_init(pthread_mutex_t*niutex,constpthread_mutexattr_t*mutexattr)

函数传入值mutex:互斥锁

PTHREAD.MUTEXJNITIALIZER:创建快速互斥锁

MutexattrPTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁

PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁

成功:0

函数返回值

出错:返回错误码

所需头文件/include<p(hread.h>

intpihread_mu(ex_lock(pthread_mutex_(*mu(ex,)

intpthread_mutex_trylock(pthread_niutex_t*muUx.)

函数原型

inipthrcad_mulcx_unlock(pthrcad_niutex_i*muiex»)

intpthread_mutex_destroy(pthread_mu(ex_t*mu(ex,)

函数传入值mutex:互斥锁

成功:0

函数返回值

出错:-1

(5)信号量线程控制

信号量也就是操作系统中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。

信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。这里先来简单复

习一下PV原子操作的工作原理。

PV原子操作是对整数计数器信号量sem的操作。一次P操作使sem减一,而一次V操

作使sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。

当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,

当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于

0为止。PV原子操作主要用于进程或线程间的同步和互斥这两种典型情况。Linux实现了

POSIX的无名信号量,主要用于线程间的互斥与同步。

这里主要介绍几个常见函数。

■sem_inil()用于创建一个信号量,并初始化它的值。

■sem_wait。和scm’rywait。都相当于P操作,在信号量大于零时它们都能将信号量

的值减一,两者的区别在于若信号量小于零时,sem_wail()将会阻塞进程,而

sem_trywait()则会立即返回。

■sem_posl()相当于V操作,它将信号量的值加一同时发出信号来唤醒等待的进程。

■sem_getvalue。用于得到信号量的值。

■sem_destroy()用于删除信号量。

所需头文件/include〈semaphore.h>

函数原型intsem_init(sem_t*sem,intpsharcd,unsignedintvalue)

sem:信号星指针

pshared:决定信号量能否在几个进程间共享。由于目前Linux还没有实现进程间共享信

函数传入值

号量,所以这个值只能够取0,就表示这个信号量是当前进程的局部信号量

value:信号量初始化值

成功:0

函数返回值

出错:-1

所需头文件"include<pthrciid.h>

intsem_wait(sem_t*sem)

intsem_tr)'wait(sem_t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论