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

下载本文档

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

文档简介

1、计算机操作系统上机实验第 PAGE 27 页 共 NUMPAGES 27 页 计算机操作系统上机实验指导计算机学院 第一部分实验要求计算机操作系统课程实验的目的是为了使学生在课程学习的同时,通过做实验理解计算机操作系统的资源限制;通过进程调度算法的实现,了解计算机操作系统的核心功能。在计算机操作系统课程的实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前做出思考和分析。(2)按照使用要求认真编写程序,要求有写出程序设计说明,给出程序清单(包括可读性好的注释)。(3)认真书写实验报告,并在规定的时间内提交实验报告。(4)遵守机房纪律,服从辅导

2、教师指挥,爱护实验设备。(5)分散上机时,积极主动上机完成任务;集中检查时,不迟到。如有事不能出席,所缺实验一般不补。(6)实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行和即时提问。第二部分是提交书面的实验报告。计算机操作系统实验将采用阶段检查方式,每个实验都将应当在规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩。以避免期末集中检查方式产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成。实验1. 操作系统安装检查点实验目的:通过动手安装linux虚拟机,来初步了解一个操作系统。了解虚拟机,能够在windows下安装linux系统和对VMware虚拟机进行操作

3、。实验要求:在windows平台下使用Vmware安装Linux系统:fedora-15。完成安装后提交两个截图并回答linux相关的问题。实验步骤:(1)在10/labs/lab1/文件夹中下载fedota-15安装包。(2)安装VMwareworkstation:实验室中自带了VMwarestation ACE,如果上机时系统自带VMware则可跳过下列安装步骤。双击VMware-workstation-full-7.1.4-385536,在弹出界面:安装提示和版权警告中选择“next”;在安装类型界面中的安装类型:Typical(典型)和Custom(自定义)中选择“Typical”。在

4、安装目录中选择change,将安装目录转换为F:osvmware(如果没有目录则自行建立)。自动更新界面:将自动更新的选项复选掉,选择不自动更新。帮助vm收集资料界面中:选择不帮助vm收集资料;创立快捷键界面中:选择Start.(开始菜单中快捷方式)建立快捷方式。选择contitue,开始安装。安装完毕后选择restart now。注:其安装sn放于10/grades/grades1/文件夹(3)安装linux:fedora-15:开始-所有程序-VMware-VMworkstation,进入VMware。点击上方工具栏中文件-新建-虚拟机。首先:在弹出界面中选择典型;下一步:在上方的系统类型

5、中选择linux,在下方的版本选择中不选择;下一步:在虚拟机名称中输入Fedora-15,下方对话中选择浏览,选择Linux所要安装的文件位置F:osfedora(如果没有请自行建立);下一步:在网络连接设置中选择使用桥接网络;下一步:先输入虚拟磁盘的大小,建议:10GB。完成以上步骤后,我们就回到了最初打开VMware的界面,在左边favourites中出现了我们建立的Fedora-15虚拟机;左键单击Fedora-15,在右侧的设备栏中双击Memory,向右拖动滑动块,使得内存分配大于600m,建议1024m以上,点击ok;在右侧的设备栏中双击CD-ROM,在弹出的窗口中选择使用ISO镜像

6、,点击浏览,找到我们下载的Fedora-15-i686-Live-Desktop.iso镜像文件,点ok。 在左侧的命令栏中点击“启动该虚拟机”,启动Fedora-15.进入漂亮的fedora系统后,我们需要把他从光盘启动安装到硬盘上。首先:点击左上角的Applications-System Tools-Install to HardDrive。下一步:在弹出的键盘语言选择中选择U.S. English。下一步:在安装硬盘选择中选择Basic Storage Devices.下一步:在数据是否保留中选择Yes,discard any data。下一步:在网络主机名名输入一个自己喜欢的ID,譬如

7、:Chaos。下一步:选择自己计算机所在的时域,在图中找到中国上海,shanghai,Asia,单击确定。下一步:设置系统中root用户(管理员)的密码,并重复一次。密码为:000000。在弹出框中点Use Anyway。下一步:在这一步中截图,并逐条解释每一个选项的意思。选项不做改变,点击next。下一步:确认安装,点击Write Change to Disk。在安装完毕后出现的窗口中点击close,在右上角的中选择live system user-Shut Down,然后选择Restart。在Restart后我们进入了我们安装的Fedora的设置界面。WelcomeLicense Info

8、rmation Create User 在这里输入全名 用户名 密码,密码重复两次。(密码为:000000)Date and Time 修改时间 Hardware Profile 上传硬件信息 不做选择点击Finish。在弹出框中选择 No,do not send.稍后,我们键入自己的密码:000000进入了我们安装的Fedora系统。为了记录我们成功的安装,打开Application-System Tools-Add/Remove Software后截图。计算机操作系统实验报告姓名 学号 成绩 年 月 日一、回答问题在LINUX环境下系统设备管理,如何知道本机CPU、内存等系统配置?例如查询

9、显示器、键盘、鼠标等属性磁盘管理,WINDOWS系统分区、LINUX分区各占多大?各分区所在位置? 磁盘文件系统管理,包括WINDOWS文件系统类型、LINUX文件系统类型、LINUX所占三个分区容量和用途、启动挂接点等(4)Fedora或Ubuntu 系统下集成的C/C+语言开发环境是哪个?怎样启动进入和使用? 实验2 Shell基本命令背景知识:ShellShell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命

10、令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。 基本上shell分两大类: 一:图形界面shell(Graphical User Interface shell 即 GUI shell) 例如:应用最为广泛的 Windows Explorer (微软的windows系列制作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manger (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。 二:命令行式shell(Command Line I

11、nterface shell ,即CLI shell) 例如: bash / sh / ksh / csh(Unix/linux 系统) COMMAND.COM(MS-DOS 系统) cmd.exe / 命令提示字符(Windows NT 系统) Windows PowerShell(支援 .NET Framework 技术的 Windows NT 系统) 传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。 文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,

12、向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。 shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。 Shell基本上是一个命令解释器,类似于DOS下的。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。实验目的:通过学习Shel

13、l指令,并成功运行相应指令,来对Shell有个直观的概念。并且熟悉linux关于调用和监测操作系统的重要命令实验要求:学习调用和监测操作系统的重要命令:(1)查看系统硬件配置(2)查看操作系统类型和版本(3)查看软件配置情况(4)监测系统资源使用情况(5)查看文件系统配置情况实验步骤:(1)进入linux。完成要求的操作。(2)记录操作后系统的状态。(3)提交实验报告。计算机操作系统实验报告姓名 学号 成绩 年 月 日一、回答问题(1)查看系统硬件配置(2)查看操作系统类型和版本(3)查看软件配置情况(4)监测系统资源使用情况(5)查看文件系统配置情况(6)简述windos和linux两者sh

14、ell的区别实验3 Shell脚本编程背景知识: 计算机语言是为了各种目的和任务而开发的,一个常见任务就是把各种不同的已有组件连接起来以完成相关任务。大多脚本语言共性是:良好的快速开发,高效率的执行,解释而非编译执行,和其它语言编写的程序组件之间通信功能很强大。 许多脚本语言用来执行一次性任务,尤其是系统管理方面。它可以把服务组件粘合起来,因此被广泛用于GUI创建或者命令行,操作系统通常提供一些默认的脚本语言,即通常所谓shell脚本语言。 脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。 有些脚本是为了特定领域设计的,但通常脚本都可以写更通用的脚本。在大型项目中经常把脚本和其

15、它低级编程语言一起使用,各自发挥优势解决特定问题。脚本经常用于设计互动通信,它有许多可以单独执行的命令,可以做很高级的操作,(如在传统的Unix shell (sh)中,大多操作就是程序本身。) 这些高级命令简化了代码编写过程。诸如内存自动管理和溢出检查等性能问题可以不用考虑。在更低级或非脚本语言中,内存及变量管理和数据结构等耗费人工,为解决一个给定问题需要大量代码,当然这样能够获得更为细致的控制和优化。脚本缺少优化程序以提速或者降低内存的伸缩性。 综上所述,脚本编程速度更快,且脚本文件明显小于如同类C程序文件。这种灵活性是以执行效率为代价的。脚本通常是解释执行的,速度可能很慢,且运行时更耗内

16、存。在很多案例中,如编写一些数十行的小脚本,它所带来的编写优势就远远超过了运行时的劣势,尤其是在当前程序员工资趋高和硬件成本趋低时。 然而,在脚本和传统编程语言之间的界限越来越模糊,尤其是在一系列新语言及其集成畅出现时。在一些脚本语言中,有经验的程序员可以进行大量优化工作。在大多现代系统中通常有多种合适的脚本语言可以选择,所以推荐使用多种语言(包括C或汇编语言)编写一种脚本。在本实验中推荐使用bash shell或者c shell编写程序,当然,我们也欢迎使用其他语言完成实验。参考资料:UNIX系统基础与SHELL编程 ,作者:章卫国, 李爱军,西北工业大学出版社出版。精通UNIX Shell

17、脚本编程,作者:(美)Randal K. Michael,电子工业出版社。中国IT实验室Shell编程: HYPERLINK /List_129.html /List_129.htmlLinux Man Pages: HYPERLINK /man1/bash.1.php /man1/bash.1.php实验目的:复习shell脚本语言编程,并能完成一些相关于操作系统的基础操作。实验要求:使用脚本编程语言调用操作系统共用例程:(1)查看主机名、IP地址(2)创建目录、文件(3)修改目录文件属性(4)基本输入输出实验步骤:(1)进入linux。编写程序完成实验要求。(2)记录程序运行的结果。(3)

18、提交实验报告(截图放在实验报告里)。计算机操作系统实验报告姓名 学号 成绩 年 月 日程序功能程序代码程序结果截图实验4 Linux进程控制背景知识:进程通信:进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行(如Deb

19、ug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通过与内核及其它进程之间的互相通信来协调它们的行为。Linux支持多种进程间通信(IPC)机制,信号和管道是其中的两种。除此之外,Linux还支持System V 的IPC机制(用首次出现的Unix版本命名)。进程间通信有三种 1.发送信号,是同步的,可以带参数,也可以不带参数,如kill或者是sigqueue 2.管道,建立管道进行通讯 3.共享内存,开辟一块内存区域,多个应用程序都可以访问,达到通讯的目的,但是是异步的。进程间通信的部分函数列举其中部分相关于进程的函数:fork,getpid,

20、getppid,system,exec.等 fork():可以建立子进程。函数原型:pid_t fork( void );注: pid_t 是一个宏定义,其实质是定义在#include中的int型,是用来保存进程ID的变量。fork函数会创建一个新的子进程。其子进程会会获得父进程的数据空间与堆栈能资源的副本。并对父进程的环境变量、组代码、用户代码、已打开的文件代码、工作目录和资源限制进行继承。同时需要注意的是,子进程复制父进程的地址空间的内容,因此,子进程有自己的地址空间,父子进程间对于这些存储空间不共享。其返回值将会在父子进程中各返回一次,如果fork失败则会返回-1,将其正确的返回值记录在

21、实验报告中记录。getpid():取得进程识别码。函数原型为pid_t getpid(void),由pid_t记录目前进程的进程识别码。示例:“pid_t p=getpid();”getppid():取得父进程识别码。其与getpid类似。区别在于其返回的是目前进程的父进程识别码。system(string):system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令。exec.():装入并运行其它程序的函数。exec.是一个函数族,这里列出了他的六个函数。int execl(const char *path, cons

22、t char *arg, .);int execlp(const char *file, const char *arg, .);int execle(const char *path, const char *arg, ., char *const envp);int execv(const char *path, char *const argv);int execvp(const char *file, char *const argv);int execve(const char *path, char *const argv, char *const envp);其中,*path说明

23、由路径名指定执行程序,如:execl(“/bin/ls”,)*file说明由文件指定执行程序;其第二个参数以及用省略号表示的其他参数一起组成了该程序执行时的参数表,按照linux中的惯例,参数表的第一项是不带路径的程序文件名。被调用的程序可以访问这个参数表,它相当于shell下的命令行参数。实际上,shell本身对命令的调用也是用exec来实现的。由于参数的个数是任意的,所以需要用一个NULL指针来标记参数表的结尾。下面列举了一个简单的范例:int execl(const char* fullpath, const char* arg, )execl(“/bin/ls”,“ls”,“-l”,N

24、ULL);/如果execl返回,说明其调用失败Perror(“execl failed to run ls”);以上几个函数都是包含在头文件unistd.h中。下面介绍一下wait()函数。其表头文件为 #include #include。wait():原型为pid_t wait (int * status);暂停目前进程的执行,直到有信号来临或者子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status 可以设成NULL。实验目的:理解进

25、程的概念,并通过实验明确程序与进程的区别;通过对于操作系统的交互操作对于并发进程有一个直观的概念;培养在linux系统下关于进程编写程序的能力。实验要求:编写程序:用fork函数由一个父进程生成两个子进程,并屏显三个进程的进程ID。要求父进程创建子进程,在子进程中分别用exec函数与system函数执行“dir -a”。并分析其区别。分析以下代码为什么不是只打出来一句话,而是两句话。 main () pid_tpid;pid=fork();if(pid0)printf(errorinfork!);elseif(pid=0)printf(iamthechildprocess,myprocessi

26、dis%dn,getpid();elseprintf(iamtheparentprocess,myprocessidis%dn,getpid();结果是 rootlocalhostc#./a.out iamthechildprocess,myprocessidis4286iamtheparentprocess,myprocessidis4285编写代码,父进程输出:“father:”后缀pid,子进程输出:“child”,后缀pid;多次运行,并以此解释程序并行原理。实验步骤:(1)进入linux。编写程序完成实验要求。(2)记录程序运行的结果。(3)提交实验报告。计算机操作系统实验报告姓名

27、学号 成绩 年 月 日程序功能程序框图或描述程序代码实验5进程间的通信机制背景知识:进程间通信的定义为了进程相互之间交换数据,引入了进程间通信(IPC )。常用的机制有:共享内存段(shared memory segment)。在内存中划分一段公共区域供多个进程共享,以达到在多进程间快速、大量的共享数据。管道(pipe)是先进先出的单向数据通道,可在相关进程间传递未结构化的数据流。FIFO(即命名管道)是拥有永久名称的管道。除了上述机制之外,还有信号量和消息队列,在本次实验里不做要求:信号量(Semaphore)。允许进程相互同步,主要特点为,避免多个进程共享资源时的冲突。消息队列(Messa

28、ge queue)。在进程间以队列形式异步传递少量数据,例如消息。而在UNIX中也有着面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket 系统调用。我们通常可以称为套接字。套接字(Socket)端口式进程通信方式。类似于插槽,针对客户和服务器模型,客户随即申请一个Socket,系统为之分配一个Socket号,双方根据Socket号进行通信。实验目的:理解进程通信的概念,在前一次学习了相关进程控制函数的基础上,实现进程间的通信。实验要求:编写程序:题目1:使用父进程创建四个子进程,在进程间用pipe函数进行通信。题目2:使用FIFO函数进行通行,由进程A生产数据,由进程B读

29、取数据。题目3:使用管道或者套接字进行通信,编写程序建立四个进程。分别试验三写一读、两写两读情况,多次执行后观察果是否,并对记录的执行结果进行解释。计算机操作系统实验报告姓名 学号 成绩 年 月 日程序功能程序框图或描述程序代码实验6 Linux线程控制背景知识: 线程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之

30、间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,那就是程序本身。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。使用多线程的理由之一是和进程相比,它是一种非常节俭的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种昂贵的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间

31、,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正

32、是编写多线程程序时最需要注意的地方。除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和

33、修改。线程函数进程创建函数创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create()。在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了,这也是线程退出一种方法。所需头文件#include 函数原型int pthread_create (pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg)函数传入值thread:线程标识符attr:线程属性设置(其具体设置参见9.2.3小节),通常取为NULLstart_routin

34、e:线程函数的起始地址,是一个以指向void的指针作为参数和返回值的函数指针arg:传递给start_routine的参数函数返回值成功:0出错:返回错误码进程退出函数线程退出时使用函数pthread_exit,是线程的主动行为。注意进程退出时使用exit函数,线程中用pthread_exit替代exit。所需头文件#include 函数原型void pthread_exit(void *retval)函数传入值retval:线程结束时的返回值,可由其他函数如pthread_join()来获取等待函数(等待一个线程的结束)由于一个进程中的多个线程共享数据段,因此通常在线程退出后,退出线程所占用

35、的资源并不会随线程结束而释放。所有需要pthread_join函数来等待线程结束。类似于wait系统调用。所需头文件#include 函数原型int pthread_join (pthread_t th, void *thread_return)函数传入值th:等待线程的标识符thread_return:用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)函数返回值成功:0出错:返回错误码互斥锁线程控制互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。这个互斥锁只有两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。在同一时刻只能有一个线程掌握某个互斥锁,拥有

36、上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。可以说,这把互斥锁保证让每个线程对共享资源按顺序进行原子操作。互斥锁机制主要包括下面的基本函数。互斥锁初始化:pthread_mutex_init()互斥锁上锁:pthread_mutex_lock()互斥锁判断上锁:pthread_mutex_trylock()互斥锁接锁:pthread_mutex_unlock()消除互斥锁:pthread_mutex_destroy()其中,互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。这3种锁的区别主要在于其他未占有互斥

37、锁的线程在希望得到互斥锁时是否需要阻塞等待。快速锁是指调用线程会阻塞直至拥有互斥锁的线程解锁为止。递归互斥锁能够成功地返回,并且增加调用线程在互斥上加锁的次数,而检错互斥锁则为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。默认属性为快速互斥锁。所需头文件#include 函数原型int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)函数传入值mutex:互斥锁MutexattrPTHREAD_MUTEX_INITIALIZER:创建快速互斥锁PTHREAD_RECURSI

38、VE_MUTEX_INITIALIZER_NP:创建递归互斥锁PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁函数返回值成功:0出错:返回错误码所需头文件#include 函数原型int pthread_mutex_lock(pthread_mutex_t *mutex,)int pthread_mutex_trylock(pthread_mutex_t *mutex,)int pthread_mutex_unlock(pthread_mutex_t *mutex,)int pthread_mutex_destroy(pthread_mutex_t

39、 *mutex,)函数传入值mutex:互斥锁函数返回值成功:0出错:1信号量线程控制信号量也就是操作系统中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。这里先来简单复习一下PV原子操作的工作原理。PV原子操作是对整数计数器信号量sem的操作。一次P操作使sem减一,而一次V操作使sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止。PV原子操作主要用于进程或线程间的同步和互斥这两种典型情况。Linux实现了POSIX的无名信号量,主要用于线程间的互斥与同步。这里主要介绍几个常见函数。sem_init()用于创建一个信号量,并初始化它的值。sem_wait()和sem_trywait()都相当于P操作,在信号量大于零时它们都能将信号量的值减一,两者的区别在于若信号量小于零时,sem_wait()将会阻塞进程,而sem_trywait()则会立即返回。sem_post()相当于V操作,它将信号量的值加一同时发出信号来唤醒等待的进程。sem_getv

温馨提示

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

评论

0/150

提交评论