多任务
多任务:即同时进行多个不同的事务,如一边听音乐一边写文档等。
实现多任务涉及到并行与并发两种模式,
-
并行:同一时间点同时执行多个任务;
-
并发:同一个很小的时间片段内执行多个不同的任务。
如果一台计算机只有一个单核CPU那么它只能以并发的形式实现多任务。
在计算机中,任务是指可被CPU赋予执行权的对象,任务的执行只要依赖寄存器和内存。任务的切换过程就是对不同任务执行时寄存器和内存中值的保存和恢复。
进程
进程是资源分配的基本单位 ,也是操作系统从安全角度来说的隔离单元。同一个进程中也会有多任务的需求,所以就产生了线程和协程。
线程
线程是操作系统独立调度的基本单位,这些子任务处在相同的地址空间,它们共享进程资源 。
协程
协程并不是操作系统内核提供的功能,他是在用户态下实现的。协程的出现主要是为了实现高性能的网络服务器。
当系统中有大量IO请求,大部分的IO请求并未命中而发生调度,而网络服务器的存储是共享状态必然伴随大量的同步与互斥操作,这样使用线程的开销就非常大。协程主要是为了降低大量使用线程带来的时间和空间开销,
进程内协同
互斥
互斥即进程中不同的线程对同一组数据的操作是一种竞争关系,并且同一时刻只能由一个线程来操作。互斥也可以看作是锁,避免同时操作一组数据产生歧义。
一个线程在对一组数据进行操作的流程:加锁——>操作——>取消锁。
其中锁的类型又分为读锁和读写锁,读锁与读锁不互斥,读写锁与其他锁均互斥。所以对于服务器等对高并发要求很高的应用场景,加读写锁后的操作不能过于繁琐,以免影响服务器的正常性能。
同步
进程把任务分成几个小任务,分配给几个线程并行的执行,等待他们一起做完。
通信
进程内的线程之间可以直接读写同一进程中的数据进行通信
进程间协同
在一个进程中启动另一个进程的方式——创建子进程:
Linux:使用fork
Windows:使用CreateProcess
同步与互斥
进程间的锁(Mutex)与进程内的锁类似,只是标识互斥资源的方法不同,
Windows:使用名称标识资源
Linux:使用共享内存
信号量:本身是一个整型数值,代表着某种共享资源的数量。通过PV操作
P操作:请求或等待资源,执行P(S)时,S的值减1,如果S<0,说明没有资源可用等待其他进程释放资源。
V操作:释放并唤醒等待的进程,执行V(S)时,S的值加1,如果S<=0,说明有其他进程在等待中,唤醒其中一个。
资源共享
进程之间比较典型的共享资源:
- 文件系统
- 剪切板
其中,与文件系统相关的进程间协同机制有:文件、文件锁、管道、共享内存。
剪切板并不是一个常规的进程间通信的方式,因为共享和覆盖是非常不确定的。
网络间通信——socket
同在一个局域网中, 用于不同机器间的进程通信。对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区