进程与线程之间的关系与区别
引入线程
在上一篇文章中我们简单提到了进程这个词,进程里包含四个属性(进程的状态,进程的优先级,进程上下文,进程的记账信息),在进程进程的创建的时候,操作系统需要分配资源,进程的销毁,需要释放资源,试想一下如果进行多进程程序编写的时候,我们可能会多次创建和销毁进程,这一来一回的操作势必就会导致资源的消耗以及程序的效率的下降,这时候就引入了线程的概念。
线程是进程进一步划分开来的,一个进程包含一个甚至多个线程。
在同一个进程中,线程与线程是共享资源的
进程的开销大,线程的开销小
注意进程与进程是独立的,也就是说进程一旦创建好,就独立占据操作系统给它分配的资源(内存资源,网宽资源,硬盘资源,CPU资源),所以进程如果崩溃了,是不会影响到其他进程的执行的。
但是如果一个进程里的某个线程崩溃了,是会影响到其他线程的,甚至导致这个进程的崩溃。
进程是系统分配资源的最小单位,线程是系统调度的最小单位。
线程
多进程编程最大的问题就是进程的开销大,所以我们才引入了多线程编程。线程的创建、销毁、调度效率比进程更高,并且有自己独立的执行任务。
对于处理同一件事情来说,我们可以派出一个小组来去解决,但是如果想要快点解决问题,我们可以加派更多的小组,假定每个小组的配备是一致的(并且设备的费用是远远高于人力的),这就开销大了,但是如果我们在每一个小组里加派更多的人,也就是将小组扩容,这些人我们可以理解为线程,这同样也可以解决问题。
在同一个进程中,我们可以创建多个线程,但是线程与线程之间是存在共享资源的,所以一旦线程数目过多,那么就会导致线程之间的调度开销也会随之增大,这时候程序的效率就会下降。
简单来说,就是进程能提供的资源就这么多,线程一旦过多,就会导致线程之间的疯狂抢夺,程序的效率就会下降。
上面说道,线程与线程之间是共享资源的,所以是会存在两个甚至多个线程共同抢夺同一份资源的,这时候程序就由可能会出 bug ,这些由线程出现的 BUG,我们称为线程安全问题 / 线程不安全。
如果一个线程出现异常,是有可能影响到整个程序的运行,甚至导致程序的崩溃,就算我们及时处理异常抛出异常也还是有可能没有办法阻止进程的终止。