使用进程实现并行执行的问题有两个。第一,创建进程占用资源太多;第二,进程之间的通信需要数据在不同的内存空间传来传去,无法共享。
**
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,
而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

  1. 简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高。
  3. 进程在执行过程中拥有独立的内存单元,而多个线程是共享内存,从而极大地提高了程序的运行效率。
  4. 线程在执行过程中与进程还是有区别的。 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。 但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。 这就是进程和线程的重要区别。

线程崩溃是否会造成进程崩溃

线程有自己的 stack,但是没有单独的 heap,也没有单独的 address space。
只有进程有自己的 address space,而这个 space 中经过合法申请的部分叫做 process space。Process space 之外的地址都是非法地址。
当一个线程向非法地址读取或者写入,无法确认这个操作是否会影响同一进程中的其它线程,所以只能是整个进程一起崩溃。


总结:
要注意:

  1. 区分操作系统,这里是Linux是实现
  2. 区分用户态于内核态

线程有自己的 1、本地数据-线程栈,也就是独立的栈空间。2、进程内共享的全局数据。3、线程私有数据

一个进程内肯定会有一个主线程,可以有多个线程。对于内核而言,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task),由一个统一的结构 **task_struct** 进行管理。内核会有相应的链表把这些 **task_struct 串起来。**``**这也就是为什么线程是操作系统调度的最小粒度了。**

那么如何区分进程和线程呢?主要看 pidtgid

  1. 任何一个进程,如果只有主线程,那 pid 是自己,tgid【也就是target id】 是自己,group_leader 指向的还是自己。那这就是一个进程了。
  2. 但是,如果一个进程创建了其他线程,那就会有所变化了。线程有自己的 pid,**tgid 就是进程的主线程的 pid**,group_leader 指向的就是进程的主线程。这时候他就是一个线程了