- 1.多进程与多线程的优缺点以及适用情况:
(1)进程:从调度执行角度来说进程时一个正在运行的程序
进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。
注意的是,程序并不是进程,实际上两个或者多个进程不仅有可能执行同一程序,而且还有可能共享地址空间。
(2)线程:进程内部的一条执行路径,Linux内核并没有现成的概念,线程是通过一个与其他进程共享某个资源的进程来实现的
从内核的角度来说Linux把所有线程都当作进程来实现
查看某个进程内的线程:ps -ef 只打印进程 ps -elf 打印所有的线程
top -H -p 显示某个特定进程线程
Strace 跟踪系统调用 itrace 跟踪库函数
线程和进程的优缺点适应情况:
进程耗费资源多 开销大 安全 高速 钱多的好车
线程 造价低 占有资源小 容易堵塞 不安全 很多便宜的小轿车
- 2.多进程优点:
每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;通过增加CPU,就可以容易扩充性能;
可以尽量减少线程加锁/解锁的影响,极大提高性能,
每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。
- 3.多进程缺点:
逻辑控制复杂,需要和主程序交互;
需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大;
- 4. 什么时候使用多进程什么时候使用多线程:
最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,
这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……
- 5.多线程的优点:
无需跨进程边界;
程序逻辑和控制方式简单;
所有线程可以直接共享内存和变量等;
线程方式消耗的总资源比进程方式好。
- 6.多线程缺点:
每个线程与主程序共用地址空间,受限于2GB地址空间;
线程之间的同步和加锁控制比较麻烦;
一个线程的崩溃可能影响到整个程序的稳定性;
到达一定的线程数程度后,即使再增加CPU也无法提高性能,
例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
对32位系统来说,理论上的寻址范围是4G(2^32),但实际系统还要预留系统空间用于自身管理,一般来说真正的最大寻址范围都要小于4G。对于Linux来说,一个进程拥有的用户空间为0~0xBFFFFFFF,共3G,另外1G是内核空间;一个LInux进程在用户态最多访问3G内存,每个线程必须占用特定大小的堆栈空间(stack size),这个因素使32位系统创建的线程数不可能超过n=3G/StackSize
Windows的到0x7FFFFFFF,只有2G。(32位系统的寻址范围还可以扩大,应用某些扩展标准,例如PAE,最多能支持到16G到64G不等。但这个情况不在我的讨论范围)所以理论上,一个用户进程最大可以分配的内存是2G(实际能用的大约为1.5G),一个线程栈需要预留1M内存空间,那么理论数据:32位电脑最多可以开2*1024/1=2048个线程,即2000个左右线程。线程是好东西,但是不能滥用,因为像在windows系统下,系统是抢占式的,线程多了,系统在线程间切换也要花费非常多时间和资源。
32位机中,最大内存是4G,建一个进程,内核需要占用2G内存,进程本身使用2G。
线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。
- 6.多线程调试:
(1)gdb main 启动进入调试
(2)谁先碰到断点就切到谁里面
(3)Info threads 查看有哪些线程可以调试
(4)Thread id选择要调试的线程
(5)Set scheduler-locking[off|on|step] 设置线程运行方法
(6)l+行数 显示第几行
(7)b+行号 第几行加断点