• System V 与 POSIX


    System V 以及POSIX 对信号量、共享内存、消息队列等进程之间共享方式提供了自己的解决方案。因此,在学习时难免存在疑惑,到底有什么区别,哪种方式更佳。经过网上搜索各种博客,做出简单的总结。

    历史

           UNIX两大贡献者贝尔实验室和BSD,在进程之间通信侧重不同,前者基于内核对进程之间的通信手段进行了改进,形成了“System V IPC”,而后者则是基于网络形成了套接字。

           而POSIX则是IEEE制定的标准,目的是为运行在不同操作系统上的软件提供统一的接口,实现者则是不同的操作系统内核开发人员。

    效率

           在信号量这种常用的同步互斥手段方面,POSIX在无竞争条件下是不会陷入内核的,而SYSTEM V则是无论何时都要陷入内核,因此性能稍差。

    冗余

           POSIX的sem_wait函数成功获取信号量后,进程如果意外终止,将无法释放信号量,而System V则提供了SEM_UNDO选项来解决这个问题。因此,相比而言,后者更加可靠。

    应用

           可能有小部分操作系统没有实现POSIX标准,System V更加广泛些,但是考虑到可移植性POSIX必然是一个趋势。在IPC,进程间的消息传递和同步上,似乎POSIX用得较普遍,而在共享内存方面,POSIX实现尚未完善,system V仍为主流。

    多线程与多进程

           在观察使用进程间通信手段后,会发现在多线程中使用的基本是POSIX标准提供的接口函数,而多进程则是基于System V。但是两者难道就不能交叉使用吗?

           多线程使用System V接口---不建议。线程相对于进程是轻量级的,例如调度的策略开销,如果使用System V这种每次调用都会陷入内核的接口,会丧失线程的轻量优势。所以,多线程之间的通信不使用System V的接口函数。

           多进程使用POSIX也是允许的

         以mutex为例 ,POSIX的mutex如果要用于多进程,需要实现如下两点要求:(对于SEM信号量相对简单,因为提供了有名SEM的能够用于多进程,它是内核持续的,详见http://blog.csdn.net/firstlai/article/details/50706243)

    • mutex能为多个进程所见;
    • mutex本身不额外使用进程本地的内存,如堆内存。

           对于第一条是很好满足的,只需要使mutex驻留在共享内存中,创建子进程之前初始化mutex即可;对于第二条GCC的pthread实现也满足,但是需要通过设置mutex的属性,mutex默认是PTHREAD_PROCESS_PRIVATE,即仅支持单进程。如果mutex驻留于共享内存,但pshared为PTHREAD_PROCESS_PRIVATE,此时多进程操作该mutex的行为是未定义的。因此需要设置为 PTHREAD_PROCESS_SHARED即可。

    1.  
      #include <pthread.h>
    2.  
      #include <sys/mman.h>
    3.  
      #include <sys/types.h>
    4.  
      pthread_mutex_t *mtx = NULL;
    5.  
      int main() {
    6.  
      //~ reside mutex in shm
    7.  
      mtx = (pthread_mutex_t*)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
    8.  
      if (mtx == MAP_FAILED) {
    9.  
      perror("mmap");
    10.  
      exit(1);
    11.  
      }
    12.  
      pthread_mutexattr_t attr;
    13.  
      pthread_mutexattr_init(&attr); //~necessary, or weird EINVAL error occurs when operating on the mutex
    14.  
      pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    15.  
      pthread_mutex_init(mtx, &attr);
    16.  
      //~ here the fork
    17.  
      pid_t pid = fork();
    18.  
      if (pid < 0) {
    19.  
      perror("fork");
    20.  
      exit(1);
    21.  
      } else if (pid > 0) {
    22.  
      //~ parent
    23.  
      //~ lock lock lock
    24.  
      } else {
    25.  
      //~ child
    26.  
      //~ lock lock lock
    27.  
      }
    28.  
      return 0;
    29.  
      }

    参考文献

    http://blog.chinaunix.net/uid-26651253-id-3342091.html

    http://blog.csdn.net/xuemiao1234/article/details/6869182

    https://www.zhihu.com/question/35169528

    http://blog.csdn.net/liangxiaozhang/article/details/8504076

  • 相关阅读:
    SynchronousQueue 的联想
    Spring Cache
    CSUOJ 1011 Counting Pixels
    CSUOJ 1973 给自己出题的小X DFS
    CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列
    CSUOJ 1900 锋芒不露
    CSUOJ 1808 地铁
    CSUOJ 1895 Apache is late again
    CSUOJ 1781 阶乘除法
    CSUOJ 1560 图书管理员的表白方式
  • 原文地址:https://www.cnblogs.com/cyyljw/p/9535499.html
Copyright © 2020-2023  润新知