这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
前言
刚学习的时候,对于进程和线程,并发与并行,同步异步,死锁等等一些名词的具体含义不太理解,导致后续的学习理解跟不上,在这里简单的整理一下。
进程与线程
- 进程:进程是动态概念,是程序在运行时的状态,每个进程都有独立的内存空间,进程与进程之间互不影响。系统运行一个程序既是一个进程从创建、运行到消亡的过程
- 线程: 线程是进程内的一个基本任务,每个线程都有自己的功能,是
CPU分配与调度的基本单位。一个进程可以有多个线程。
并发与并行
- 并行:同一时间,同时执行,各自做各自的事情,针对多核
CPU而言,每个CPU分配资源做自己的事- 并发:单个CPU,任务之间交替运行,但是由于交替时间间隔(时间片)很短,所以我们感觉上是同时运行,但是事实上还是有先后顺序的。
同步与异步
- 同步:一件事情按照顺序执行,比如去饭馆吃饭,排队点餐,我们只能等排在我前面的那一位点完,才轮到我们点餐,在这期间我们点餐的行为是处于等待状态的,大家一起点餐这件事就属于同步操作
- 异步:同样是点餐,现在我们去吃饭,可以通过手机下单,大家一起下单,下完单我们可以做自己的事,等到商家做好就可以了。这样大家一起点餐,互不干涉就属于异步操作。
从上面可以看出,异步操作的效率要比同步操作高很多,这只是针对与我们点餐的人,我们可以做更多的事,但是对于商家来说,改做的餐还是要一个一个做。所以这里的效率体现在我们,整个点餐的到制作整个行为并没有变化。
临界区
- 临界区用来表示一种公共资源与共享数据,可被多个线程使用
- 同一时间只能有一个线程访问临界区(阻塞状态)
死锁、饥饿、活锁
- 死锁:对公共资源进行争抢,但是又不愿意释放自己持有的资源,就会出现死锁。
- 饥饿:优先级较低的线程,一直获取不到资源。
- 活锁:资源空闲的时候,由于任务调度问题,没有线程去获取资源,相互等待。
线程安全
在拥有共享数据的多线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程可以正常且正确的执行,不会出现数据污染等意外情况。