计算机操作系统教程 课件第4章-进程通信与多线程_第1页
计算机操作系统教程 课件第4章-进程通信与多线程_第2页
计算机操作系统教程 课件第4章-进程通信与多线程_第3页
计算机操作系统教程 课件第4章-进程通信与多线程_第4页
计算机操作系统教程 课件第4章-进程通信与多线程_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

计算机操作系统ComputerOperatingSystems第四章

进程通信与多线程第四章进程通信与多线程12进程通信多核多线程4.1

进程通信4.1.1进程通信

进程通信,是指进程之间的信息交换。并发进程之间的相互通信是实现多进程间协作的常用工具。低级通信:只能传递状态和整数值(控制信息)高级通信:能够传送任意数量的数据如何实现?能否共享内存单元(全局变量或共享缓冲区)?4.1

进程通信4.1.2进程通信方式P1P2OS低级通信:信号量(semaphore)信号(signal)高级通信:共享内存(sharedmemory)、消息传递(messagepassing)、管道(pipe)4.1.2进程通信方式进程的高级通信方式4.1

进程通信共享存储区通信消息传递系统管道通信Socket通信1)共享存储区通信2)消息传递系统直接通信:发送原语

Send(Receiver,message)

接收原语

Receive(Sender,message)

;2)消息传递系统直接通信:①消息缓冲区

typemessagebuffer=record

sender

;发送进程的标识符

size

;消息长度

text

;消息正文

next

;指向下一个消息缓冲区的指针

end

2)消息传递系统直接通信:②PCB

有关通信的扩充数据项

typePCB=record

...

mutex

;消息缓冲队列互斥信息量;

Sm

消息缓冲队列资源信息量;

mq

消息缓冲队列首指针

...end2)消息传递系统2)消息传递系统

Proceducesend(receiver,a)begingetbuf(a.size,i);

i.sender=a.sender;

i.size=a.size;

i.text=a.text;

i.next=0;

getid(PCBset,receiver,j);

P(j.mutex);

insert(j.mq,i);

V(j.mutex);

V(j.Sm);

end2)消息传递系统

proceduce

receive(b)

begin

j:=internalname

P(j.Sm)

P(j.mutex)

Remove(j.mq,i)

V(j.mutex)

b.sender:=i.sender

b.size:=i.size

b.text:=i.text

Releasebuf(i)

end2)消息传递系统间接通信:私用信箱公用信箱共享信箱3)管道通信

所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于UNIX系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。3)管道通信4)Socket通信服务器方:(1)首先服务器方要先启动,并根据请求提供相应服务;(2)打开一通信通道并告知本地主机,它愿意在某一IP地址上接收客户请求;(3)处于监听状态,等待客户请求到达该端口;(4)接收到服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进(线)程来处理这个客户请求。新进(线)程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止;(5)返回第二步,等待另一客户请求;(6)关闭服务器。4)Socket通信客户方:(1)打开一通信通道,并连接到服务器所在主机的特

定端口;(2)向服务器发服务请求报文,等待并接收应答;继

续提出请求......(3)请求结束后关闭通信通道并终止。4)Socket通信internalintListenNo_=1;IPAddresslocalAddr=IPAddress.Any;//取服务器的IPpublicvoidListening(){try{ System.Net.Sockets.TcpListeners; s=newSystem.Net.Sockets.TcpListener(localAddr,PORT); s.Start();//启动服务器端监听

CommandProcClscp; for(;;){ System.Net.Sockets.TcpClientincoming=s.AcceptTcpClient();cp=newCommandProcCls(incoming); Threadnewthread=newThread(newThreadStart(cp.CommandProc)); newthread.Start();//创建线程处理客户端请求

}}catch(System.Exceptione3){……}publicclassCommandProcCls{//处理客户端请求System.Net.Sockets.TcpClienttc;publicCommandProcCls(System.Net.Sockets.TcpClientincoming){ tc=incoming;//获得客户端的请求信息}publicvoidCommandProc(){ if(tc!=null){……//处理客户端的请求 } return;}}客户端VB程序。PublicFunctionconnect_toserver(ByValSeverNameAsString,ByValPORTAsLong)AsIntegerWinsock1.RemoteHost=SeverNameWinsock1.RemotePort=PORTWinsock1.Connect//请求连接到服务器的Socket接口ifWinsock1.State=sckConnectedthenWinsock1.SendDataMsg//发送客户端的请求信息EndIfWinsock1.CloseEndFunction

自从60年代提出进程概念以来,在操作系统中一直都是以进程作为独立运行的基本单位,直到80年代中期,人们又提出了更小的能独立运行的基本单位

线程。4.2.1线程(Thread)4.2

多核多线程【案例】电话银行系统的实现(1)可不可以多人同时打银行的客服电话?(2)每个客服电话对应一个进程吗?why线程?【案例】编写一个MP3播放软件。核心功能模块有三个:(1)从MP3音频文件当中读取数据;(2)对数据进行解压缩;(3)把解压缩后的音频数据播放出来。why线程?main()

{

while(TRUE)

{Read();

Decompress();

Play();

}}Read(){…}

Decompress(){…}Play(){…}单进程的实现方法问题:播放出来的声音能

否连贯?各个函数之间不是

并发执行,影响资

源的使用效率;I/OCPUyoutube的状态栏在线视频播放的进度程序1

main()

{

while(TRUE)

{Read();

}}Read(){…}多进程的实现方法问题:进程之间如何通信,共享数据?程序3

main()

{

while(TRUE)

{Play();

}}Play(){…}程序2

main()

{

while(TRUE)

{Decompress();

}}Decompress(){…}怎么来解决这些问题?需要提出一种新的实体,满足以下特性:(1)实体之间可以并发地执行;(2)实体之间共享相同的地址空间;这种实体就是:线程(Thread)Thread:

Asequentialexecutionstreamwithin

aprocess;Athreadofexecution;

进程当中的一条执行流程。什么是线程?从两个方面来理解进程:从资源组合的角度:进程把一组相关的

资源组合起来,构成了一个资源平台

(环境),包括地址空间(代码段、数据

段)、打开的文件等各种资源;从运行的角度:代码在这个资源平台上的

一条执行流程(线程)。资源平台线程进程=线程+资源平台优点:一个进程中可以同时存在多个线程;各个线程之间可以并发地执行;各个线程之间可以共享地址空间。

线程是进程的一个实体,是被系统独立调度和分派的基本单位,每个线程都有一个惟一的标识符。线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享所属进程拥有的全部资源。4.2.1线程(Thread)轻型实体。(2)独立调度和分派的基本单位。(3)可并发执行。(4)共享进程资源。4.2.1线程(Thread)线程所需的资源

addr1,r2,r3subr2,r3,r10str2,0(r1)…线程独享线程共享线程所需的资源(续)(本图摘自Silberschatz,GalvinandGagne:“OperatingSystemConcepts”)why?栈中存放的是局部变量允许递归调用现代编程语言的重要特性A(inttmp){if(tmp<2)B();printf(tmp);}B(){C();}C(){A(2);}A(1);A:tmp=2ret=C+1StackGrowthA:tmp=1ret=exitB:ret=A+2C:ret=B+1StackPointer线程执行时的函数调用及栈线程与进程的比较

进程是资源分配单位和操作系统保护单位,线程

是CPU调度单位;进程拥有一个完整的资源平台,如代码、数据和

堆,而线程只独享必不可少的资源如寄存器和栈

线程同样具有就绪、阻塞和执行三种基本状态,

同样具有状态之间的转换关系;线程能减少并发执行的时间和空间开销;线程=轻量级进程(lightweightprocess)下列哪些内容是存放在线程控制块TCB中?A、CPU寄存器的值 B、页表指针C、栈指针 D、就绪队列 E、段表 F、线程优先级G、打开文件表A、C、F

在一个实际的工程项目中,软件平台采用的是某一种实时的嵌入式操作系统。该项目有两个.c源文件,如下图所示。这两个.c文件实现的功能是:在文件1.c中,任务A循环地从SOCKET中接收数据;任务B每隔100ms向SOCKET发送响应消息,而定时功能是由文件2.c中的任务C来实现的。任务C和任务B之间通过同步信号量进行任务间的同步。

问题:分析该操作系统当中的“任务”的概念,它相当于是我们通常所说的进程还是线程?为什么?2.2.3

一个例子intg_nSockId; //socket标识,全局变量semIdg_synSemId;//信号量标识,全局变量voidtestInit(void) //初始化函数{

创建SOCKTE,建立连接;//g_nSockId被赋值

/*taskSpawn函数的功能:创建一个任务,它的参数为:“任务名”,“优先级”,“栈大小”,“函数名”,“函数输入参数”);*//*创建任务A*/taskSpawn(“tTestTskA”,50,2000,testTskA,0,……..);/*创建任务B*/taskSpawn(“tTestTskB”,50,2000,testTskB,0,……..);}源文件1.cvoidtestTskA(void){char*pChRxBuf;pChRxBuf=malloc(100);while(1){recv(g_nSockId,pChRxBuf,…..);……}}voidtestTskB(void){charpChTxBuf[100]=“Sendmessagebackevery100ms”;while(1){semTake(g_synSemId);send(g_nSockId,pChTxBuf,…..);}}externsemId

温馨提示

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

评论

0/150

提交评论