黄老师 发表于 2013-8-29 07:48:04

大工13春《操作系统概论》辅导资料十

大工13春《操作系统概论》辅导资料十
主    题:第五章并行性:互斥和同步(第7—8节)
学习时间:2013年6月3日-6月9日
内    容:
第五章并行性:互斥和同步
这周我们将学习第五章中的第7—8节,下面整理出的理念框架供同学们学习。
第七节   UNIX的进程同步和通信
UNIX进程间的通信机制用于解决进程之间的信息交换和协调彼此的推进速度。UNIX系统的进程通信包括管道、消息缓冲、共享主存和信号量机制。
一、管道通信(pipes)
管道通信是借助于文件使进程之间按先进先出方式同步传递数据的一种形式。
有两种类型的管道:无名管道(pipes)和有名管道(FIFO)。
无名管道用于父子或两兄弟进程之间以FIFO规则传递信息。管道必须由父进程创建。
有名管道(FIFO)通常用于实现不要求具有父子关系的进程之间传输大量的信息。
管道文件是一个临时文件,通信完成,文件就不再存在。
管道通信方式是:一个进程用write命令向管道写入数据,另一个进程用read命令读管道中的数据。读、写必需同步。
1、创建无名管道(pipe)的系统调用
当同族进程之间需要通过管道进行通信时,调用系统调用pipe()建立一个无名管道。其调用语法如下:
            pipe(fdp)
这里,fdp是一个指针数组。纪录对管道读写的两个文件描述符。
其实现过程是:
    ①在管道文件所在的设备上分配一个i节点,并在主存分配一个活动i节点,其文件类型为IFIFO。
    ②为调用进程在系统打开文件表中分配两个表项,分别用FREAD和FWRITE填写,以指示对管道的读和写,并使f_inode指向内存I节点。同时在用户打开文件表中开辟两个表项分别指向系统打开文件表的两个表项。
    ③为pipe文件的主存i节点置初值:I_count=2,I_frcnt=1;I_fwcnt=1。
    ④将文件描述符通过数组fdp返回给调用进程。
pipe文件没有路径名,它是由pipe文件所在设备上的i节点、与之对应的主存i节点、两个系统打开文件表项及要求生成pipe文件的进程打开文件表的两个表项组成。
开始时,该文件的长度为0,是一个空白文件。pipe文件生成时的数据结构如下图所示。

对pipe文件大小的限制:pipe文件只使用索引节点中的直接地址项,其长度被限制为10个盘块大小。核心将直接地址项作为一个循环队列来管理,而将读指针(I_frptr)、写指针(I_fwptr)、读管道的进程数(I_frcnt)、写管道进程的数(I_fwcnt)及等待使用标志(I_fflag)等信息放入剩下的3个索引项中,并按先进先出顺序进行读和写。
进程互斥:诸进程互斥访问pipe文件索引节点中的直接地址项。加一把锁。
之后创建一个或几个子进程。此时,子进程复制父进程的用户打开文件表,于是pipe文件就为父、子进程(或同族进程之间)共享。之后,各进程分别关闭掉pipe文件的发送端与接收端,通过调用READ()或WRITE()函数对pipe文件进行存取。
为了避免混乱,一个pipe文件最好为两进程专用,一个用于读,一个用于写。            
通信完成后,使用关闭命令CLOSE(),将其关闭,收回文件占用的系统全部资源。文件一经关闭,不再存在。
2、创建一个有名管道(named pipe)
无名管道是一个临时文件,当文件被关闭后,文件就不复存在,且只能用于同族进程之间的通信。
UNIX系统Y提供了有名管道,实现非同族进程之间的通信。有名管道可用于同一机器进程间的本地通信,也可用于通过网络连接的不同机器进程间的通信。调用语法如下:
mknod(pathname,mode,dev)
其中pathname是新创建的有名管道的文件路径名,mode是被创建文件的类型和存取方式,dev是文件所在的设备。
有名管道被创建后,在系统中有一个目录项和对应的外存i节点与之对应,但并不将它打开。只要这种文件不删除,它与普通文件一样永久存在,只是文件长度为零。
3、打开一个有名管道
由于有名管道创建时并没有打开,因此必须显式地使用如下的打开系统调用将文件打开。
      open(pathname,oflg)
其中pathname是要打开的有名管道的路径名,oflg是文件打开时的存取方式。
通信的发送者以O_WRONLY只写方式、接收方以O_RDONLY只读方式打开有名管道。
有名管道打开后通信双方使用读写命令进行通信,通信完成后就立即关闭。有名管道文件关闭后,它所占用的磁盘块全部释放,但文件仍占有一个目录项和一个I节点。只是文件长度为0。
进程间使用有名管道实现通信时,必须有三次同步。
第一次是打开同步。
当一个进程以读方式打开有名管道时,若已有写者打开过,则唤醒写者后继续前进,否则,睡眠等待写者。
当一个进程以写方式打开有名管道时,若已有读者打开过,则唤醒读者后继续前进。否则睡眠等待读者。
第二次是读写同步。
同步方式与pipe相同。允许写者超前读者1024个字符。当写者写时,检查有无读者等待,若有,唤醒后,再写。当管道被写满时,写者必须睡眠等待。
读者从有名管道读时,若没有数据可读,则睡眠等待。若有数据可读,读完后要检查有无写者等待,若有唤醒写者。
读写两方必须随时检查通信的另一方是否还存在,一旦有一方不存在,应立即终止通信过程。
第三次是关闭同步。
当一个写进程关闭有名管道时,若发现有进程睡眠等待从管道读,则唤醒它,被唤醒进程立即从读调用返回。
当一个读进程关闭有名管道时,若发现有进程睡眠等待向管道写,则唤醒它,并向它发一个指示错误条件的信号后返回。
最后一个关闭有名管道的进程,释放该管道占用的全部盘块及相应主存i节点。
二、消息缓冲机制   
消息:是一个格式化的可变长的信息单元。在UNIX中,消息机制向用户提供了四个系统调用。
消息机制的数据结构:
消息首部:记录消息的类型、大小、指向消息数据区的指针、消息队列的连接指针等。
消息队列头表:包含了指向消息队列中第一个消息的指针和指向最后一个消息的指针、队列中消息的数目、队列中消息数据的总字节数、队列所允许的消息数据的最大字节总数等。

图1消息队列中的数据结构
建立一消息队列:
   int msgget(key,msgflg);
   key_t key;   用户指定的消息队列的名字
   int msgflg;用户设置的标志和访问方式
   返回一个消息队列描述符
消息的发送:
int msgsnd(msgid, msgp,msgsz,msgflg);
int msgid;消息队列描述符
struct msgbuf * msgp;指向消息缓冲区的指针
int msgsz;消息的长度
int msgflg;当无内存空间存储消息时,等待?放回?
消息的接收:
   int msgrev(msgid,msgp,msgsz,msgtpy,msgflg);
   int msgid,msgsz,msgflg;
   struct msgbuf * msgp;
   long msgtpy;规定选读的消息类型
消息队列的操纵:如读出状态信息并修改
   int msgctl(msgid,cmd,buf);
   int msgid,cmd;    cmd是规定的命令
   struct msgid_ds * buf;存放控制参数和查询结果。
第八节Solaris线程同步原语
一、表情语
本节定义了四种可用的同步类型,并且讨论实现同步的注意事项。
1)互斥锁(mutex)
2)条件变量(condition variable)
3)多读单写锁(multi-read,single-write lock)
4)信号量(semophore)
进程间同步(process synchronization)
同步原语的比较(compare primitive)
同步对象是内存中的变量,你可以象访问一般的数据那样来访问它。不同进程内的线程可以通过共享内存中的同步变量来同步,即使这些线程互不可见。
同步变量可以放置在文件当中,可以比创建它的进程拥有更长的生命。
同步对象的类型包括:
1) 互斥锁
2) 状态变量
3) 读写锁
4) 信号灯(信号量)
在下面几种情况下,同步是重要的:
1)在两个或更多个进程内的线程可以合用一个同步变量。注意,同步变量应当被一个进程初始化,在第二次初始化时,该同步变量被设置为解锁状态。
2) 同步是唯一保证共享数据持久的办法。
3) 一个进程可以映射一个文件并通过一个线程将其加锁,修改完成之后,该线程释放文件锁并恢复文件。在文件加锁的过程中,任何程序中的任何 线程想要加锁时都会阻塞,直至解锁;
4)同步可以保证易变数据的安全。
5)同步对于简单变量也是很重要的,例如整数。在整数没有和总线对齐或大于数据宽度的情况下,读写一个整数可能需要多个内存周期。虽然在SPARC系统上不会发生这样的情况,但移植程序时不能不考虑这一点。
选择题
1、通常用户进程被创建后,()。
A、便一直存在于系统中,直到被操作人员撤销
B、随着进程运行的正常或不正常结束而撤销
C、随着时间片轮转而撤销与建立
D、随着进程的阻塞或唤醒而撤销与建立
2、正在运行的进程因提出的服务请求未被操作系统立即满足或者所需数据尚未到达等原因,只能把()状态转变为等待状态。
A、父进程       B、子进程       C、进程本身      D、其他进程
3、在多对一的线程模型中,当一个多线程进程中的某个线程执行一个需阻塞的系统调用时,()。
A、该进程的其他线程仍可继续运行
B、整个进程都将阻塞
C、该阻塞线程将被撤销
D、该阻塞线程将永远不可能再执行
4、用户可以通过()创建或者终止一个进程。
A、函数调用      B、宏指令   C、系统调用      D、阻塞调用
5、在操作系统中进程是一个具有一定独立功能程序在某个数据集合上的一次()。
A、并发活动
B、运行活动
C、单独操作
D、关联操作
参考答案
1-5BCACB
页: [1]
查看完整版本: 大工13春《操作系统概论》辅导资料十