《操作系统基础知识大全.pdf》由会员分享,可在线阅读,更多相关《操作系统基础知识大全.pdf(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、操作系统基础知识大全操作系统基础知识笔记一、操作系统相关概念计算机软件:系统软件和应用软件。计算机系统资源:硬件资源、软件资源。硬件资源:中央处理器、存储器、输入、输出等物理设备。软件资源:以文件形式保存到存储器上的程序和数据信息。定义:有效地组织和管理系统的各种软/硬件资源,合理组织计算机系统工作流程,控制程序的执行,并给用户提供一个良好的环境和友好的接口。操作系统作用:通过资源管理提高计算机系统的效率、改善人家界面提高良好的工作环境。吞吐量:计算机在单位时间内处理工作的能力。二、操作系统的特征与功能操作系统的特征:并发性、共享性、虚拟性、随机性。2.1、操作系统的功能1、进程管理:实际上是
2、对处理机的执行时间进行管理,采用多道程序等技术将 西 的 时间合理分配给每个任务。比如:进程控制、进程同步、进程通信、进程调度。2、文件管理:主要有存储空间管理、目录管理、文件读写。3、存储管理:对主存储器空间进行管理,主要包括存储空间分配回收、存储保护、地址映射、主存扩充等。4、设备管理:对硬件设备的管理。包括分配、启动、完成、回收。5、作业管理:包括任务、界面管理、人机交互、语音控制、虚拟现实等。三、操作系统分类1、批处理操作系统分为单道批处理、多道批处理。单道批处理:早期的操作系统,一次只有一个作业装入内存执行。作业由用户程序、数据和作业说明书组成。一个作业运行结束后,自动调入同批的下一
3、个作业。多道批处理:允许多个作业装入内存执行,在任意时刻,作业都处于开始和结束点之间。多道批处理系统特点:多道、宏观上并行运行、微观上串行运行。2、分时操作系统分时操作系统是将C P U的工作划分为很短的时间片。轮流为各个终端的用户服务。分时操作系统特点:多路性、独立性、交互性、及时性。3,实时操作系统实时操作系统对交互能力要求不高,要能对外来信息足够快的速度响应和处理。分为实时控制系统和实时信息处理系统。实时控制系统:主要用于生产过程的自动控制,比如自动采集、飞机的自动驾驶等。实时信息处理系统:主要是实时信息处理,比如飞机订票系统、情报检索系统等。4、网络操作系统网络操作系统使互联网能方便有
4、效的共享网络资源,为网络用户提供各种服务软件和有关协议的几何。比如电子邮件、文件传输、共享硬盘等。网络操作系统分为如下三类:1、集中式:系统的基本单元由一台主机和若干台主机相连的终端构成,将多台主机连接处理形成网络。比如U N I _。2、客户端/服务器模式:该模式分为客户端和服务器。服务器是网络控制的中心,向客户端提供多种服务,客户端主要是访问服务端的资源。3、对等模式(P 2 P):相当于每一台客户端都可以给其他客户端提供资源服务。5、分布式操作系统分布式操作系统是由多个分散的计算机经连接而成的计算机系统,系统中的计算机无主次之分,任意两台计算机都可以交换信息。分布式操作系统能直接对各类资
5、源进行动态分配和调度、任务划分、信息传输协调工作,为用户提供一个统一的界面、标准的接口,用户通过这一界面实现所需要的操作和使用系统资源。6、微机操作系统目前主流的操作系统有L i n u、M a c O S W i n do w s07、嵌入式操作系统嵌入式操作系统运行在嵌入式智能芯片环境中,对整个智能芯片以及操作、控制、部件装置等资源进行统一协调、处理、指挥、控制。嵌入式操作系统特点:微型化、可定制、实时性、可靠性、易移植性。操作系统基础知识一、概述1 .操作系统基本特征1 .并发并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。并行需要硬件支持,如多流水线或者
6、多处理器。操作系统通过引入进程和线程,使得程序能够并发运行。2 .共享共享是指系统中的资源可以被多个并发进程共同使用。有两种共享方式:互斥共享和同时共享。互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。3 .虚拟虚拟技术把一个物理实体转换为多个逻辑实体。利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务。主要有两种虚拟技术:时分复用技术和空分复用技术。例如多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。4 .异步异步指进程不是一次性执行完毕,而是走走停停,
7、以不可知的速度向前推进。但只要运行环境相同,O S需要保证程序运行的结果也要相同。2 .操作系统基本功能1.进程管理进程控制、进程同步、进程通信、死锁处理、处理机调度等。2 .内存管理内存分配、地址映射、内存保护与共享、虚拟内存等。3 .文件管理文件存储空间的管理、目录管理、文件读写管理和保护等。4 .设备管理完 成 用 户 的I/O请求,方便用户使用各种设备,并提高设备的利用率。主要包括缓冲管理、设备分配、设备处理、虚拟设备等。3 .系统调用如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。4 .大内核和微内核1 .大内核大内核是将操作系统功能作为一个
8、紧密结合的整体放到内核。由于各模块共享信息,因此有很高的性能。2 .微内核由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。5.中断分类1 .外中断由C P U执行指令以外的事件引起,如I/O完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。2 .异常由C P U执行指令的内部事件引
9、起,如非法操作码、地址越界、算术溢出等。6.什么是堆和栈?说一下堆栈都存储哪些数据?栈区(s t a c k)一 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区(h e a p)般由程序员分配释放,若程序员不释放,程序结束时可能由O S回 收。数据结构中这两个完全就不放一块来讲,数据结构中栈和队列才是好基友,我想新手也很容易区分。我想需要区分的情况肯定不是在数据结构话题下,而大多是在O S关于不同对象的内存分配这块上。简单讲的话,在C语言中:i n t a N ;/g o o n a s t a c k i n t a =(i n t )m a l
10、 l o c (s i ze o f (i n t)N);/g o o n a h e a p7.如何理解分布式锁?分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。二、进程管理1.进程与线程1.进程进程是资源分配的基本单位,用来管理资源(例如:内存,文件,网络等资源)进 程 控 制 块(P r o c e s s C o n t r o l B l o c k,P C B)描述进程的
11、基本信息和运行状态,所谓的创建进程和撤销进程,都 是 指 对P C B的操作。(P C B是描述进程的数据结构)下图显示了 4个程序创建了 4个进程,这4个进程可以并发地执行。2.线程线程是独立调度的基本单位。一个进程中可以有多个线程,它们共享进程资源。Q Q和浏览器是两个进程,浏览器进程里面有很多线程,例 如H T T P请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起H T T P请求时,浏览器还可以响应用户的其它事件。3.区别(一)拥有资源进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。(二)调度线程是独立调度的基本单位,
12、在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。(三)系统开销由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程C P U 环境的保存及新调度进程C P U 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。(四)通信方面进 程 间 通 信(I P C)需要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信。2 .进程状态的切换(生命周期)就绪状态(r
13、e a d y):等待被调度运行状态(r u n n i n g)阻塞状态(w a i t i n g):等待资源应该注意以下内容:只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得C P U 时间,转为运行状态;而运行状态的进程,在分配给它的C P U 时间片用完之后就会转为就绪状态,等待下一次调度。阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括C P U 时间,缺 少 C P U 时间会从运行态转换为就绪态。进程只能自己阻塞自己,因为只有进程自身才知道何时需要等待某种事件的发生3 .进程调度算法不同环境的调度算法目标不同,因此需要针对不
14、同环境来讨论调度算法。1.批处理系统批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)01.1先来先服务先来先服务 fi r s t-c o m e fi r s t-s e r v e r d (F C F S)按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。1.2短作业优先短作业优先 s h o r t e s t j o b f i r s t (SJ F)按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执
15、行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。1 .3最短剩余时间优先最短剩余时间优先 s h o r t e s t r e m a i n i n g t i m e n e _t(SRTN)按估计剩余时间最短的顺序进行调度。2 .交互式系统交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。2.1时间片轮转将所有就绪进程按F C F S(先来先服务)的原则排成一个队列,每次调度时,把C PU时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把C PU时
16、间分配给队首的进程。时间片轮转算法的效率和时间片的大小有很大关系。因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。2.2优先级调度为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。2 .3多级反馈队列如果一个进程需要执行1 0 0个时间片,如果采用时间片轮转调度算法,那么需要交换1 0 0次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例 如1,2,4,8,.。进程在第一个队列没执行完,就会被移到下一个
17、队列。这种方式下,之前的进程只需要交换7次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。3 .实时系统实时系统要求一个请求在一个确定时间内得到响应。分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。参考资料:操作系统典型调度算法/语言中文网4 .进程同步L临界区对临界资源进行访问的那段代码称为临界区。为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。/ent r y s ec t i on/c r i t i c al s ec t i
18、 on;/e_i t s ec t i on2.同步与互斥同步:多个进程按一定顺序执行;互斥:多个进程在同一时刻只有一个进程能进入临界区。3.信 号 量P和V是来源于两个荷兰语词汇,P 0-p r ol aag (荷兰语,尝试减少的意思),V()-ve意。g(荷兰语,增加的意思)信号量(S emap h or e)是一个整型变量,可以对其执行dow n和u p操作,也就是常见的P和V操作。dow n:如 果 信 号 量 大 于0,执 行-1操作;如果信号量等于0,进程睡眠,等待信号量大于0;(阻塞)u p :对信号量执行+1操作,唤醒睡眠的进程让其完成dow n操作。(唤醒)dow n和u p
19、操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。如果信号量的取值只能为0或 者1,那么就成为了互斥量(M u t e_),0表示临界区已经加锁,1表示临界区解锁。t y p edef i nt s emap h or e;s emap h or e mu t e_=1;voi d P l()dow n(&mu t e_);临界区 u p (&mu t e_);voi d P 2()dow n(femu t e);/临界区 u p(&mu t e_);)使用信号量实现生产者-消费者问题问题描述:使用一个缓冲区来保存物 品,只有缓冲区没有满,生产者才可以放入物品;只有缓冲
20、区不为空,消费者才可以拿走物品。因为缓冲区属于临界资源,因此需要使用一个互斥量m u t e _来控制对缓冲区的互斥访问。为了同步生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计,这里需要使用两个信号量:emp t y记录空缓冲区的数量,fu l l记录满缓冲区的数量。其中,emp t y信号量是在生产者进程中使用,当emp t y不 为0时,生产者才可以放入物品;fu l l信号量是在消费者进程中使用,当fu l l信号量不为0时,消费者才可以取走物品。注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行dow n(mu t e)再 执 行dow n
21、(emp t y)o如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执 行dow n(emp t y)操作,发 现emp t y =0,此时生产者睡眠。消费者不能进入临界区,因为生产者对缓冲区加锁了,也就无 法 执 行u p (emp t y)操作,emp t y永 远 都 为0,那么生产者和消费者就会一直等待下去,造成死锁。i t defi ne N l O O t y p edef i nt s emap h or e;s emap h or e mu t e=1;s emap h or eemp t y =N;s emap h or e fu l l =0;voi d p r
22、 odu c er()w h i l e(TR UE)i nt i t em=p r odu c e_ i t em();/生产一个产品 dow n(feemp t y)和 dow n(&mu t e)不能交换位置,否则造成死锁dow n(&emp t y);/记录空缓冲区的数量,这里减少一个产品空间 dow n(femu t e_);/互斥锁 i ns er t _ i t em(i t em);u p(&mu t e_);/互 斥 锁u p(&fu l l);/记录满缓冲区的数量,这里增加一个 产 品 voi d c ons u mer ()w h i l e(TR UE)dow n(&f
23、u l l);/记录满缓冲区的数量,减少一个产品dow n(&mu t e);/互 斥 锁 i nt i t em=r emove_ i t em();u p(&mu t e);/互斥锁 u p (&emp t y);记录空缓冲区的数量,这里增加一个产品 空 间 c ons u me_ i t em(i t em);4.管程管 程(甚遭:M oni t or s,也称为监视器)是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。管
24、程是为了解决信号量在临界区的PV操作上的配对的麻烦,把配对的PV操作集中在一起,生成的一种并发编程方法。其中使用了条件变量这种同步机制。c语言不支持管程,下面的示例代码使用了类P a sc a l 语言来描述管程。示例代码的管程提供了 in se rt()和 re m ove()方法,客户端代码通过调用这两个方法来解决生产者-消费者问题。m on itor P rod uc e rC on sum e r in te g e r i;c on d ition c;proc e d urein se rt();b e g in /.e n d;proc e d ure re m ove();b
25、e g in /.e n d;e n dm on itor;管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否者其它进程永远不能使用管程。管程引入了条件变量以及相关的操作:w a it。和 sig n a l()来实现同步操作。对条件变量执行w a i t O 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。sig n a l。操作用于唤醒被阻塞的进程。使用管程实现生产者-消费者问题/管程 m on itor P rod uc e rC on sum e r c on d ition f ul l,e m pty;in te g e rc
26、oun t:=0;c on d ition c;proc e d ure in se rt(ite m:in te g e r);b e g in ifc oun t=N the n w a it(f ul l);in se rt_ ite m(ite m);c oun t:=c oun t+1;ifc oun t=1 the n sig n a l(e m pty);e n d;f un c tion re m ove:in te g e r;b e g in ifc oun t=0 the n w a it(e m pty);re m ove =re m ove _ ite m;c oun
27、 t:=c oun t-1;if c oun t=N -1 the n sig n a l (f ul l);e n d;e n d m on itor;/生产者客户端proc e d ure prod uc e rb e g in w hil e true d o b e g in ite m =prod uc e _ ite m;P rod uc e rC on sum e r.in se rt(ite m);e n d e n d;/消费者客户端 proc e d urec on sum e rb e g in w hil e true d o b e g in ite m =P rod
28、 uc e rC on sum e r.re m ove;c on sum e _ ite m(ite m);e n d e n d;5.经典同步问题生产者和消费者问题前面已经讨论过了。1 .读者-写者问题允许多个进程同时对数据进行读操作,但是不允许读和写以及写和写操作同时发生。读者优先策略R c oun t:读操作的进程数量(R c oun t=0)C oun tM ute :对于 R c oun t 进行加锁(C oun tM ute =1)W rit e M ute _:互斥量对于写操作的加锁(W rit e M ute _=1)R c oun t=0;se m a phore C ou
29、n tM ute =1;se m a phore W ri te M ute _ =1;voidw rite r 0 w hil e(true)se m _ w a it(W rite M ute _);/T O DO w rite();se m _ post(W rite M ute _);/读者优先策略 voidre a d e r()w hil e(true)se m _ w a it(C oun tM ute _);if(R c oun t=0)se m _ w a it(W rite M ute _);R c oun t+;se m _ post(C oun tM ute _);/T
30、 O DOre a d();se m _ w a it(C oun tM ute );R c oun t一;if (R c oun t=0)se m _ post(W rite M ute _);se m _ post(C oun tM ute _);2 .哲学家进餐问题五个哲学家围着一张圆桌,每个哲学家面前放着食物。哲学家的生活有两种交替活动:吃饭以及思考。当一个哲学家吃饭时,需要先拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子。方案一:下面是一种错误的解法,考虑到如果所有哲学家同时拿起左手边的筷子,那么就无法拿起右手边的筷子,造成死锁。it de f in e N 5/哲学家个数 v
31、 o id p h il o s o p h e r(in t i)/哲学家编号:0-4 w h il e (TR U E)t h in k ();/哲学家在思考 t a k e _ f o r k(i);/去拿左边 的 叉 子t a k e _ f o r k(i+1)%N);/去拿右边的叉子e a t();/吃面条中.p u t _ f o r k(i);/放下左边的叉子 p u t _ f o r k(i+1)%N);放下右边的叉子 方案二:对拿叉子的过程进行了改进,但仍不正确#de f in e N 5/哲学家个数 w h il e(1)/去拿两把叉子 t a k e _ f o r
32、k(i);/去拿左边的叉子if(f o r k(i+l)%N)/右边叉子还在吗t a k e _ f o r k(i+1)%N);/去拿右边的叉子b r e a k;/两把叉子均到手e l s e /右边叉子已不在p u t _ f o r k(i);/放下左边的叉子w a it _ s o me _ t ime 0;/等待一会 儿 方案三:等待时间随机变化。可行,但非万全之策#de f in e N 5/哲学家个数 w h il e(l)/去拿两把叉子 t a k e _ f o r k(i);/去拿左边的叉子if(f o r k(i+l)%N)/右边叉子还在吗t a k e _ f o r
33、 k(i+1)%N);/去拿右边的叉子b r e a k;/两把叉子均到手e l s e /右边叉子已不在p u t _ f o r k(i);/放下左边的叉子w a it _ r a n do m_ t ime ();/等待随机长时间 方案四:互斥访问。正确,但每次只允许一人进餐s e ma p h o r e mu t e /互斥信号量,初值 Iv o id p h il o s o p h e r(in t i)/哲学家编号 i:0-4 w h il e (TR U E)t h in k();/哲学家在思考 P(mu t e _);/进入临界区t a k e _ f o r k(i);/
34、去拿左边的叉子t a k e _ f o r k(i+1)%N);/去拿右边的叉子e a t();/吃面条中.p u t _ f o r k(i);/放下左边的叉 子 p u t _ f o r k(i+1)%N);/放下右边的叉子V(mu t e _);退出临界 区 )正确方案如下:为了防止死锁的发生,可以设置两个条件(临界资源):必须同时拿起左右两根筷子;只有在两个邻居都没有进餐的情况下才允许进餐。/I.必须由一个数据结构,来描述每个哲学家当前的状态#de f in e N5#de f in e L E F T i/左邻居#de f in e R IGHT(i+1)%N/右邻居#de f
35、in eTHINK ING 0#de f in e HU NGR Y l#de f in e E A TING 2 t y p e de f in t s e ma p h o r e;in ts t a t e N;跟踪每个哲学家的状态2.该状态是一个临界资源,对它的访问应该互斥地进行s e ma p h o r e mu t e =1;临界区的互斥3.一个哲学家吃饱后,可能要唤醒邻居,存在着同步关系s e ma p h o r e s N;每个哲学家一个信号量 v o id p h il o s o p h e r (in t i)w h il e (TR U E)t h in k();t
36、 a k e _ t w o(i);e a t();p u t _ t o w(i);v o id t a k e _ t w o(in t i)P(&mu t e _);/进入临界区s t a t e E i =HU NGR Y;/我饿了 t e s t(i);/试图拿两把叉子V(&mu t e _);/退出临界区P(&s i);/没有叉子便阻塞v o idp u t _ t o w(i)P(&mu t e);s t a t e i =THINK ING;t e s t (L E F T);t e s t (R IGHT);V(&mu t e _);v o id t e s t (i)/尝试
37、拿起两把筷子 if (s t a t e i =HU NGR Y&s t a t e L E F T !=E A TING&s t a t e R IGHT !=E A TING)s t a t e i =E A TING;V(&s i):/通知第i个人可以吃饭了 6.进程通信进程同步与进程通信很容易混淆,它们的区别在于:进程同步:控制多个进程按一定顺序执行进程通信:进程间传输信息进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。_ 进程通信方式直接通信发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲
38、队列上,接收进程从消息缓冲队列中取得消息。Se n d和Re c e i v e原语的使用格式如下:Se n d (Re c e i v e r,m e s s a g e);发送一个消息 m e s s a g e 给接收进程Re c e i v e r Re c e i v e (Se n d e r,m e s s a g e);接收 Se n d e r 进程发送的消息 m e s s a g e间接通信间接通信方式是指进程之间的通信需要通过作为共享数据结构的实体。该实体用来暂存发送进程发给目标进程的消息。发送进程把消息发送到某个中间实体中,接收进程从中间实体中取得消息。这种中间实体一
39、般称为信箱,这种通信方式又称为信箱通信方式。该通信方式广泛应用于计算机网络中,相应的通信系统称为电子邮件系统。1 .管道管道是通过调用p i p e函数创建的,f d 0 用于读,f d l 用于写。t t i n c l u d e i n t p i p e(i n t f d 2 );它具有以下限制:只支持半双工通信(单向传输);只能在父子进程中使用。2 .命名管道也称为命名管道,去除了管道只能在父子进程中使用的限制。Si n c l u d e i n t m k f i f o(c o n s t c h a r _p a t h,m o d e _ t m o d e);i n t
40、m k f i f o a t(i n t f d,c o n s t c h a r _p a t h,m o d e _ t m o d e);F I F O常用于客户-服务器应用程序中,F I F O用作汇聚点,在客户进程和服务器进程之间传递数据。3 .消息队列间接(内核)相 比 于F I F O,消息队列具有以下优点:消息队列可以独立于读写进程存在,从而避免了 F I F O中同步管道的打开和关闭时可能产生的困难;避免了 F I F O的同步阻塞问题,不需要进程自己提供同步方法;读进程可以根据消息类型有选择地接收消息,而 不 像F I F O那样只能默认地接收。4.信 号 量它是一个计
41、数器,用于为多个进程提供对共享数据对象的访问。5 .共享内存允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种I PC o需要使用信号量用来同步对共享存储的访问。多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外_S I共享内存不是使用文件,而是使用使用内存的匿名段。6 .套接字与其它通信机制不同的是,它可用于不同机器间的进程通信。7 .线程间通信和进程间通信线程间通信s y nc h r o ni z e d 同步这种方式,本 质 上 就 是“共享内存”式的通信。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。wh
42、i le轮询的方式在这种方式下,T h r e a d A不断地改变条件,T h r e a d B不停地通过wh i le语句检测这个条件(li s t,s i z e()=5)是 否 成 立,从而实现了线程间的通信。但是这种方式会浪费C PU资源。之所以说它浪费资源,是 因 为J VM调 度 器 将C PU交 给T h r e a d B执行时,它 没 做 啥“有用”的工作,只是在不断地测试某个条件是否成立。就类似于现实生活中,某个人一直看着手机屏幕是否有电话来了,而不是:在干别的事情,当有电话来时,响铃通知T A电话来了。wa i t/no t i f y 机制当条件未满足时,T h r
43、 e a d A调 用wa i t()放 弃C PU,并进入阻塞状态。(不像wh i le轮询那样占用C PU)当条件满足时,T h r e a d B调 用no t i f y()通 知 线 程A,所谓通知线程A,就是唤醒线程A,并让它进入可运行状态。管道通信j a va.i o.Pi p e d lnp u t S t r e a m 和 j a va.i o.Pi p e d Ou t p u t S t r e a m 进行通信进程间通信管道(Pi p e):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。命名管道(na me d p i p
44、e):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mk f i f o或系统调用mk f i f o来创建。信号(S i g na l):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;L i nu _除了支持U ni _早期信号语义函数s i g a l外,还支持语义符合Po s i _.1标准的信号函数s i g a c t i o n(实际上,该函数是基于B S D的,B S D为了实现可靠信号机制,又能够统一对外接口,用
45、s i g a c t i o n函数重新实现了 s i g n a l函数)。消息(M e s s a g e)队 列:消息队列是消息的链接表,包 括P o s i _消息队列s y s t e m V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺共享内存:使得多个进程可以访问同一块内存空间,是最快的可用I P C形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。内存映射(ma p p e d me mo r y
46、):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。信号量(s e ma p h o r e):主要作为进程间以及同一进程不同线程之间的同步手段。套接口(S o c k e t):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由U n i _ 系统的B S D 分支开发出来的,但现在一般可以移植到其它类U n i 一系统上:li n u 和 S y s t e m V的变种都支持套接字。8.进程操作L i n u _ 进程结构可由三部分组成:代码段(程序)数据段(数据)堆栈段(控制块P C B)进程控制块是进程存在的
47、惟一标识,系统通过P C B 的存在而感知进程的存在。系统通过P C B 对进程进行管理和调度。P C B 包括创建进程、执行进程、退出进程以及改变进程的优先级等。一般程序转换为进程分以下几个步骤:内核将程序读入内存,为程序分配内存空间内核为该进程分配进程标识符P I D 和其他所需资源内核为进程保存P I D 及相应的状态信息,把进程放到运行队列中等待执行,程序转化为进程后可以被操作系统的调度程序调度执行了在 UN I 里,除了进程0(即 P I D=0 的交换进程,Sw a p p e r P r o c e s s)以外的所有进程都是由其他进程使用系统调用f o r k 创建的,这里调用
48、f o r k创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。操作系统内核以进程标识符(P r o c e s s I d e n t if ie r,即 P I D)来识别进程。进 程 0是系统引导时创建的一个特殊进程,在其调用f o r k 创建出一个子进程(即 P I D=1 的进程1,又 称 in it)后,进 程 0就转为交换进程(有时也被称为空闲进程),而进程1 (in it 进程)就是系统里其他所有进程的祖先。进程0:L in u 一引导中创建的第一个进程,完成加载系统后,演变为进程调度、交换
49、及存储管理进程。进程1:in it 进程,由0 进程创建,完成系统的初始化.是系统中所有其它用户进程的祖先进程。L in u _ 中 1号进程是由0号进程来创建的,因此必须要知道的是如何创建 0号进程,由于在创建进程时,程序一直运行在内核态,而进程运行在用户态,因此创建0号进程涉及到特权级的变化,即从特权级0变到特权级3,L in u 是通过模拟中断返回来实现特权级的变化以及创建0号进程,通过 将 0号进程的代码段选择子以及程序计数器E I P 直接压入内核态堆栈,然后利用ir e t 汇编指令中断返回跳转到0号进程运行。创建一个进程进程是系统中基本的执行单位。L i n u _ 系统允许任何
50、一个用户进程创建一个子进程,创建成功后,子进程存在于系统之中,并且独立于父进程。该子进程可以接受系统调度,可以得到分配的系统资源。系统也可以检测到子进程的存在,并且赋予它与父进程同样的权利。L in u _ 系统下使用f o r k()函数创建一个子进程,其函数原型如下:#in c l u d e p id _ t f o r k(v o id);在讨论f o r k O 函数之前,有必要先明确父进程和子进程两个概念。除了0号进程(该进程是系统自举时由系统创建的)以外,L i n u _ 系统中的任何一个进程都是由其他进程创建的。创建新进程的进程,即调用f o r k O 函数的进程就是父进程