
操作系统:实验二 进程的同步与互斥实验报告
高深
操作系统进程同步与互斥实验报告0204192337
包括实验目的、要求,实验内容,实验环境以及实验步骤、过程。
操作系统“进程同步”的基本概念是什么?
我们把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。
具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。
如果我们对一个消息或事件赋以唯一的消息名,则我们可用过程 wait (消息名) 表示进程等待合作进程发来的消息,而用过程 signal (消息名) 表示向合作进程发送消息。
在单机条件下,诸进程运行于同一个处理机和内存环境中,进程通信十分简单。
进程之间可以借助于“共享存储器”进行直接通信。
而在多机条件下,相互合作的进程可能在不同的处理机上运行,进程间的通信涉及处理机的通信问题。
在松散耦合系统中,进程间通信还可能要通过较长的通信信道,甚至网络。
因此,在多机条件下,广泛采用间接通信方式,即进程间是通过消息进行通信的。
在分布式操作系统中,为了实现进程的同步,首先要对系统中发生的事件进行排序,还要有良好的分布式同步算法。
操作系统实验报告——进程同步与互斥
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
进程的同步与互斥实验
进程的同步互斥实验实验目的1、进一步认识并发执行的实质2、分析进程竞争资源的现象,学习解决进程同步互斥的方法实验内容1、编写程序,使用相关函数实现父子进程对共享文件的同步互斥访问。
2、修改程序,观察对临界资源访问的互斥控制的作用。
实验基础一、临界资源的互斥访问为了实现多进程对临界资源的互斥访问,一个进程访问临界资源的典型程序段类似如下形式:{……….进入区临界区;退出区其余代码;………其中,进入区中判断资源是否可用,如果可用,则资源数量减1,进程进入临界区;否则进程阻塞等待。
退出区中资源数量加1,唤醒阻塞等待该资源的进程。
进入区和退出区都是原子操作。
操作系统中,通常用信号量来实现进入区和退出区,即P操作和V操作。
为了实现用户程序中对某些资源的同步互斥访问,操作系统也提供了一些函数接口,功能类似于对特定临界区的进入区和退出区功能。
二、相关的系统调用(1)lockf(files,function,size):用作锁定文件的某些段或者整个文件。
函数原型:#includeintlockf(intfiles,intfunction;longsize)其中:files是文件描述符;参数function可以取以下值:F_LOCK:锁定一个区域。
F_ULOCK:解除锁定。
参数size指明了从文件当前位置开始的一段连续锁定区域的长度,当size为0时,锁定记录将由当前位置一直扩展到文件尾。
如果lockf的参数function取值为F_LOCK,而指定文件的对应区域已被
操作系统中,如果信号量的当前值为负数,则表示系统中在该信号量上有多少个等待进程,为什麽
这是信号量的P、V操作,P表示申请一个资源,每次P操作使信号量减1,V是释放一个资源,每次V操作使信号量加1。
信号量表示的是当前可用的资源个数,当信号量为负时,申请资源的进程就只能等待了。
所以,信号量是负的多少,就表明有多少个进程申请了资源但无资源可用只能处于等待状态。
总线系统实验报告
微型计算机的总线结构 Bub(总线) Interface(接口) Socket(插座) Slot(插槽) Port(端口)总线——是一组能为多个部件服务的公共信息传送线路,是计算机各部件之间的传送数据、地址和控制信息的公共通路,它能分时地发送与接收各部件的信息。
采用结构在系统设计、生产、使用和维护上有很多优越性: (1)采用结构设计方法,简化了系统设计。
(2)便于生产与之兼容的硬件板卡和软件。
(3)便于系统的扩充和升级。
(4)便于故障诊断和维护,也降低了成本。
总线的主要参数总线分类: 数据总线(Data Bus)-用于传输数据的。
地址总线(Address Bus)-用于传输地址信息的。
控制总线(Contron Bus)-用于传输控制信号、时钟信号的状态信息的。
1、总线的带宽(MB\\\/s) ——指的是单位时间内总线上可传送的数据量,即每秒传送多少MB字节的最大稳态数据传输率。
2、总线的位宽(bit) ——指的是总线一次能同时传送的数据位数,即常说的32位、64位等总线宽度。
总线位宽越大传输率越大。
3、总线的工作时钟频率 ——总线分为:CPU内部使用的内部总线和CPU对外联系的外部总线。
外部总线又称为系统总线。
众多的功能部件要正常的动作,必须有一个统一的指挥,这个就是时钟信号。
控制总线的时钟信号频率称为总线的工作时钟频率。
内部总线频率就是常说的内频,而外部总线频率就是外频。
总线带宽=总线位宽*总线工作频率\\\/8 注:(总线带宽、总线位宽、总线工作时钟频率的关系,就像速公路上的车流量、公路车道数目、车辆行驶速度的关系)实验1 进程管理1. 实验目的(1) 加深对进程概念的理解,明确进程和程序的区别。
(2) 进一步认识并发执行的实质。
(3) 分析进程争用资源的现象,学习解决进程互斥的方法。
(4) 了解Linux系统中进行通信的基本原理。
2. 实验预备内容(1) 阅读Linux的sched.d源码文件,加深对进程管理的理解。
(2) 阅读Linux的fork.c源码文件,分析进程的创建过程。
3. 实验内容(1) 进程的创建编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符;父进程显示字符a,子进程分别显示b和c。
试观察记录屏幕上的显示结果,并分析原因。
〈程序〉#include〈stdio.h〉Main(){int p1,p2;while((p1 == fork()) == -1); \\\/*创建子进程p1*\\\/if (p1 == 0) \\\/*子进程创建成功*\\\/putchar('b');else{while((p2 == fork())) == -1); \\\/*创建子进程p2*\\\/if (p2 == 0) \\\/*子进程创建成功*\\\/putchar('c'); \\\/*父进程执行*\\\/else putchar('a');}}〈运行结果〉bca(有时出现bac等)分析:从进程并发执行来看,输出bac,acb等情况都有可能。
原因:fork()创建进程所需的时间要多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了'b',而进程2和主程序的输出次序是有随机性的,所以会出现上述结果。
(2) 进程的控制修改已编写的程序,将每个进程的输出有单个字符改为一句话,在观察程序执行时屏幕上出现的现象,并分析其原因。
如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
〈程序1〉#include〈stdio.h〉main(){int p1,p2,i;while((p1 == fork()) == -1); \\\/*创建子进程p1*\\\/if (p1 == 0) \\\/*子进程创建成功*\\\/for(i=0;iprintf(sun %d\\\/n,i);else{while((p2 == fork())) == -1); \\\/*创建子进程p2*\\\/if (p2 == 0) \\\/*子进程创建成功*\\\/for(i=0;iprintf(earth %d\\\/n,i);elsefor(i=0;iprintf(moon %d\\\/n,i);}}〈运行结果〉sun...earth...moon...moon...或sun...earth...sun...earth...moon...等分析:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。
但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。
这类似打印单字符的结果。
〈程序2〉#include〈stdio.h〉main(){int p1,p2,i;while((p1 == fork()) == -1); \\\/*创建子进程p1*\\\/if (p1 == 0){lockf(1,1,0);for(i=0;iprintf(sun %d\\\/n,i);lockf(1,0,0);}else{while((p2 == fork())) == -1);if (p2 == 0){lockf(1,1,0);for(i=0;iprintf(earth %d\\\/n,i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;iprintf(moon %d\\\/n,i);lockf(1,1,,0);}}}〈运行结果〉sun...earth...moon...moon...或sun...earth...sun...earth...moon...等与未上锁的情况大致相同,也是随着执行时间的不同,输出结果的顺序有所不同。
分析:因为上述程序执行时,不同进程之间不存在共享临界资源问题,所以,加锁与不加锁效果相同。
(3) 软中断通信编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程扑捉键盘上来的中断信号(即按Del键),当扑捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程扑捉到信号后,分别输出下列信息后终止:child process 1 is killed by parent!child process 2 is killed by parent!父进程等待两个子进程终止后,输出以下信息后终止:parent process is killed!〈程序〉#include〈stdio.h〉#include〈signal.h〉#include〈unistd.h〉void waiting(),stop();int wait_mark;main(){int p1,p2,i;while((p1 == fork()) == -1); \\\/*创建子进程p1*\\\/if (p1 > 0){while((p1 == fork == -1);if(p2 > 0){wait_mark = -1;signal(SIGINT,stop); \\\/*接收'Del'信号,并转stop*\\\/waiting(0);kill(p1,16); \\\/*向p1发中断信号16*\\\/kill(p2,17); \\\/*向p1发中断信号17*\\\/wait(0); \\\/*同步*\\\/wait(0);printf(parent process is killed! \\\ );exit(0);}else{wait_mark = -1;signal(17,stop);waiting();lockf(stdout,1,0);printf(child process 2 is killed by parent! \\\ );lockf(stdout,0,0);exit(0);}}else{wait_mark = -1;signal(16,stop);waiting();lockf(stdout,1,0);printf(child process 1 is killed by parent! \\\ );lockf(stdout,0,0);exit(0);}}void waiting(){while (wait_mark != 0);}void stop(){wait_mark = 0;}〈运行结果〉child process 1 is killed by parent!child process 2 is killed by parent!parent process is killed!分析:上述程序中,使用函数signal()都放在一段程序的前面部位,而不是在其他接收信号处。
只是因为signal()的执行只是为进程指定信号量16或17的作用,以及分配相应的与stop()过程链接的指针。
从而,signal()函数必须在程序前面部分执行。
计算机操作系统:什么是进程同步
一个不一定只个。
有些程序是多程序的,但很多程序也是但进。
qq是多进程的。
只要你登陆一个qq就会出现一个qq.exe和txplatform.exe。
后者可以有效压缩qq占用内存量,结束后qq占用的内存会很高。
杀软的进程也一般较多。
进程多可以降低崩溃的可能……



