您的位置:首页 > 运维架构 > Linux

MMU作用,linux进程间通信方式 进程切换原因步骤

2012-10-03 10:00 357 查看
MMU的两个主要功能是:

1. 将虚地址转换成物理地址。

2. 控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。

MMU的作用有两个:地址翻译和地址保护 软件的职责是配置页表,硬件的职责是根据页表完成地址翻译和保护工作。

通过MMU的映射,则可实现程序完全运行在SDRAM之中。

通过MMU可实现不连续的物理地址空间映射为连续的虚拟地址空间。

通过MMU可以控制地址空间的访问权限,从而保护这些代码不被破坏。

MMU的实现过程,实际上就是一个查表映射的过程。建立页表(translate table)是实现MMU功能不可缺少的一步。页表是位于系统的内存中,页表的每一项对应于一个虚拟地址到物理地址的映射。每一项的长度即是一个字的长度(在ARM中,一个字的长度被定义为4字节)。页表项除完成虚拟地址到物理地址的映射功能之外,还定义了访问权限和缓冲特性等。

Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal),套接字(Socket)

(1) 管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间进行通信;

(2) 命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建;

(3) 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD即能实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数的功能);

(4) 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它;

(5) 消息队列(message queue):消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能成该无格式字节流以及缓冲区大小受限等缺点;

(6) 信号量(semaphore):信号量主要作为进程间以及同进程不同线程之间的同步手段;

(7) 共享内存 (shared memory):它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥;

(8) 套接字(Socket):它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信。起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字;

Linux 传统的进程间通信有很多,如各类管道、消息队列、内存共享、信号量等等。但它们都无法介于内核态与用户态使用,原因如表

通信方法 无法介于内核态与用户态的原因

管道(不包括命名管道) 局限于父子进程间的通信。

消息队列 在硬、软中断中无法无阻塞地接收数据。

信号量 无法介于内核态和用户态使用。

内存共享 需要信号量辅助,而信号量又无法使用。

套接字 在硬、软中断中无法无阻塞地接收数据。

进程切换的原因

中断的发生和更高优先级进程的唤醒,或者进程消耗完时间片

阻塞的发生

从kernel看进程

如何才能够在单个CPU上运行多个进程呢?很自然的想法就是保存老进程的状态,然后加载新进程的状态。

进程主动放弃继续执行,例如yield系统调用和一些阻塞型的系统调用会引发进程切换,某些异常的发生也会导致进程切换的发生。

由内核主动暂停进程的执行,转而执行别的进程或中断。例如中断的发生和更高优先级进程的唤醒,或者进程消耗完时间片等等因素,都会导致内核暂停动迁进程的执行。

判断线程是不是内核线程的有效方法就是判断PCB中的内存描述符是否为空

如果内存描述符为空,则就是内核线程;否则就是普通线程。

在应用程序开发中,能用线程则尽量用线程来解决,这样就能将不同执行流程之间的切换代价降至最小。

进程切换的步骤

1.保存处理器的上下文,包括程序计数器和其它寄存器

2.用新状态和其它相关信息更新正在运行进程的PCB

3.把原来的进程移至合适的队列-就绪、阻塞

4.选择另一个要执行的进程

5.更新被选中进程的PCB

6.从被选中进程中重装入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: