** 一,并发和并行的区别**
并行:同时做某些事,可以互不干扰的同一时刻做几件事(不一定同时)。 并行:同一时刻做某些事,但是强调同一时刻做了几件事。
并发的解决方案
1,队列,缓冲区 假设只有一个窗口,陆续进入食堂打饭,排队的人就是队列,先进先出,解决资源使用问题。排成的队列,就是缓冲区。
2,争抢
只开一个窗户,可能没有秩序,谁的拳头大是吃饭,拳头大的抢到窗口,打完饭离开,后面的继续争抢再到下一个拳头大的。不管怎么争抢,总会只有一个人占据窗口,这个时候这个窗口只为这个人服务,不再为其他人提供服务,这就是一种锁机制。 争抢是一种高并发的解放方案,但是,不好,因为有人比较弱小,长时间抵不过拳头大的。
3,预处理
如果排长队的原因,是由于每个人打饭等候时间过长,比如要吃的菜没有,要现炒,没打着饭菜不走,锁定占着窗口。 可以提前统计大多数人爱吃的饭菜,最爱吃的80%的饭菜提前做好,保证供应,20%的冷门菜,现做。这样可以大大的减少排队打饭的时间,这种提前加载用户需要的思路,预处理思想,缓存常用。
4,并行
很多人来打饭,一个窗口搞不定,开多个窗户排多个队列,并行打饭。但是多开窗口,就意味着更多打饭的师傅守在窗口提供服务,造成成本的上升。日常可以通过更多服务器,或多开进程,线程实现并行处理,来解决并发问题,注意这些是水平扩展思想。
5,提速
提高单个窗口的打饭速度,也是解决高并发的方式。打饭人员提高工作技能,打饭人员换成手脚麻利的年轻人,或者单个窗口配置更多的服务人员,比如上菜,打饭的由不同的人来做,甚至为每某几个菜配置一个服务人员,都是提速的方法。 提高单个CPU性能,或单个服务器安装更多的CPU。这是一种垂直扩展思想。
6,消息中间件
地铁站外的走廊曲折,缓冲人流,进去之后在多口过安检进站。常见的消息中间件有RabbitMQ,ActiveMQ,RocketMQ,kafka等。 当然还有其他的解决方案比如分布式之类的,但是已经列举了常用的解决方案,不同的并发场景比如秒杀服务,访问量大的网站等是具有不同的策略的,而策略可能就是多种方式的优化组合。 例如食堂多开,开分店(多地),也可以把食堂修到距离员工最近的地方(就近)等。
二,进程和线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,一个程序的执行实例就是一个进程。 进程(process),是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 线程(thread),有时候也被称为轻量级进程(LightWeight Process,LWP),是程序执行的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。 进程和线程区别: 地址空间:同一个进程的线程共享本线程的地址空间,而进城之间则是独立的地址空间。 资源拥有:同一个进程内的线程共享本进程的资源如内存,I/O,CPU等,但是进程之间是独立的。 一个进程崩溃后,在保护模式下不会对其他进程造成影响,但是一个线程崩溃整个进程都会死掉。多以进程比线程更加健壮。 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要优于进程。
** 线程的状态**
状态 | 含义 |
---|---|
就绪(Ready ) | 线程能够运行,但在等待被调度。可能线程刚刚被创建,或刚刚从阻塞中恢复,或者被其它线程抢占 |
运行(Runnning) | 线程正在运行 |
阻塞(Blocked) | 线程等待外部事件发生而无法运行,如等待I/O操作 |
终止(Terminated) | 线程完成,或退出,或被取消 |