操作系统进程同步互斥实验

合集下载

实验、进程的同步与互斥——生产者消费者

实验、进程的同步与互斥——生产者消费者

实验、进程的同步与互斥——⽣产者消费者1. 1. 实验⽬的两个或两个以上的进程,不能同时进⼊关于同⼀组共享变量的临界区域,否则可能发⽣与时间有关的错误,这种现象被称作进程互斥。

对CPU的速度和数⽬不做出任何假设的前提下,并发进程互斥访问临界资源,是⼀个较好的解决⽅案。

另外,还需要解决异步环境下的进程同步问题。

所谓异步环境是指:相互合作的⼀组并发进程,其中每⼀个进程都以各⾃独⽴的、不可预知的速度向前推进;但它们⼜需要密切合作,以实现⼀个共同的任务,即彼此“知道”相互的存在和作⽤。

实验⽬的:分析进程争⽤资源的现象,学习解决进程同步与互斥的⽅法。

本实验属于设计型实验,实验者可根据⾃⾝情况选⽤合适的开发环境和程序架构。

1. 2. 实验原理信号量的PV操作与处理相关,P表⽰通过的意思,V表⽰释放的意思。

1962年,狄克斯特拉离开数学中⼼进⼊位于荷兰南部的艾恩德霍芬技术⼤学(Eindhoven Technical University)任数学教授。

在这⾥,他参加了X8计算机的开发,设计与实现了具有多道程序运⾏能⼒的操作系统——THE Multiprogramming System。

THE是艾恩德霍芬技术⼤学的荷兰⽂Tchnische Hoogeschool Eindhov –en的词头缩写。

狄克斯特拉在THE这个系统中所提出的⼀系统⽅法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样⼀些重要的思想和概念都是狄克斯特拉在THE中⾸先提出并为以后的操作系统如UNIX等所采⽤的。

为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运⾏”(running)和“阻塞”(blocking)三个⼯作状态。

由于在任⼀时刻最多只有⼀个进程可以使⽤处理机,正占⽤着处理机的进程称为“运⾏”进程。

当某进程已具备了使⽤处理机的条件,⽽当前⼜没有处理机供其使⽤,则使该进程处于“就绪”状态。

进程的同步与互斥实验报告

进程的同步与互斥实验报告

进程的同步与互斥实验报告1.实验目的进程(线程)的同步与互斥是操作系统中非常重要的概念,本实验旨在通过实际操作,加深对这些概念的理解和掌握。

通过编写多个进程(线程),并在其间进行同步与互斥操作,验证同步与互斥的实际效果。

2.实验环境本实验在Linux系统下进行,使用C/C++语言编程。

3.实验内容3.1同步在实验中,我们编写了两个进程A和B,这两个进程需要按照特定的顺序执行。

为了实现同步,我们使用信号量机制来确保进程A和B按照正确的顺序执行。

3.2互斥在实验中,我们编写了多个进程C和D,这些进程需要同时对一个共享资源进行访问。

为了实现互斥,我们使用互斥锁机制来确保同一时刻只有一个进程访问共享资源。

4.实验过程4.1同步实验编写进程A和进程B的代码,使用信号量机制实现同步。

进程A先运行,然后通过信号量唤醒进程B,进程B再开始执行。

通过观察进程的运行顺序,验证同步机制是否起作用。

4.2互斥实验编写进程C和进程D的代码,使用互斥锁机制实现互斥。

进程C和进程D同时对一个共享资源进行访问,通过互斥锁来确保同一时刻只有一个进程访问共享资源。

观察进程的输出结果,验证互斥机制是否起作用。

5.实验结果5.1同步实验结果进程A开始执行进程A执行完毕进程B开始执行进程B执行完毕5.2互斥实验结果进程C开始执行进程C访问共享资源进程C执行完毕进程D开始执行进程D访问共享资源进程D执行完毕6.实验分析通过上述结果可以看出,同步实验中进程A和进程B按照正确的顺序执行,证明了同步机制的有效性。

互斥实验中进程C和进程D能够正确地交替访问共享资源,证明了互斥机制的有效性。

7.实验总结通过本次实验,我深刻理解了进程(线程)的同步与互斥,并通过实际操作加深了对这些概念的理解。

同步和互斥是操作系统中非常重要的概念,对于应对资源竞争和提高程序性能具有重要意义。

在实际开发中,我们应该合理使用同步和互斥机制,以确保程序的正确性和并发执行的效率。

《操作系统》实验报告

《操作系统》实验报告

一、实验目的1. 理解进程的概念及其在操作系统中的作用。

2. 掌握进程的创建、调度、同步和通信机制。

3. 学习使用进程管理工具进行进程操作。

4. 提高对操作系统进程管理的理解和应用能力。

二、实验环境1. 操作系统:Windows 102. 软件环境:Visual Studio 20193. 实验工具:C++语言、进程管理工具(如Task Manager)三、实验内容1. 进程的创建与销毁2. 进程的调度策略3. 进程的同步与互斥4. 进程的通信机制四、实验步骤1. 进程的创建与销毁(1)创建进程使用C++语言编写一个简单的程序,创建一个新的进程。

程序如下:```cpp#include <iostream>#include <windows.h>int main() {// 创建进程STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));// 创建进程if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {std::cout << "创建进程失败" << std::endl;return 1;}std::cout << "进程创建成功" << std::endl;// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 销毁进程CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}```(2)销毁进程在上面的程序中,通过调用`WaitForSingleObject(pi.hProcess, INFINITE)`函数等待进程结束,然后使用`CloseHandle(pi.hProcess)`和`CloseHandle(pi.hThread)`函数销毁进程。

进程同步实验报告

进程同步实验报告

一、实验目的1. 理解进程同步的概念和原理;2. 掌握进程同步的基本方法和机制;3. 学会使用信号量实现进程同步;4. 通过实验验证进程同步机制的有效性。

二、实验原理1. 进程同步:在多道程序设计中,进程的执行是并发的,但某些情况下需要保证多个进程按照一定的顺序执行,以避免出现数据不一致、死锁等问题。

进程同步是指通过某种机制,协调多个进程的执行顺序,保证它们能够正确、有效地共享资源。

2. 信号量:信号量是一种特殊的变量,用于实现进程同步。

信号量具有两个原子操作:P操作(wait)和V操作(signal)。

P操作用于申请资源,V操作用于释放资源。

3. 互斥锁:互斥锁是一种常见的进程同步机制,用于保证临界资源的互斥访问。

当一个进程进入临界区时,它会尝试获取互斥锁,如果锁已被其他进程获取,则该进程进入等待状态;当进程退出临界区时,它会释放互斥锁。

三、实验内容1. 实验环境:Linux操作系统,C语言编程环境。

2. 实验工具:gcc编译器、gdb调试器。

3. 实验步骤:(1)创建一个互斥锁,用于保护临界资源。

(2)编写两个进程,分别模拟对临界资源的访问。

(3)在进程访问临界资源前,使用P操作尝试获取互斥锁。

(4)在进程访问临界资源后,使用V操作释放互斥锁。

(5)编译并运行程序,观察进程执行情况。

四、实验结果与分析1. 实验结果:(1)在互斥锁的保护下,两个进程能够按照预期顺序访问临界资源。

(2)当其中一个进程正在访问临界资源时,另一个进程会进入等待状态。

(3)当进程访问临界资源完成后,它会释放互斥锁,允许其他进程访问。

2. 实验分析:(1)互斥锁能够有效地保护临界资源,避免数据不一致问题。

(2)信号量P操作和V操作保证了进程的同步,避免了死锁现象。

(3)通过实验验证了进程同步机制的有效性。

五、实验总结本次实验通过使用信号量和互斥锁,实现了进程同步。

实验结果表明,信号量和互斥锁能够有效地保证进程按照预期顺序执行,避免数据不一致和死锁等问题。

操作系统实验报告九

操作系统实验报告九

操作系统实验报告九一、实验目的本次操作系统实验的目的是深入了解和掌握操作系统中的进程管理、内存管理、文件系统等核心概念和技术,并通过实际的实验操作,提高对操作系统原理的理解和应用能力。

二、实验环境本次实验使用的操作系统为 Windows 10,开发工具为 Visual Studio 2019,编程语言为 C++。

三、实验内容及步骤(一)进程管理实验1、创建进程使用 Windows API 函数 CreateProcess 来创建一个新的进程。

观察新进程的创建过程和相关的系统资源分配。

2、进程同步与互斥使用互斥量(Mutex)和信号量(Semaphore)来实现进程之间的同步和互斥操作。

编写多个进程,模拟对共享资源的并发访问,并通过同步机制来保证数据的一致性和正确性。

(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 来进行内存的动态分配和释放。

观察内存分配和释放过程中的内存状态变化。

2、内存页面置换算法实现简单的内存页面置换算法,如先进先出(FIFO)算法和最近最少使用(LRU)算法。

通过模拟内存访问过程,比较不同算法的性能和效率。

(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等来进行文件的创建、读取和写入操作。

观察文件操作过程中的系统调用和文件系统的响应。

2、文件目录管理实现对文件目录的创建、删除、遍历等操作。

了解文件目录结构和文件系统的组织方式。

四、实验结果与分析(一)进程管理实验结果1、创建进程成功创建新的进程,并观察到新进程在任务管理器中的出现和相关的资源占用情况。

2、进程同步与互斥通过互斥量和信号量的使用,有效地实现了进程之间的同步和互斥操作,避免了对共享资源的并发访问冲突,保证了数据的正确性。

(二)内存管理实验结果1、内存分配与释放能够成功地进行内存的动态分配和释放,观察到内存地址的变化和内存使用情况的更新。

实验四同步与互斥Linux实验报告

实验四同步与互斥Linux实验报告

实验四同步与互斥【实验目的和要求】1、掌握进程(线程)的同步与互斥。

2、掌握生产者消费者问题的实现方法。

3、掌握多线程编程方法。

【实验内容】实现生产者消费者问题1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。

2、仓库中每次只能入一个(生产者或消费者)。

3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。

4、当仓库空时,消费者不能从中取出产品。

5、生产、消费速度不同。

【实验原理】1、信号量mutex提供对缓冲池访问的互斥要求并初始化为1,信号量empty和full分别用来表示空缓冲项和满缓冲项的个数,信号量empty初始化为n,信号量full初始化为0。

2、定义如下结构及数据:定义缓冲区内的数据类型:typedef int buffer_item;缓冲区:buffer_item buffer[BUFFER_SIZE];对缓冲区操作的变量:int in,out;信号量mutex提供了对缓冲池访问的互斥要求:pthread_mutex_t mutex;信号量empty和full分别表示空缓冲顶和满缓冲顶的个数:sem_t empty,full; 可以设定生产者的生产速度及消费者的消费速度:int pro_speed,con_speed;对缓冲区操作的自增函数:#define inc(k) if(k < BUFFER_SIZE) k = k+1;else k=03、并定义了如下实现问题的函数模块:将生产的产品放入缓冲区: int insert_item(buffer_item item)从缓冲区内移走一个产品: int remove_item(buffer_item *item)生产者进程:void *producer(void *param)消费者进程:void *consumer(void *param)生产者结构进程消费者结构进程【程序代码】//sx.c#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#include<time.h>#define inc(k) if(k<BUFFER_SIZE) k=k+1;else k=0#define BUFFER_SIZE 10//缓冲区的大小typedef int buffer_item;//定义缓冲区内的数据类型buffer_item buffer[BUFFER_SIZE];//缓冲区int in,out;//对缓冲区操作的变量pthread_mutex_t mutex;//信号量mutex提供了对缓冲池访问的互斥要求sem_t empty,full;//信号量empty和full分别表示空缓冲顶和满缓冲顶的个数int pro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度int insert_item(buffer_item item){//将生产的产品放入缓冲区buffer[in]=item;printf("******insert缓冲池第%d号******\n",in);inc(in);}int remove_item(buffer_item *item){//从缓冲区内移走一个产品*item = buffer[out];printf("******remove缓冲池第%d号******\n",out);inc(out);}void *producer(void *param){//生产者进程buffer_item item;int num = 0;while(1){sleep(rand()%(16-pro_speed));printf("\n******第%d次生产******\n",++num);printf("******等待empty信号******\n");sem_wait(&empty);printf("******等待解锁******\n");pthread_mutex_lock(&mutex);printf("******上锁,准备生产******\n");item = rand()%1000+1;printf("******生产产品%d*******\n",item);insert_item(item);printf("*******解锁******\n");printf("******第%d次生产结束*******\n\n",num); pthread_mutex_unlock(&mutex);sem_post(&full);}}void *consumer(void *param){//消费者进程buffer_item item;int num = 0;while(1){sleep(rand()%(16-con_speed));printf("\n******第%d次消费*****\n",++num); printf("******等待full信号******\n");sem_wait(&full);printf("******等待解锁******\n");pthread_mutex_lock(&mutex);printf("******上锁,准备消费******\n"); remove_item(&item);pthread_mutex_unlock(&mutex);sem_post(&empty);printf("******消费产品%d*******\n",item);printf("*******解锁******\n");printf("******第%d次消费结束*******\n\n",num); }}int main()//主函数{pthread_t tid1,tid2;pthread_attr_t attr1,attr2;srand(time(NULL));pthread_mutex_init(&mutex,NULL);//初始化sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);in=0;out=0;printf("***********************\n");printf("********开始!***********\n");printf("***********************\n");printf("生产者速度(1-15):\n");scanf("%d",&pro_speed);printf("消费者速度(1-15):\n");scanf("%d",&con_speed);pthread_attr_init(&attr1);pthread_create(&tid1,&attr1,producer,NULL);pthread_attr_init(&attr2);pthread_create(&tid2,&attr2,consumer,NULL);sleep(100);printf("*******程序over*******\n");return 0;}【实验步骤】编写程序代码gedit sx.c,再对代码进行编译gcc sx.c –o sx –lpthread,编译无错误,进行运行./sx,根据提示要求进行填写生产者和消费速度,观察消费者和生产者进程。

进程同步实验报告

进程同步实验报告

中北大学软件学院实验报告专 业: 软件工程方 向: 软件开发与测试课程名称: 操作系统班 级:学 号:姓 名:辅导教师:2017年9月制成绩:实验时间2017年11月5日8时至10时学时数22学时1.实验名称进程同步2.实验内容编程实现生产者-消费者问题的模拟。

3.基本要求1.生产者消费者对缓冲区进行互斥操作。

2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。

3. 生产者消费者各循环操作10次。

4. 实验原理或流程图生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。

在同一个进程地址空间内执行的两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

5.源程序#i n c l u d e<s t d i o.h>#i n c l u d e<p t h r e a d.h>#i n c l u d e<s e m a p h o r e.h>#i n c l u d e<u n i s t d.h>v o i d*p r o d u c t e r_f(v o i d*a r g);v o i d*c o n s u m e r_f(v o i d*a r g);s e m_t e m p t y;//信号量e m p t ys e m_t f u l l;//信号量f u l li n t r u n n i n g=1;i n t a p p l e_n u m=0;i n t m a i n(v o i d){p t h r e a d_t c o n s u m e r_t;//消费者p t h r e a d_t p r o d u c t e r_t;//生产者//p s h a r e d表示信号量共享类型, 为0时,表示只能在当前进程的//多个线程之间共享,不为0时,是可以和其他进程间共享该信号量//使用信号量,用来协作生产者和消费者的顺序,即实现同步效果s e m_i n i t(&e m p t y,0,1);//初始化e m p t y信号量s e m_i n i t(&f u l l,0,0);//初始化f u l l信号量p t h r e a d_c r e a t e(&c o n s u m e r_t,N U L L,c o n s u m e r_f,(v o i d*)&r u n n i n g); //创建消费者线程p t h r e a d_c r e a t e(&p r o d u c t e r_t,N U L L,p r o d u c t e r_f,(v o i d*)&r u n n i n g);//创建生产者线程//s l e e p(1);//睡眠3秒u s l e e p(1000);//睡眠10微秒r u n n i n g=0;p t h r e a d_j o i n(c o n s u m e r_t,N U L L);p t h r e a d_j o i n(p r o d u c t e r_t,N U L L);s e m_d e s t r o y(&e m p t y);s e m_d e s t r o y(&f u l l);r e t u r n0;}v o i d*p r o d u c t e r_f(v o i d*a r g){w h i l e(*(i n t*)a r g){s e m_w a i t(&e m p t y);a p p l e_n u m++;p r i n t f("p r o d u c t e r生产第%d个香蕉\n",a p p l e_n u m);s e m_p o s t(&f u l l);u s l e e p(1);}}v o i d*c o n s u m e r_f(v o i d*a r g){w h i l e(*(i n t*)a r g){s e m_w a i t(&f u l l);p r i n t f("c o n s u m e r消费第%d个香蕉\n",a p p l e_n u m);s e m_p o s t(&e m p t y);u s l e e p(1);}}6.运行截图7.实验心得本次实验学习了进程的同步问题,进程是计算机操作系统重要的一个功能,学好进程才能学好其他。

操作系统实验报告——进程同步与互斥

操作系统实验报告——进程同步与互斥

操作系统实验报告——进程同步与互斥一、实验内容本实验主要内容是通过编写程序来实现进程的同步与互斥。

具体来说,是通过使用信号量来实现不同进程之间的同步和互斥。

我们将编写两个进程,一个进程负责打印奇数,另一个进程负责打印偶数,两个进程交替打印,要求打印的数字从1开始,直到100结束。

二、实验原理进程的同步是指多个进程之间按照一定的顺序执行,进程之间互相等待的关系。

而进程的互斥是指多个进程竞争同一个资源,需要通过其中一种方式来避免同时访问共享资源,以免造成数据错乱。

在本实验中,我们使用信号量来实现进程的同步与互斥。

信号量是一个计数器,用于表示一些共享资源的可用数量。

进程在访问共享资源时,需要先对信号量进行操作,当信号量大于0时,表示资源可用,进程可以访问;当信号量等于0时,表示资源不可用,进程需要等待。

进程同步的实现可以通过信号量的P操作与V操作来完成。

P操作用于申请资源,当资源可用时,将计数器减一,并进入临界区;V操作用于释放资源,当资源使用完毕时,将计数器加一,使等待资源的进程能够申请。

进程互斥的实现可以通过信号量的P操作与V操作结合临界区来完成。

当多个进程需要访问共享资源时,需要先进行P操作,进入临界区,访问完毕后进行V操作,离开临界区。

三、实验步骤1.首先,我们需要创建两个进程,一个进程负责打印奇数,另一个进程负责打印偶数。

2. 然后,我们创建一个共享变量count,用来记录打印的数字。

3. 接着,我们创建两个信号量odd和even,用来控制进程的同步与互斥。

odd信号量初始值为1,表示打印奇数的进程可以访问;even信号量初始值为0,表示打印偶数的进程需要等待。

4.编写奇数打印进程的代码,首先进行P操作,判断奇数信号量是否大于0,如果大于0,表示可以打印奇数。

5. 如果可以打印奇数,将count加一,并输出当前的奇数,然后进行V操作,释放偶数打印进程的等待。

6.同样的,编写偶数打印进程的代码,首先进行P操作,判断偶数信号量是否大于0,如果大于0,表示可以打印偶数。

操作系统进程管理实验报告

操作系统进程管理实验报告

操作系统进程管理实验报告操作系统进程管理实验报告引言:操作系统是计算机系统中最核心的软件之一,它负责管理计算机硬件和软件资源,提供良好的用户体验和高效的计算服务。

其中,进程管理是操作系统的重要功能之一,它负责管理和调度计算机中的各个进程,确保它们能够有序地运行,并且能够合理地利用计算机资源。

本实验旨在通过实际操作,深入了解操作系统的进程管理机制,并通过编写简单的进程管理程序,加深对进程管理的理解。

一、实验目的本实验的主要目的是通过编写简单的进程管理程序,加深对操作系统进程管理机制的理解。

具体来说,我们将实现以下功能:1. 创建进程:能够创建新的进程,并为其分配资源。

2. 进程调度:能够根据进程的优先级和调度算法,合理地调度进程的执行顺序。

3. 进程同步:能够实现进程间的同步与互斥,避免资源竞争和死锁问题。

二、实验环境和工具本实验使用的实验环境和工具如下:1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验过程和结果1. 进程创建在实验中,我们首先实现了进程的创建功能。

通过调用操作系统提供的系统调用接口,我们能够创建新的进程,并为其分配资源。

具体的实现过程涉及到进程控制块(PCB)的创建和初始化,以及资源的分配和管理。

通过编写测试程序,我们成功创建了多个进程,并验证了进程创建功能的正确性。

2. 进程调度进程调度是操作系统中非常重要的功能之一,它决定了进程的执行顺序和时间片的分配。

在实验中,我们实现了简单的进程调度算法,采用了轮转调度算法。

通过设计合适的数据结构和算法,我们能够按照一定的优先级和时间片大小,合理地安排进程的执行顺序。

通过编写测试程序,我们验证了进程调度功能的正确性。

3. 进程同步在多进程环境下,进程间的同步与互斥是非常重要的问题。

在实验中,我们实现了进程同步功能,通过使用信号量和互斥锁,实现了进程间的同步与互斥。

通过编写测试程序,我们验证了进程同步功能的正确性,并且能够避免资源竞争和死锁问题。

操作系统实验之进程管理实验报告

操作系统实验之进程管理实验报告

操作系统实验之进程管理实验报告一、实验目的本次操作系统实验的主要目的是深入理解进程管理的概念和原理,通过实际操作和观察,掌握进程的创建、调度、同步与互斥等关键机制。

二、实验环境本次实验使用的操作系统为 Windows 10,开发工具为 Visual Studio 2019,编程语言为 C++。

三、实验内容1、进程创建使用系统提供的 API 函数创建新的进程。

观察新进程的资源使用情况和运行状态。

2、进程调度编写程序模拟不同的进程调度算法,如先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)。

比较不同调度算法下的平均周转时间、平均等待时间等性能指标。

3、进程同步与互斥利用信号量、互斥锁等机制实现进程之间的同步与互斥。

设计并发程序,解决生产者消费者问题、读写者问题等经典同步问题。

四、实验步骤1、进程创建实验首先,包含所需的头文件,如`<windowsh>`。

然后,定义创建进程的函数,使用`CreateProcess` 函数创建新进程,并获取进程的相关信息,如进程标识符、线程标识符等。

最后,通过查看任务管理器或其他系统工具,观察新创建进程的资源占用情况。

2、进程调度实验设计不同的调度算法函数,如`FCFSSchedule`、`SJFSchedule` 和`RRSchedule`。

在每个调度算法函数中,模拟进程的到达时间、服务时间等参数,并按照相应的算法进行进程调度。

计算每个进程的周转时间和等待时间,并求出平均周转时间和平均等待时间。

3、进程同步与互斥实验定义信号量或互斥锁变量。

在生产者消费者问题中,生产者在生产产品时获取互斥锁,生产完成后释放互斥锁并通知消费者;消费者在消费产品时获取互斥锁,消费完成后释放互斥锁。

在读写者问题中,读者在读取数据时获取共享锁,读完后释放共享锁;写者在写入数据时获取独占锁,写入完成后释放独占锁。

五、实验结果与分析1、进程创建实验结果成功创建新的进程,并能够获取到进程的相关信息。

进程互斥实验报告

进程互斥实验报告

一、实验目的1. 理解进程互斥的概念和意义。

2. 掌握进程互斥的实现方法。

3. 熟练运用信号量机制解决进程互斥问题。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 进程互斥的概念进程互斥是指两个或多个进程不能同时进入关于同一组共享变量的临界区域。

如果多个进程同时访问临界资源,可能会导致数据不一致或程序错误。

因此,进程互斥是操作系统中的一个重要概念。

2. 进程互斥的实现方法(1)软件方法:通过程序设计实现进程互斥,如使用锁(Lock)机制、信号量(Semaphore)机制等。

(2)硬件方法:利用处理器提供的特殊指令实现进程互斥,如Test-and-Set指令。

3. 信号量机制信号量是一种整数变量,用于实现进程同步和互斥。

信号量有三种操作:P操作(等待)、V操作(信号)和初始化。

(1)P操作:当进程需要访问临界资源时,先执行P操作。

如果信号量的值大于0,则将其减1,进程继续执行;如果信号量的值等于0,则进程进入阻塞状态,等待其他进程释放信号量。

(2)V操作:当进程访问完临界资源后,执行V操作。

如果此时有其他进程因P操作而阻塞,则将其唤醒,继续执行。

(3)初始化:将信号量的值设置为1,表示临界资源可用。

4. 实验步骤(1)创建一个信号量对象。

(2)在访问临界资源前,执行P操作。

(3)访问临界资源。

(4)访问完成后,执行V操作。

(5)重复步骤(2)至(4)。

5. 实验程序以下是一个使用信号量实现进程互斥的示例程序:```cpp#include <iostream>#include <thread>#include <semaphore.h>// 创建信号量sem_t sem;// 访问临界资源的函数void accessResource() {// 执行P操作sem_wait(&sem);// 访问临界资源std::cout << "进程 " << std::this_thread::get_id() << " 正在访问临界资源" << std::endl;// 执行V操作sem_post(&sem);}int main() {// 初始化信号量sem_init(&sem, 0, 1);// 创建多个线程std::thread t1(accessResource);std::thread t2(accessResource);std::thread t3(accessResource);// 等待线程结束t1.join();t2.join();t3.join();// 销毁信号量sem_destroy(&sem);return 0;}```6. 实验结果与分析通过运行实验程序,可以观察到多个线程交替访问临界资源,实现了进程互斥。

操作系统实验报告三

操作系统实验报告三

操作系统实验报告三一、实验目的本次操作系统实验的目的在于深入了解操作系统的进程管理、内存管理和文件系统等核心功能,通过实际操作和观察,增强对操作系统原理的理解和掌握,提高解决实际问题的能力。

二、实验环境本次实验在 Windows 10 操作系统环境下进行,使用了 Visual Studio 2019 作为编程工具,并借助了相关的操作系统模拟软件和调试工具。

三、实验内容与步骤(一)进程管理实验1、创建多个进程使用 C++语言编写程序,通过调用系统函数创建多个进程。

观察每个进程的运行状态和资源占用情况。

2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。

分析在不同并发情况下程序的执行结果,理解进程同步的重要性。

(二)内存管理实验1、内存分配与回收实现一个简单的内存分配算法,如首次适应算法、最佳适应算法或最坏适应算法。

模拟内存的分配和回收过程,观察内存的使用情况和碎片产生的情况。

2、虚拟内存管理了解 Windows 操作系统的虚拟内存机制,通过查看系统性能监视器观察虚拟内存的使用情况。

编写程序来模拟虚拟内存的页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等。

(三)文件系统实验1、文件操作使用 C++语言对文件进行创建、读写、删除等操作。

观察文件在磁盘上的存储方式和文件目录的结构。

2、文件系统性能测试对不同大小和类型的文件进行读写操作,测量文件系统的读写性能。

分析影响文件系统性能的因素,如磁盘碎片、缓存机制等。

四、实验结果与分析(一)进程管理实验结果1、创建多个进程在创建多个进程的实验中,通过任务管理器可以观察到每个进程都有独立的进程 ID、CPU 使用率、内存占用等信息。

多个进程可以并发执行,提高了系统的资源利用率。

2、进程同步与互斥在生产者消费者问题的实验中,当使用正确的信号量机制时,生产者和消费者能够协调工作,不会出现数据不一致或死锁的情况。

操作系统实验4-4实验报告

操作系统实验4-4实验报告

操作系统实验4-4实验报告一、实验目的本次操作系统实验 4-4 的目的是深入了解和掌握操作系统中进程管理的相关知识和技术,通过实际操作和观察,加深对进程调度算法、进程同步与互斥等概念的理解,并提高解决实际问题的能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。

三、实验内容1、进程调度算法的实现先来先服务(FCFS)算法短作业优先(SJF)算法时间片轮转(RR)算法优先级调度算法2、进程同步与互斥的实现使用信号量实现生产者消费者问题使用互斥锁实现哲学家进餐问题四、实验步骤1、进程调度算法的实现先来先服务(FCFS)算法设计数据结构来表示进程,包括进程ID、到达时间、服务时间等。

按照进程到达的先后顺序将它们放入就绪队列。

从就绪队列中选择第一个进程进行处理,计算其完成时间、周转时间和带权周转时间。

短作业优先(SJF)算法在设计的数据结构中增加作业长度的字段。

每次从就绪队列中选择服务时间最短的进程进行处理。

计算相关的时间指标。

时间片轮转(RR)算法设定时间片的大小。

将就绪进程按照到达时间的先后顺序放入队列。

每个进程每次获得一个时间片的执行时间,若未完成则重新放入队列末尾。

优先级调度算法为每个进程设置优先级。

按照优先级的高低从就绪队列中选择进程执行。

2、进程同步与互斥的实现生产者消费者问题创建一个共享缓冲区。

生产者进程负责向缓冲区中生产数据,消费者进程从缓冲区中消费数据。

使用信号量来控制缓冲区的满和空状态,实现进程的同步。

哲学家进餐问题模拟多个哲学家围绕一张圆桌进餐的场景。

每个哲学家需要同时获取左右两边的筷子才能进餐。

使用互斥锁来保证筷子的互斥访问,避免死锁的发生。

五、实验结果与分析1、进程调度算法的结果与分析先来先服务(FCFS)算法优点:实现简单,公平对待每个进程。

缺点:对短作业不利,平均周转时间可能较长。

短作业优先(SJF)算法优点:能有效降低平均周转时间,提高系统的吞吐量。

操作系统进程同步实验报告

操作系统进程同步实验报告

实验三:进程同步实验一、实验任务:(1)掌握操作系统的进程同步原理;(2)熟悉linux的进程同步原语;(3)设计程序,实现经典进程同步问题。

二、实验原理:(1)P、V操作PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:P(S):①将信号量S的值减1,即S=S-1;②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

(2)信号量信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。

信号量的值与相应资源的使用情况有关。

当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。

注意,信号量的值仅能由PV操作来改变。

一般来说,信号量S³0时,S表示可用资源的数量。

执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。

而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S£0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

(3)linux的进程同步原语①wait();阻塞父进程,子进程执行;②#include <sys/types.h>#include <sys/ipc.h>key_t ftok (char*pathname, char proj);它返回与路径pathname相对应的一个键值。

③int semget(key_t key, int nsems, int semflg)参数key是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key 相同;参数nsems指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数是一些标志位。

实验一、二(OS)

实验一、二(OS)

实验一进程同步和互斥(建议4学时)一、实验目的1.掌握临界资源、临界区概念及并发进程互斥、同步访问原理。

2.学会使用高级语言进行多线程编程的方法。

3.掌握利用VC++或Java语言线程库实现线程的互斥、条件竞争,并编码实现P、V 操作,利用P、V操作实现两个并发线程对有界临界区的同步访问。

4.通过该实验,学生可在源代码级完成进程同步互斥方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。

二、实验要求1.知识基础:学生应在完成进程和线程及调度等章节的学习后进行。

2.开发环境与工具:硬件平台——个人计算机。

软件平台-Windows操作系统,vc++语言或Java语言开发环境。

3.运用高级语言VC++或Java语言线程库及多线程编程技术进行设计实现。

三、实验内容1.实现临界资源、临界区、进程或线程的定义与创建。

2.利用两个并发运行的进程,实现互斥算法和有界缓冲区同步算法。

四、实验方案指导该实验方案由以下几个关键设计项目组成:1.并发访问出错。

即设计一个共享资源,创建两个并发线程,二者并发访问该共享资源。

当没有采用同步算法设计时,线程所要完成的某些操作会丢失。

2.互斥锁。

并发线程使用线程库提供的互斥锁,对共享资源进行访问。

3.软件方法。

设计并编程实现计数信号量、P操作函数、V操作函数,并发线程通过调用P,V操作函数实现线程的互斥。

4.同步访问多缓冲区。

利用上面的软件方法完成P,V操作,可实现两个线程对多缓冲区的同步访问。

五、实验方案实现范例以下是对该项目中包含的部分设计功能的实现方法、实现过程、技术手段的描述,供师生参考。

1.模拟线程并发运行。

假设我们使用POSIX线程库,而POSIX并没有真正提供线程间的并发运行需求。

我们设计的系统应支持符合RR调度策略的并发线程,每个线程运行一段时间后自动挂起,另一个线程开始运行。

这样一个进程内所有线程以不确定的速度并发执行。

2.模拟一个竞争条件——全局变量。

操作系统课程实验报告

操作系统课程实验报告

操作系统课程实验报告一、实验目的操作系统是计算机系统中最为关键的软件之一,它负责管理计算机的硬件资源和软件资源,为用户提供一个良好的工作环境。

通过操作系统课程实验,旨在深入理解操作系统的基本原理和功能,提高对操作系统的实际操作能力和问题解决能力。

二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 1804),开发工具包括 Visual Studio Code、gcc 编译器等。

三、实验内容(一)进程管理1、进程创建与终止在 Windows 系统中,使用 C++语言创建多个进程,并通过进程句柄控制进程的终止。

在 Linux 系统中,使用 fork()系统调用创建子进程,并通过 exit()函数终止进程。

2、进程同步与互斥使用信号量实现进程之间的同步与互斥。

在 Windows 中,利用CreateSemaphore()和 WaitForSingleObject()等函数进行操作;在Linux 中,通过 sem_init()、sem_wait()和 sem_post()等函数实现。

(二)内存管理1、内存分配与释放在 Windows 中,使用 HeapAlloc()和 HeapFree()函数进行动态内存的分配与释放。

在 Linux 中,使用 malloc()和 free()函数完成相同的操作。

2、内存页面置换算法实现了几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等,并比较它们的性能。

(三)文件系统管理1、文件创建与读写在 Windows 和 Linux 系统中,分别使用相应的 API 和系统调用创建文件,并进行读写操作。

2、目录操作实现了目录的创建、删除、遍历等功能。

四、实验步骤(一)进程管理实验1、进程创建与终止(1)在 Windows 系统中,编写 C++程序,使用 CreateProcess()函数创建新进程,并通过 TerminateProcess()函数终止指定进程。

进程管理_实验报告

进程管理_实验报告

一、实验目的1. 理解Linux操作系统中进程的概念,明确进程与程序的区别。

2. 掌握Linux下进程的创建、调度、同步与通信等基本操作。

3. 学会使用Linux命令查看和管理进程。

二、实验环境1. 操作系统:Linux2. 编程语言:C/C++3. 开发工具:gcc、gdb三、实验内容1. 进程创建与调度2. 进程同步与互斥3. 进程通信4. 进程控制四、实验步骤1. 进程创建与调度(1)编写一个C程序,创建一个子进程,并在父进程中打印出子进程的进程标识符(PID)。

```c#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main() {pid_t pid;pid = fork(); // 创建子进程if (pid == 0) { // 子进程printf("子进程的PID:%d\n", getpid());} else if (pid > 0) { // 父进程printf("父进程的PID:%d,子进程的PID:%d\n", getpid(), pid); } else {printf("创建子进程失败\n");}return 0;}```(2)编译并运行程序,观察结果。

2. 进程同步与互斥(1)编写一个C程序,使用互斥锁(mutex)实现两个进程的同步。

```c#include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_mutex_t mutex;void thread_func(void arg) {pthread_mutex_lock(&mutex); // 获取互斥锁printf("线程 %ld 获取了互斥锁\n", pthread_self());sleep(1);pthread_mutex_unlock(&mutex); // 释放互斥锁return NULL;}int main() {pthread_t thread1, thread2;pthread_mutex_init(&mutex, NULL); // 初始化互斥锁pthread_create(&thread1, NULL, thread_func, (void )1);pthread_create(&thread2, NULL, thread_func, (void )2);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_mutex_destroy(&mutex); // 销毁互斥锁return 0;}```(2)编译并运行程序,观察结果。

操作系统进程同步与互斥实验报告0204192337

操作系统进程同步与互斥实验报告0204192337

学生实验报告姓名:年级专业班级学号成绩#define N 1 //N定义为临界资源!printf("请输入三个进程:\n"); //初始状态为:临界资源处于空闲状态!loop:scanf("%d %d %d",&a,&b,&c); //输入的进程名为:a,b,c!进程名输入的先后代表进程的访问顺序!if(a==N) //判断进程a是否占据临界资源!若a==N,表明a访问临界资源!{printf("a=%d\n",a); //a正在访问临界资源!printf("b=0,c=0\n"); //b,c不能进入自己的临界区,需等待a释放临界资源!printf(“临界资源正在被进程a访问,进程b,c必须等待.\n”);}else if(b==N){printf("b=%d\n",b); //b正在访问临界资源!printf("a=0,c=0\n"); //a,c不能进入自己的临界区,需等待b释放临界资源!printf(“临界资源正在被进程b访问,进程a,c必须等待.\n”);}5.编译链接所编写的程序,在编译正确的情况下执行程序.6.记录程序执行的结果(如下图所示).注意:初始状态为:临界资源处于空闲状20 10年12 月16 日【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)1.进程a,b,c分别访问临界资源时程序执行的结果如下.(a) (b) (c)2.该程序初始化N为临界资源,根据输入a,b,c,的值是否等于N来判断进程分别是否进入自己的临界区。

当a=N 表明进程a正在访问临界资源。

此时程序执行的输出为:a=1,b=c=0表示进程b,c不能进入自己的临界区。

3.该程序能较好地体现程序并发执行时的一种制约关系-互斥,但不能较好的反映进程的同步关系,所以该算法有待改进,用以同时实现进程的同步和互斥。

操作系统实验报告实验3_1

操作系统实验报告实验3_1

操作系统实验报告实验3_1一、实验目的本次实验的主要目的是深入理解操作系统中进程管理的相关概念和原理,通过实际操作和观察,掌握进程的创建、调度、同步与互斥等关键机制,提高对操作系统内核工作原理的认知和实践能力。

二、实验环境本次实验在装有 Windows 10 操作系统的计算机上进行,使用了Visual Studio 2019 作为开发工具,编程语言为 C++。

三、实验内容与步骤(一)进程创建1、编写一个简单的 C++程序,使用系统调用创建一个新的进程。

2、在父进程和子进程中分别输出不同的信息,以区分它们的执行逻辑。

```cppinclude <iostream>include <windowsh>int main(){DWORD pid;HANDLE hProcess = CreateProcess(NULL, "childexe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pid);if (hProcess!= NULL) {std::cout <<"Parent process: Created child process with PID "<< pid << std::endl;WaitForSingleObject(hProcess, INFINITE);CloseHandle(hProcess);} else {std::cerr <<"Failed to create child process" << std::endl;return 1;}return 0;}```(二)进程调度1、设计一个多进程并发执行的程序,通过设置不同的优先级,观察操作系统对进程的调度情况。

2、记录每个进程的执行时间和等待时间,分析调度算法的效果。

```cppinclude <iostream>include <windowsh>DWORD WINAPI ProcessFunction(LPVOID lpParam) {int priority =(int)lpParam;DWORD start = GetTickCount();std::cout <<"Process with priority "<< priority <<"started" << std::endl;for (int i = 0; i < 100000000; i++){//执行一些计算操作}DWORD end = GetTickCount();DWORD executionTime = end start;std::cout <<"Process with priority "<< priority <<" ended Execution time: "<< executionTime <<" ms" << std::endl;return 0;}int main(){HANDLE hThread1, hThread2;int priority1 = 1, priority2 = 2;hThread1 = CreateThread(NULL, 0, ProcessFunction, &priority1, 0, NULL);hThread2 = CreateThread(NULL, 0, ProcessFunction, &priority2, 0, NULL);if (hThread1!= NULL && hThread2!= NULL) {SetThreadPriority(hThread1, THREAD_PRIORITY_LOWEST);SetThreadPriority(hThread2, THREAD_PRIORITY_NORMAL);WaitForSingleObject(hThread1, INFINITE);WaitForSingleObject(hThread2, INFINITE);CloseHandle(hThread1);CloseHandle(hThread2);} else {std::cerr <<"Failed to create threads" << std::endl;return 1;}return 0;}```(三)进程同步与互斥1、实现一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。

操作系统进程同步实验报告

操作系统进程同步实验报告

操作系统进程同步实验报告本实验旨在通过模拟操作系统中进程的同步问题,加深学生对操作系统中进程同步机制的了解和实践能力。

本次实验分为两个部分,第一个部分是使用信号量实现进程同步,第二个部分是使用管程实现进程同步。

第一部分实验:使用信号量实现进程同步本部分实验的目标是使用信号量来实现进程同步,确保资源的互斥访问。

在Linux系统中,信号量是一种用来控制进程同步的机制,可以用于保证共享资源的互斥访问、避免死锁等问题。

具体实验流程如下:1. 定义一个信号量,用于互斥访问共享资源在Linux系统中,使用semget函数可以创建一个信号量集,使用semctl函数可以对信号量进行控制。

```#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#define KEY 1234 // 定义信号量的键值int semid; // 定义信号量标识符union semun{int val; // 信号量的初始值struct semid_ds *buf; // IPC_STAT, IPC_SET操作时用ushort *array; // GETALL, SETALL操作时用};void init_sem(){int ret;union semun semunion;// 创建信号量semid = semget(KEY, 1, IPC_CREAT | 0666);if(semid == -1){perror("semget error");exit(1);}2. 定义生产者和消费者进程,并使用信号量来实现同步在生产者和消费者进程中,需要先对信号量进行P操作,即申请资源,然后进行对共享资源的操作,最后再对信号量进行V操作,即释放资源。

本实验中,共享资源是一个循环缓冲区,生产者进程向其中写入数据,消费者进程从中读取数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、相关的系统调用
(1)lockf(files,function,size) :用作锁定文件的某些段或者整个文件。 函数原型: #include <unistd.h> int lockf(int files,int function;long size) 其中:files 是文件描述符;参数 function 可以取以下值:F_LOCK:锁定一个区域。
进程的同步互斥实验
实验目的
1、进一步认识并发执行的实质 2、分析进程竞争资源的现象,学习解决进程同步互斥的方法
实验内容
1、编写程序,使用相关函数实现父子进程对共享文件的同步互斥访问。 2、修改程序,观察对临界资源访问的互斥控制的作用。
实验基础
一、临界资源的互斥访问
为了实现多进程对临界资源的互斥访问,一个进程访问临界资源的典型程序段类似如下 形式:
{ ………. 进入区 临界区; 退出区 其余代码;
………} 其中,进入区中判断资源是否可用,如果可用,则资源数量减 1,进程进入临界区;否 则进程阻塞等待。退出区中资源数量加 1,唤醒阻塞等待该资源的进程。进入区和退出区都 是原子操作。 操作系统中,通常用信号量来实现进入区和退出区,即 P 操作和 V 操作。为了实现用户程序 中对某些资源的同步互斥访问,操作系统也提供了一些函数接口,功能类似于对特定临界区 的进入区和退出区功能。
write(fd,str,strlen(str));
sleep(1);
}
unlock(fd);
/ *解锁 * /
}
else
{
while((p2=fork( ))==-1); /*创建子进程p2*/
if (p2==0)
{
lock(fd);
/ *加锁 * /
for(i=0;i<3;i++)
{
sprintf(str,"son %d\n",i);
fatal("unlockf()"); return 0; }
int main( ) {
int pid,fd; char str[80];
fd=open("tmp.txt",O_RDWR|O_CREAT|O_TRUNC,0644); pid=fork();
switch(pid) {
case -1: fatal("fork fail!");
int unlock(int fd) { lseek(fd,0,SEEK_SET); if(lockf(fd,F_ULOCK,0)==-1)
fatal("unlockf()"); return 0; }
int main() { int fd; int p1,p2,i; char str[20];
if((fd=open("locked_file.txt",O_RDWR|O_APPEND|O_CREAT,0666))<0)
(3)r ead:读文件 函数原型:#include <unistd.h> int read(int fd,void *buf,size_t nbytes)
该系统调用从文件描述符 fd 所代表的文件中读取 nbytes 个字节,到 buf 指定 的缓冲区内。所读取的内容从当前的读/写指针所指示的位置开始,这个位置由相应的打开文 件描述中的偏移值(off_set)给出,调用成功后文件读写指针增加实际读取的字节数。
得每个进程在使用文件前对文件加锁,使用文件后解锁。 (2)o pen:打开一个文件 函数原型:#include <sys/types.h>
#include <sys/stat.h> #include <fcntl.h> int open(char *path,int flags,mode_t mode); 其中:参数 path 是指向所要打开的文件的路径名指针。 参数 falgs 规定如何打开该文件,它必须包含以下值之一 :O_RDONLY,只读打开 ; O_WRONLY,只写打开 ;O_RDWR,读/写打开;O_CREAT,当文件不存在时创建文件,需参 数 mode;O_APPEND,不论当前文件位置在何处,将文件指针移至文件尾,为 write 添加数据到 文件;O_TRUNC,当以可写的方式成功打开普通文件时,截断该文件的长度为 0。 参数 mode 规定对该文件的访问权限。 open 系统调用可以只使用前面介绍的这两个参数,省略第三个参数 mode。第三个参数 是在用 O_CREAT 创建文件时使用,指出新建文件的存取许可权。由这个参数指出的存取许 可权还要和 umask 进行运算后才得到新建文件的真正存取许可权。该运算是由 umask 按位取 反,再按位与上第三个参数给出的数取或(~umask&mode)。例如:umask 为 022,mode 为 0770, 则新建文件的存取许可权为 0750 即-rwxr-x---。
case 0: sleep(1); lock(fd); lseek(fd, SEEK_SET,0); read(fd,str,sizeof(str)); unlock(fd); printf("son %d:read str from tmpfile:%s\n",getpid(),str); exit(0);
文件指针处开始,并且在读写过程中同时移动文件指针。Lseek 函数就是用于设置文件指针 位置。
(6) close:关闭文件 函数原型:#include <unistd.h> int close(int fd); 每打开一个文件,系统就给文件分配一个文件描述符,同时为打开文件描述符的引用计 数加1。Linux 文件系统最多可以分配 255 个文件描述符。当调用 close()时,打开文件描述 符的引用计数值减1,最后一次对 close()的调用将使应用计数值为零。 虽然当一个进程结束时,任何打开的文件将自动关闭,明显地关闭任何打开的文件是良 好的程序设计习惯。
F_ULOCK:解除锁定。参数 size 指明了从文件当前位置开始的一段连续锁定区域的长度, 当 size 为 0 时,锁定记录将由当前位置一直扩展到文件尾。
如果 lockf 的参数 function 取值为 F_LOCK,而指定文件的对应区域已被其他进程锁定,
那么 lockf 的调用进程将被阻塞直到该区域解锁。 通过使用 lockf 函数,可实现多进程对共享文件进行互斥访问。进程的实现中,必须使
default: lock(fd); printf("parent %d :please enter a str for tmpfile(strlen<80):\n",getpid()); scanf("%s",str); lseek(fd, 0, SEEK_SET); write(fd,str,strlen(str)); unlock(fd); wait(0); close(fd); exit(0);
int fatal (const char* info) {
perror (info); exit (1); }
int lock(int fd) { lseek(fd,0,SEEK_SET); if(lockf(fd,F_LOCK,0)==-1) fatal("lockf()"); return 0; }
(4)w rite:写文件 函数原型: #include <unistd.h>
int write(int fd,void *buf,size_t nbytes) 该调用从 buf 所指的缓冲区中将 nbytes 个字节写到描述符 fd 所指的文件中。 (5) lseek:定位一个已打开文件。 函数原型:#include <unistd.h>
} }
思考题
1、函数 unlock 和 lock 的实现中,lseek 的作用? 2、解释参考程序 1,2 中 lock/unlock 的作用? 3、参考程序 2,子进程中的”sleep(1);”的作用?
}
unlock(fd);
/ *解锁 * /
wait(NULL);
wait(NULL);
}
}பைடு நூலகம்
close(fd);
}
参考程序2 #include<fcntl.h> #include<stdio.h>
int fatal (const char* info) {
perror (info); exit (1); }
fatal("open");
write(fd,"=========\n",10);
while((p1=fork( ))== -1);
/ *创建 子进程p 1 */
if (p1==0)
{
lock(fd);
/*加锁*/
for(i=0;i<3;i++)
{
sprintf(str,"daughter %d\n",i);
(2)修改程序,去掉所有 lock/unlock 调用。观察分析运行结果,解释原因。 (3)修改程序,不是去掉 lock/unlock 调用,而是去掉子进程中的”sleep(1);”。观察分 析运行结果,解释原因。
参考程序
参考程序1
#include<fcntl.h> #include<stdio.h>
int lseek(int fildes,off_t offset,int whence); 系统调用根据 whence 指定的位置将文件描述符 fildes 指向文件的文件指针偏移 offset
长度的字节数。Whence 的取值及其含义如下: ·SEEK_SET:从文件头开始计算偏移量,文件指针值就是 offset 的值。 ·SEEK_CUR:从文件指针的当前位置开始计算偏移量,文件指针值是当前指针的值加
相关文档
最新文档