进程线程通信

来源:互联网 发布:安卓触屏校准软件 编辑:程序博客网 时间:2024/05/29 04:39

进程和线程

进程

  • 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。
  • 进程是正在运行的程序的实例。

线程

  • Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程。

进程特征

  • 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进;
  • 结构特征:进程由程序、数据和进程控制块三部分组成;

进程切换

  • 切换:从正在运行的进程那里收回处理器,使待运行的进程占用处理
  • 切换过程:把正在运行的进程占用的处理器的寄存器中的中间数据(进程的上下文)存储到进程私有堆栈寄存器中,把待运行进程的断点送入处理器的程序指针PC,此时这个进程已经占有处理器的使用权了。

进程状态

  • 就绪状态:已获得除处理器外的所需资源,等待分配处理器资源;
  • 运行状态:占用处理器;
  • 阻塞状态:条件未满足,无法执行

进程状态转换

  • 就绪----->运行;条件,进程调度
  • 运行----->就绪;条件,时间片用完
  • 运行----->阻塞;条件,等待某个事件发生
  • 阻塞----->就绪;条件,某个事件已经发生

引发进程创建的事件

  • 用户登录(内核):分时系统,终端用户登录,得为终端创建一个进程
  • 作业调度(内核):批处理系统,一定算法调度某作业,将作业装入内存,为其分配资源,需为它创建进程
  • 提供服务(内核):运行的用户程序提出某种请求
  • 应用请求:应用进程的需求,由它创建新的进程以便并发运行完成某个任务

进程创建过程

  1. 申请空白PCB
  2. 为新进程分配资源
  3. 初始化进程控制块
  4. 插入就绪队列

进程通信目的

  • 数据传输
  • 共享数据
  • 通知事
  • 资源共享
  • 进程控制

进程之间如何通信

同一主机上的进程

UNIX进程间通信方式

  • 管道(PIPE):半双工通信方式;父子进程间使用;无格式的字节流;管道缓冲区有限(存在于内存);
  • 有名管道(FIFO):半双工通信方式;允许无亲缘关系进程间通信;
  • 信号(Signal):复杂的通信方式;用于通知某个接收进程某个事件已经发生;

System V进程间通信方式

  • 信号量(Semaphore):计数器;控制多个进程对共享资源的访问;锁机制
  • 消息队列(Message Queue):消息的链表;存放在内核;克服信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点;
  • 共享内存(Shared Memory):映射一段能被其他进程访问的内存(共享内存由进程创建);共享内存最快的IPC方式;

POSIX 进程间通信

  • posix消息队列
  • posix信号灯
  • posix共享内存

网络主机间的进程通信

  • Remote Procedure Call远程过程调用
  • Socket:基于TCP/IP协议的通信方式(可用于不同主机之间进程通信)

管道实现机制

  • 管道是由内核管理的一个缓冲区;
  • 管道的一端连接一个进程的输出。这个进程会向管道中放入信息。
  • 管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息
  • 当两个进程都终结的时候,管道也自动消失。
  • 借助了文件系统的file结构和VFS的索引节点inode
  • 将两个file结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的
  • 一个命名管道实际上就是实现一个FIFO文件;
  • 命名管道一旦建立,之后它的读、写以及关闭操作都与普通管道完全相同

流管道s_pipe

线程之间如何通信

  • 使用全局变量
  • 使用消息实现通信:消息队列
  • 使用事件CEvent类实现线程间通信:监视处于有信号状态的事件

线程间的同步方式

  • 临界区
  • 互斥量(内核对象):可在不同进程间实现同步
  • 信号量(内核对象):可以同一时刻允许多个线程访问同一资源
  • 事件(内核对象):一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。
原创粉丝点击