1.进程和线程的区别
进程是指在运行的一个应用程序;程序一旦运行就是进程;进行指程序执行的一个实例,它是程序已经执行到课中程度的数据结构的汇集;线程是系统分配处理器时间资源的基本单元,或者说是进行之内独立执行的一个单元执行流,进程是资源分配的最小单位;线程是程序执行的最小单位。
区别:1.1因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但安全性不高
1.2.体现在通信机制上面,因进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。
1.3.体现在CPU系统上面,线程使得CPU系统更加有效,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
1.4.体现在程序结构上,使用进程时,较常用if else嵌套来判定pid,使得程序结构繁琐,但是使用线程,基本可以甩掉它。
2使用进程的情况:需要更稳定和安全时,选择进程;
3使用线程情况:1需要频繁创建和销毁的使用线程;在需要大量计算,切换频繁时使用线程;多核分布使用线程;并行操作使用线程;
4.线程和进程关系:
4.1、一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
4.2、资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
4.3、处理机分给线程,即真正在处理机上运行的是线程。
4.4、线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
5.使用多线程的地方:5.1 最典型的应用比如tomcat, 内部采用多线程,上百个客户同时访问一个web应用的时候,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。5.2 需要异步处理的时候,需要使用多线程。CPU是多核心的话,就可以让一个CPU执行一个线程。如果只有一个CPU的话,底层是按照分时复用的原则,各个线程按照时间片来获得CPU资源。5.3 特别耗时的操作,如备份数据库,可以开个线程执行备份,前台不断向后台询问线程执行状态;5.4 一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,可以开50个线程,将1万条url分为50等分,每个线程验证200条,减少耗时;5.5查看任务的执行进度,开一个线程执行任务,添加一个整型变量,执行任务到一定程度就加1,另外开一个进程按时间间隔去访问这个变量,并反馈给用户;多线程就是为了充分利用cpu的资源,提高程序执行效率。
例子:开个QQ,开了一个进程;开了迅雷,开了一个进程。在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。所以一个进程管着多个线程。
多线程怎样防止线程死锁情况:产生死锁的条件:1.互斥条件:该资源任意一个时刻只由一个线程占用; 2.请求和保持条件:一个进程因请求资源而阻塞,对已获得的资源保持不放; 3. 不剥夺条件:线程已经获得资源在未使用完之前不能被其他线程强行剥夺,只能自己使用完毕之后才释放资源; 4. 循环等待的条件:若干进程之间形成一种头尾相接的循环等待资源关系,只要破坏其中之一就可以了。互斥条件无法破坏因为我们用锁就是想让他们互斥,可以破坏请求和保持条件(一次性申请所有资源),破坏不剥夺条件(占用部分资源的进程进一步申请资源,如果申请不到就主动释放占有的资源);破坏循环等待条件(靠按序申请资源来预防,按某一顺序申请资源,释放资源则反序释放)