I/O多路复用
概念描述
- I/O指的是网络I/O流
- 多路是指连接到Server上的多个TCP对象
- 复用是指共用一个或固定数量的线程与Server进行通讯
场景分析
- 大量的Client访问Server,造成Server中存在大量的Socket(TCP的服务套接字)。
- 一般情况下每个Client通过在Server中对应的Socket服务Server都需要Thread的支持。
- 但客观情况是,Server是有固定上限的Thread数量的(这个由服务器的性能决定)。
- 并且Client并不是都时刻访问服务器,Client能够接受一定时间的延迟。
解决思路
- 在这种场景下我们不可能为每一个Client对应的Thread创建线程,再结合Client不是时刻请求Server和其允许一定程度的延时。
- 因此,我们可以创建一定数量(一个或少数)的线程通过轮询或其他方式来让Client对应的Socket暂时使用这个线程去完成对Server的请求。
死锁
死锁的定义
- 多个进程在运行的过程中因争夺临界资源而导致的一个僵局。
- 当进程处于这种状态时,如没有外部介入下,进程将无法进行运行。
死锁产生的原因
死锁产生的必要条件
预防死锁
-
摒弃“请求和保持”条件 系统规定所有进程在开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源。 -
摒弃“不可抢占”条件 当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请。 -
摒弃“环路等待”条件 系统将所有资源按类型进行线性排队,并赋予不同的序号。 例如,令输入机的序号为1,打印机的序号为2,磁带机为3,磁盘为4。所有进程对资源的请求必须严格按照资源序号递增的次序提出。
检测死锁
解除死锁
进程和线程
- 进程是运行时程序的封装,是系统分配和调度资源的独立单位,实现了系统的并发性。
- 线程是进程的子任务,是cpu分配和调度的独立单位,保证程序的实时性和进程的并发性。
- 程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程而存在。
- 线程共享一段空间,进程独享一段空间。
进程间通信的方式
|