目录
1.线程与进程的包含关系
线程是包含于进程的。进程是由一个或者多个PCB(process control block (进程控制块))组成的。一个进程至少包含一个线程,当然一个进程也可以包含多个线程。一个PCB用来表示一个线程。
2.线程与进程的用处
它们俩都用于实现并发编程。
3.线程与进程的区别
进程是大重量的,效率也低,每次建立进程,删除进程,调度进程都需要耗费很多的时间资源,而线程是轻量的,它在建立删除时不需要像进程一样重新建立内存指针,pid,文件描述符表等,因为这些数据在同一个进程中的线程是共享的,它只需要创建自己的PCB,如状态,优先级,上下文和记账信息。所以线程在创建销毁调度上效率是高很多的。
4.线程的优缺点
增加线程数可以使得任务效率变高,就比方是我们吃一桌饭,吃的人增多,那么我们把这桌饭吃完的速度就变快了,就不用重新开个房准备桌子椅子了,也就是增加线程是不需要重新再准备一份资源的(内存+硬盘),如图(图片的左上角是在同一个进程中,打错了,请读者注意,抱歉):
一个人吃的很慢,假设1min吃1kg,那就要吃100min
而我8个人吃就只用吃12.5min
这样就加快了效率,但是呢,线程一直变多效率也不会一直变快,到达一定数量时就不会使效率提高,还会使调度增大负担降低效率,并且可能出现线程不安全问题和线程异常问题。继续按照我们上述的例子,如图:
假设我们一桌就只能坐8个人,但是我们有15个人,这时候一号滑稽脸想吃,那么2号说“我给你让位置”,那么2号就吃不了了,1号上去吃,这时效率不仅没有提高,并且他俩换位置还消耗了时间,降低了效率。
在人数变多时这些滑稽脸不一定这么谦让,可能会出现抢食物的问题,这就是线程不安全问题。
那说不定有些滑稽脸更可怜,就一直吃不到,他就想着我吃不到那大家都别吃了。他就想掀桌了(抛出异常),如果有合理的方法劝住他(catch)合理解决,那还好,如果没劝住,那大家都吃不了,就相当于是整个进程都崩溃了,其他线程也没得工作了。
所以线程会影响到同一个进程中的其他线程。
线程之间因为是共用同一块内存和硬盘资源,所以不需要进行通讯,直接从资源中获取就好了。
5.进程的优缺点
进程和进程之间是互不影响的,它是有隔离性的,所以和上述讲的线程不一样,进程有一个崩溃了另一个进程还能继续运行。但是为了处理这100kg的饭菜,我多开了一间房间,我还要多给出一张桌子,照样还是要给出一个人,那么我的用的资源就多了,效率也会变低。
如果要进行进程之间的通讯,我们一般就要重新准备一块空间,然后把进程的信息发到这块空间上进行交互,我们一般使用“文件”或是“网络”进行通讯。
6.总结
综上所述,我们可以知道,进程是资源分配的基本单位,而线程是调度执行的基本单位。