码迷,mamicode.com
首页 > 编程语言 > 详细

线程的理解和并发解决方案

时间:2019-04-01 18:50:45      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:线程   预处理   images   访问量   资源   解决方案   缓冲   ima   线程等待   

一,并发和并行的区别

并行:同时做某些事,可以互不干扰的同一时刻做几件事(不一定同时)。
并行:同一时刻做某些事,但是强调同一时刻做了几件事。

并发的解决方案

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) 线程完成,或退出,或被取消

技术图片

线程的理解和并发解决方案

标签:线程   预处理   images   访问量   资源   解决方案   缓冲   ima   线程等待   

原文地址:https://blog.51cto.com/berniem2m/2372602

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!