多线程
越深入的学习之后,经常能听到这么一个词----多线程。之前的学习经常会提到多进程,父进程在忙不过来的情况下,会创建子进程进行帮忙,这样就是一个多进程的任务。那么什么是多线程呢?
在传统的操作系统中,进程就是一个运行中程序的描述信息----pcb,控制程序的运行。
在Linux操作系统下,pcb是进程,因为Linux下线程是以进程pcb模拟实现线程;也有人称为轻量级进程。但是Linux下没有为线程设计一个pcb来控制线程的运行。
上图介绍了线程组是个什么组合。
进程就是线程组,包含了一个或多个线程
从上图来看,Linux线程是PCB,因为CPU调度程序运行是调度pcb,所以线程是CPU调度的基本单位。
因为进程是线程组,程序运行时,资源是分配给整个线程组的,因此线程是资源分配的基本单位。
vfork()创建一个子进程共用同一个虚拟地址空间,怕出现调用栈混乱,因此子进程运行完毕或者程序替换后父进程才开始运行。
多线程和多进程都可以并行多任务,那么哪个执行起来比较好呢
从线程的角度来看,优点:
1、一个进程中的线程共用同一个虚拟地址空间
2、线程间通信更为方便
3、线程的创建/销毁成本更低
4、同一个进程间的线程调度成本要更低
5、执行力度更加细致
缺点:
线程缺乏访问控制----健壮性低。
比如exit(),异常针对的是整个进程,进程退出,那么线程也就不存在了。这样的话线程的可控性比较低
共同优点:都可以并发/并行处理任务,提高处理效率
多进程/多线程进行多任务处理的优势体现与细节:
CPU密集型程序:程序中都是大量的运算操作
IO密集型程序:程序中都是大量的IO操作
共同缺点:对临界资源操作需要考虑的更多,编码更加复杂
线程创建,线程终止,线程等待,线程分离
先回顾一下进程创建。在之前的总结中我们通过fork()函数和vfork()函数创建子进程。
-
fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中。
-
vfork是 创建一个子进程,并和父进程的内存数据share一起用。
这两个的区别是,一个是copy,一个是share。
fork函数是在父进程执行到子进程创建的位置,将内存数据拷贝进入,等待子进程执行,子进程执行完后,退出后父进程在继续执行。
vfork函数是保证子进程先执行,当子进程调用exit()或exec()后,父进程往下执行
操作系统并没有为