我正在研究操作系统(Silberscatz,Galvin等)。我的编程经验仅限于在编程文本或算法文本中偶尔编写运动问题。换句话说,我没有适当的应用程序编程或系统编程经验。我认为我的下面的问题是由于缺乏上述经验而导致缺乏背景。
我专门研究IPC机制。在阅读有关共享内存(SM)时,我无法想象使用SM进行通信的真实场景。在我的linux(ubuntu)机器上附加到同一SM段的进程检查(在小shell脚本中使用'ipcs')上传here
应用程序的大多数共享似乎与X deamon有关。据我所知,X是负责给我GUI的过程。我猜测这些应用程序(主要是留在我的任务栏上的小程序)与X共享有关其外观和显示值需要更改的数据。这是一个合理的推论吗?
如果是这样, 我的问题是,我的应用程序通过共享内存段与'X'进行通信与我调用'X'提供的某些API的应用程序之间有什么区别,并与'X'沟通需要刷新它们的外观? 差异我的意思是,为什么不使用后一种方法?
这不是用户进程和内核通信的方式吗?应用程序在需要时调用系统调用,比如读取文件,通过系统调用的参数传递文件名和其他相关信息?
您也可以向我提供常规使用的应用程序示例,这些应用程序利用共享内存和消息传递进行通信吗?
修改 我让问题更加清晰。我已将编辑过的部分格式化为粗体
答案 0 :(得分:1)
不同之处在于,作为开发人员,您可能无法访问这些函数中发生的事情,因此不一定要共享内存。
共享内存主要是两个应用程序可以写入和读取的特定内存区域。这个过程要求对内存的访问是同步的,所以事情不会被破坏。
使用某人的API并不意味着你正在与他们共享内存,该进程只会按照你的要求执行,并且可能会将该操作的结果返回给你,但这并不一定是通过共享内存。虽然它可以,但它一如既往地依赖。
一个人对另一个人的偏好我会说取决于特定应用程序的规格以及它正在做什么以及需要分享什么。我可以想象某种类型的大数据集将由共享内存共享,但将文件名传递给另一个应用程序可能只需要API调用。但在很大程度上取决于我要求的要求。
答案 1 :(得分:1)
首先,由于X服务器只是另一个用户空间进程,因此无法使用操作系统的系统调用机制。即使通过API完成通信,如果它是在用户空间进程之间,那么API背后也会有一些进程间通信(IPC)机制。可能是共享内存,套接字或其他内容。
通常在涉及大量数据时使用共享内存。也许有许多进程需要访问的数据,并且每个进程拥有自己的副本会浪费内存。或者需要在进程之间传递大量数据,如果要通过另一个IPC机制进行流式处理,一次一个字节就会更慢。
对于图形,程序保持包含图像,窗口或整个屏幕的像素图的缓冲区的情况并不罕见,然后需要定期将其复制到屏幕上。有时以非常高的速度......每秒30次或更多次。我怀疑这就是X尽可能使用共享内存的原因。