01 UNIX IPC 第一弹 综述

UNIX IPC 第一弹 综述


0. 为什么会有这边文章?

一直对这方面的技术只有些模棱两可的了解,但又没有个统一完整的认识,在学习了《Modern Operating System》和《Advanced Programming in the UNIX Environmet》的相关章节后,做一个总结。

1. 什么是进程(process)?为什么要有进程?

进程是可执行程序加载到内存后,在CPU上执行的代码,包括一些相关的资源及状态,是一个动态的,变化的状态。

进程是系统资源分配的基本单位,一个程序要想执行,则必须要加载到内存中,在执行时要有相关的软硬件资源,所以系统要给“进程”分配好所有的资源后,才能使进程达到ready的状态,进而再在CPU上执行。

两个经典的“进程”定义:

  • A process is just an instance of an executing program, including the current values of the program counter, registers and variables. -- Modern Operating System v4

进程是一个可执行程序的实例,包含PC值,寄存器值,变量值。

  • 进程是计算机上关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统的基础。它的执行需要系统分配资源创建实体后才能运行。

API

  • fork()
  • vfork()

2. 什么是线程?为什么要有线程?

线程是执行的最小单位,是在CPU上运行的实体,是轻量级的进程,之所以产生是因为进程创建及销毁带来大量的系统资源损耗。线程的创建及销毁比进程要快10-100倍。

有了线程可以更好的支撑并行编程,更好的支持SMP处理器,减小上下文切换,性能更高。

分类,根据调度者是在核内还是核外分为

  • 用户级线程
  • 内核级线程

Linux使用混合模型。

POSIX线程模型

3. 什么是进程间通信?为什么要有进程间通信?

进程由于地址空间的隔离,需要某种相互通信的机制,以达到协同工作的目的。

进程通信(Inter Process Communication)存在以下几种:

  • 进程与进程间
  • 线程与线程间
  • 进程与线程间

进程通信主要考虑解决以下问题:

  • 如何进行通信
  • 如何避免竞争
  • 如何保证资源的一致性

经典问题

  • 生产者消费者问题
  • 哲学家就餐问题
  • 读写者问题

4. 进程间通信有哪些方式?

进程与进程间通信的方式有:

  1. 共享内存
  2. 消息队列
  3. 信号量
  4. 有名管道(FIFO)
  5. 无名管道(pipe)
  6. 信号
  7. 文件
  8. 套接字socket

线程与线程间通信的方式:

  第一部分是可以使用进程通信的方式:

  1. 共享内存
  2. 消息队列
  3. 信号量
  4. 有名管道(FIFO)
  5. 无名管道(pipe)
  6. 信号
  7. 文件
  8. 套接字socket

  第二部分是线程特有的方式:

  1. 互斥量
  2. 自旋锁
  3. 条件变量
  4. 读写锁
  5. 线程信号
  6. 全局变量

5. IPC方式各有哪些优缺点?

6. IPC通信还有那些不足?

  1. 性能?
  2. 易用性?
  3. 通用性?

原文地址:https://www.cnblogs.com/Freeee/p/11588423.html

时间: 2024-08-02 16:47:35

01 UNIX IPC 第一弹 综述的相关文章

C#Light 和 uLua的对比第一弹

初始化 做一样的初始化,其实是没办法对等的 C#Light的Env 不等于Lua的LuaState C#Light的执行有完全的执行堆栈,完整的作用域,lua都没有 C#Light有完整的class 函数,继承特征,lua都没有 C#Light可以用VS做编辑器,lua? 为了保持平等对抗,三个测试先做一遍,再依次执行 测试1 ,简单的一次创建给个名字并销毁,测试300次 测试2,调用Debug.Log打印,执行300次 测试3,一次性在脚本里多调用一些方法,创建10个物体再销毁 测试一结果:

Ubuntu闪电入门第一弹

目录: 一.设置主机名 1.临时修改主机名 2.永久修改主机名 二.设置网络 1.配置静态IP地址 2.配置DNS服务器解析 3.修改DNS本地解析 三.软件包管理 1.dpkg管理软件包 2.apt管理软件包 四.运行级别 五.文件传输工具lrszs 1.发送文件sz 2.接收文件rz 六.磁盘管理 1.磁盘分区 2.磁盘分区格式化 3.挂载磁盘分区 一.设置主机名 1.临时修改主机名(重启系统后失效) $ sudo hostname ikki $ hostname ikki 2.永久修改主机

javascript之【贪吃蛇系列】第一弹:简单的贪吃蛇实现

参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 以上博客是参考,毕竟第一次做,真让自己盲人摸象做不出来. 不过我在其上做了一些改进,界面等效果看起来更好一些. 下图是在Chrome上运行的效果,但是火狐和IE会不兼容,onkeydown事件不能正确调用 这里用了一张图把贪吃蛇制作过程的思想画了出来,画的有点简陋: 下面就是把代码发上来,上边有详细的解释: <html> <head> <title>

codechef 营养题 第一弹

第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5XXoERDanUcdxw08SmRj1a5VY1o7jpW1xYv_V1kuYao1Pg4yKdfG4MfNsNAEa codechef problems 第一弹 一.Authentication Failed原题题面Several days ago Chef decided to registe

FluentData 学习 第一弹

地址: http://fluentdata.codeplex.com/ 前世: FluentData 我们公司用的一个增删改查的里面的持久层.之前还不知道 这个持久层叫FluentData.  某天看见群里 说 某视频网站里面 居然在讲这个开发框架,还收费.我搜了一下.fluentdata有源代码. 这个13年有过记载.不过我是新手.什么也需要 学习一下.  和 室友说了一下微型orm ,他们 呢  用的  微型orm是 Dapper .可以去了解一下. 废话真多,完毕. FluentData

The Internet Communications Engine (Ice) 跨平台异构通讯方案 第一弹-ICE简介

.net中的通讯方案很多,从.net Remoting,MSMQ,Webservice,WSE,WCF等等,他们都有一个特点,易用,但是都不能跨语种异构,如果你服务端要用java开发,客户端用C#开发,或者其它语言譬如C++, Python,PHP, Ruby, Objective-C,等等,那么.net提供的解决方案将不再有效.现在,隆重推出跨平台异构方案ICE.ICE官网:http://www.zeroc.com/ice.html 简介:The Internet Communications

MongoDB第一弹

下载: MongoDB下载地址: http://www.mongodb.org/ 我下载的是windows32的MSI. 安装: next就可以. 新建: 新建data文件夹,在data里面再建db和log两个子目录. 启动: 进入cmd,到当前MongoDB的bin目录下面,启动 "mongd"!(不是mongo),修改db路径. 然后打开浏览器输入localhost:27017,会出现: 最后在cmd中启动mongo.exe,出现: 基本操作: insert: find: upda

C# 二进制替换第一弹 byte 数组替换

Unity 3D本地发布WebPlayer版时遇到提示:"Failed to download data file"(如上图),遇到这个问题就是指Web服务器并没有支持这种*.unity3d文件类型.需要做的是在Web服务器中添加MIME类型: 1.IIS 7 及以上版本: 在功能视图的IIS选项卡中: 双击打开MIME,选择"添加": .unity3d application/octet-stream 2.IIS6版本: 右击计算机名,选择属性,找到MIME类型,

你好,博客园!!第一弹~局域网下的简易聊天室,socket与多线程简结

发觉博客园里面关于这些基本知识点的详细内容真是应有尽有,所以这里的随笔就不再重复了,就积累一下简单的用法-- 1.Socket 最近学网络编程,也就是Socket,套接字,一个用来建立链接传输数据的工具. 数据传输发生在"客户端"与"服务端"之间,下面是一种建立连接传输数据的简单方法: (1)客户端 1 try{ 2 //服务端ip 3 String ip = "127.0.0.1"; 4 //服务器端口 5 int port = 5000; 6