进程包含PCB(进程控制块),数据和程序
进程和线程区别?
- 进程是系统资源分配的最小单位,线程是CPU调度的最小单位(程序执行的最小单位)。
- 一个进程可以包含多个线程但至少有一个线程,一个线程只能属于某一个进程。
- 不同进程间数据很难共享,同一进程的线程间很容易进行数据共享。
- 进程使用的内存地址可以上锁,一个线程使用完共享数据后另一个线程再使用。
- 线程才是操作系统真正要运行的东西,进程只是一个容器
进程间通信
进程间为什么需要通信?
- 数据传输:一个进程将数据传输给另一个进程
- 资源共享:一个进程和另一个或一组进程共享某些资源
- 信号传递:一个进程向另一个或一组进程传递某些信号,通知某个事件的发生
- 进程控制:一个进程控制另一个进程的运行,如debug
进程间通信的原理
每个进程都有自己的内存空间,该空间里的数据无法被其他进程看见,以此实现进程间的隔离。进程间通信需要在内核中开辟一块缓冲区,一个进程将自己空间中的数据写入内核开辟的缓冲区,另一个进程进行读取。
进程间通信的方式
管道
基于字节流,实质上是一个文件,一端对其进行读,另一端进行写。管道的生命周期随进程,进程结束,管道就消失。
信号量
通过信号量控制不同进程对同一共享资源的访问,当有进程使用资源时信号量-1(对应操作为P操作),当进程释放资源时信号量+1(对应操作为V操作。
文件共享
效率最高的一种方式,一个进程将数据输入到共享内存,另一个进程从共享内存读取数据。
共享内存是在物理地址空间上的一个内存,进程可以通过页表找到共享内存,将数据直接写入,不需要经过内核进行文件的拷贝。
套接字
套接字除可用于进程间通信外,也可用于不同设备间通信。
消息队列
基于消息,一个进程进行消息的读,另一个进程进行消息的写。生命周期随内核,需通过命令进行中断。
进程被挂起的情况
- 进程太多
- 进程死锁
- 用户请求
- 系统中断
线程间通信
线程间通信主要是为了实现多线程的同步。可以使用全局变量,锁机制,信号量,信号等几种方式进行通信。
锁机制包括互斥锁,条件变量和读写锁。
互斥锁:以排他的方式,防止数据被修改。
条件变量:线程被阻塞,只有满足某些条件才可继续运行。
读写锁:多个线程可共享数据,但对读是互斥的。
线程间共享和独占资源
共享资源
- 代码段
- 数据段(如全局变量)
- 打开的文件描述符
- 信号的处理
独占资源
- 虚拟机栈和本地方法栈
- 程序计数器:为了在多线程操作中保存线程当前的执行状态,便于状态恢复
- 线程id
- 错误返回码
临界区是指访问临界资源的程序代码
用户态和系统态
进程有两种模式,用户态和系统态,一般用户编写的程序在用户态下工作,当执行中断或系统函数调用时,切换到系统态。
进程状态
进程包含三种状态: 就绪态,运行态,阻塞态。
当进程被系统调用时由就绪态进入运行态,当缺少时间片时由运行态进入就绪态。当发生中断或者需要某个事件的发生时从运行态进入阻塞态,当需要的事件发生时由阻塞态进入就绪态。