Skip to content

进程线程协程

在多进程时候不能使用全局变量,但是使用了锁、关中断等机制实现互斥反应

在Linux之中可以使用man命令查看是不是安全的函数

man 3 malloc

malloc调用了全局链表,但是通过临区实现了互斥访问,所以可以大胆调用

进程

Linux下的每一个程序都会被封装成一个进程,用task_struct管理,在Linux下每一个进程的内存都是独立的,所以无论一个函数是不是可重入都可以调用。

进程之间通讯

使用第三方工具

  • 在每一个进程的4GB虚拟空间之中,3GB是各个进程独享,1GB内核是共享的,所以可以在内核中一片内存进行通讯
  • 磁盘是共享的,通过文件沟通
  • 共享内存,映射到同一块内存直接通讯

Linux工具

无名管道:有亲缘关系进程

有名管道:任意两个进程

信息量:进程间同步,包括system V信号量以及POISX信号量

消息队列:数据传输,包括system V消息队列以及POISX消息队列

共享内存:数据传输,包括system V共享内存以及POISX共享内存

信号:进程之间异步通讯

Linux新增API:signalfd、timerfd、eventfd

Socket:套接字缓冲区,不同主机,不同进程

D-BUS:桌面应用程序

线程

每个进程之间相互独立,不同进程要借助第三方,切换进程开销也很大

线程:一个进程之间可能有多个线程,共享代码段、数据段、地址空间、打开文件、信号处理等资源,每个线程又都有自己的单独的资源,如程序计数器、寄存器上下文、栈

问题:出现对共享资源安全访问,线程之间同步,一般使用互斥锁、条件锁、读写锁实现对共享资源的安全访问。

互斥锁:在一个线程使用的时候其他的线程不嗯使用,导会导致频繁的切换

使用条件变量,等待条件满足唤醒绑定到这个变量的线程

读写锁:允许多个线程同时读取,但是写的时候只允许一个进程,切禁止读操作

每个线程都有自己的上下文环境,自己的PC指针和栈

线程池

进程是资源分配的基本单元,线程是程序执行调度的最小单元

线程的开销除了开关锁、线程上下文切换,还有线程创建销毁

线程池:解决频繁使用线程,

实现方法:预先创建一些线程没有任务的时候阻塞,有任务的时候分配到指定的进程

组成

  • 管理线程:分配任务
  • 工作线程:实际执行的
  • 任务接口:创建任务

协程

线程实行有一定的瓶颈,对共享的资源不再使用锁,交给程序锁,一般是使用在彼此熟悉的合作式多任务

总结

进程最安全,协程效率最高

在不同系统上的分类有所不同