Operating system Windows消息泵

Operating system Windows消息泵,operating-system,architecture,Operating System,Architecture,这只是一个提高我对操作系统体系结构理解的技术问题 我知道在执行Application.Run()方法时,会创建一个带有消息泵的新表单。从MSDN和其他在线文章中,我了解了它的线程安全性,甚至了解到Windows操作系统组件,如HAL层、核心操作系统服务和层次结构顶部的应用程序,也都使用消息传递在彼此之间进行通信 这种定制是仅适用于Windows还是也适用于Linux环境 这可以被认为是一个信号量吗?或者信号量的定义和上下文仅在多线程环境中有意义吗 请给我一些建议 谢谢 Subbu进程之间有许多通

这只是一个提高我对操作系统体系结构理解的技术问题

我知道在执行Application.Run()方法时,会创建一个带有消息泵的新表单。从MSDN和其他在线文章中,我了解了它的线程安全性,甚至了解到Windows操作系统组件,如HAL层、核心操作系统服务和层次结构顶部的应用程序,也都使用消息传递在彼此之间进行通信

这种定制是仅适用于Windows还是也适用于Linux环境

这可以被认为是一个信号量吗?或者信号量的定义和上下文仅在多线程环境中有意义吗

请给我一些建议

谢谢


Subbu

进程之间有许多通信方式,统称为IPC-进程间通信。由于历史原因,在类UNIX系统中,进程之间的通信使用消息循环以外的其他机制。UNIX进程通常通过管道(可以将其视为临时文件,只能在一个进程中写入,在另一个进程中读取)、信号(代码抢占某些进程的实际执行)或进程返回值(类似于函数返回)进行通信。还有许多其他的通信方式(套接字、共享内存、文件),但这些都是最常见的

至于信号量:我不确定这些应该如何与消息传递相关,信号量对象是为允许程序员创建关键代码段而设计的。因为在UNIX中,即使在不同的进程之间也可以共享信号量(不仅仅是一个进程中的不同线程),所以在任何多进程操作系统(几乎是当今的所有操作系统)中,即使没有线程支持,它们都是有意义的


好的,信号量甚至可以用于微纤-用户空间线程,它不会像线程那样耗尽时间量而抢占,但会手动将控制权让给另一个微纤(例如,当光纤即将开始长时间的阻塞操作(如从硬盘读取数据)时,它可能会请求数据,而不是阻塞切换到另一个需要CPU的光纤)进程之间的通信方式有很多种,统称为IPC-进程间通信。从历史原因来看,在类UNIX系统中,进程之间的通信使用消息循环以外的其他机制。UNIX进程通常通过管道进行通信(人们可以将它们视为临时文件,只能在一个进程中写入,在另一个进程中读取)、信号(代码抢占某些进程的实际执行)或进程返回值(类似于函数返回)。还有许多其他通信方式(套接字、共享内存、文件),但这些是最常见的

至于信号量:我不确定这些应该如何与消息传递相关,信号量对象设计用于允许程序员创建关键代码段。因为在UNIX中,信号量可以在不同进程之间共享(不仅仅是一个进程中的不同线程),所以在任何多进程操作系统中都是有意义的(这几乎是当今所有的操作系统),即使没有线程支持


好的,信号量甚至可以用于微纤-用户空间线程,它不会像线程那样耗尽时间量而抢占,但会手动将控制权让给另一个微纤(例如,当光纤即将开始长时间的阻塞操作(如从硬盘读取数据)时,它可能会请求数据,而不是阻塞切换到另一个需要CPU的光纤)。

Unix系统具有消息队列:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
#包括
#包括
#包括
int msgsnd(int msqid,const void*msgp,大小\u t msgsz,int msgflg);
ssize_t msgrcv(内部msqid,无效*msgp,大小msgsz,长msgtyp,内部msgflg);
与Windows消息相比,CSV消息的使用率要低得多,但操作方式非常相似。也是一个非常相似的概念,CSV()很好地实现了CSV(),这是一个优秀的多任务范例,因为它不会受到指数级复杂性增长的影响。我建议Unix系统程序员更多地使用消息队列

Windows消息也有点类似于Unix信号,但Unix信号(通常)没有参数,数量非常有限(通常只有32条,而Windows消息有数千条)信号处理程序必须在一个奇怪的挂起环境中执行,这使得它们不太实用。尽管如此,信号在Unix编程中比消息队列更受欢迎

关于信号量
与使用信号量(带有附加计数器)不同,您应该首先尝试使用互斥量,互斥量更轻,可用于同步同一进程内的线程。

Unix系统具有以下消息队列:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
#包括
#包括
#包括
int msgsnd(int msqid,const void*msgp,大小\u t msgsz,int msgflg);
ssize_t msgrcv(内部msqid,无效*msgp,大小msgsz,长msgtyp,内部msgflg);
与Windows消息相比,CSV消息的使用率要低得多,但操作方式非常相似。也是一个非常相似的概念,CSV()很好地实现了CSV(),这是一个优秀的多任务范例,因为它不会受到指数级复杂性增长的影响。我建议Unix系统程序员更多地使用消息队列

Windows消息也有点类似于Unix信号,但Unix信号(通常)没有参数,数量非常有限(通常只有32条,而Windows消息有数千条)信号处理程序必须在一个奇怪的挂起环境中执行,这使得它们不太实用。尽管如此,信号在Unix编程中比消息队列更受欢迎

关于信号量 您应该首先尝试使用互斥量,而不是使用信号量(带有附加计数器),互斥量更轻量级,可用于同步同一进程内的线程