Linux--进程与线程总结

文章目录

  • 1. 进程
    • 进程间同步的方式
  • 2. 线程
  • 3. 进程与线程
  • 4. 多线程与多进程

1. 进程

  1. 进程是拥有资源的独立单位(不管系统中是否有线程);
  2. 程序是静态的,不涉及进程,进程是程序运行时的实体;
  3. 互斥锁就是标记资源访问状态的一个计数器;为1表示当前没有进程访问临界资源,临界资源处于可访问状态;
  4. 在一段时间内,只允许一个进程访问的资源被称为临界资源;
  5. 进程间通信:管道、套接字、共享内存、消息队列;
  6. 进程之间具有独立性,拥有自己的虚拟地址空间,因此无法通过各自的虚拟地址进行通信;
  7. 进程间通信是通过内核中的缓冲区、文件以及网络通信实现的。

进程间同步的方式

  1. 因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享;
  2. 任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么 在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开;
  3. 信号允许多个线程同时使用共享资源;
  4. 如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。

2. 线程

  1. 在Linux系统中,线程是处理器调度的基本单位;
  2. 操作系统的最小调度单位是线程
  3. 线程自己不拥有系统资源;
  4. 每个线程在进程虚拟地址空间中拥有独立的栈空间;
  5. 线程独有:栈,寄存器,信号屏蔽字,errno…等信息。
  6. 多个线程各自有一个栈,共有一个堆;
  7. 耗时的操作使用线程,提高应用程序响应;
  8. 由于线程没有独立的地址空间,因此同一个进程的一组线程可以访问该进程资源,这些线程之间的通信也很高效;
  9. 线程的通信速度更快,切换更快,因为他们在同一地址空间内;
  10. 线程使用公共变量/内存时需要使用同步机制,因为他们在同一地址空间内;
  11. 线程拥有自己的栈空间且共享数据,资源消耗更小,且便于进程内线程间的资源管理和保护,否则会造成栈混乱;
  12. 线程包含CPU现场,但是线程只是进程中的一个执行流; 多CPU系统中,使用线程提高CPU利用率;
  13. 系统支持线程需要内核支持,用户态线程的切换在用户态实现,不需要内核支持;
  14. 一个线程可以创建和撤销另一个线程;
  15. 在有多个线程的情况下,主线程的退出,并不影响其它线程的运行;
  16. 线程安全指的是当前线程中对各项操作时安全的,但不表示内部调用的函数是安全的,函数可重入只是线程安全的一个要素;
  17. pthread_create是一个库函数运行在用户态,创建的是用户级线程,在内核中通过轻量级进程实现调度;
  18. 可以使用ps -L命令查看轻量级进程信息, pthread_self用于获取用户态线程的tid,getpid用于获取当前进程的id。

3. 进程与线程

  1. 线程和进程都可并发执行;
  2. 进程是资源分配的基本单位,线程是调度的基本单位;
  3. 进程——资源分配的最小单位,线程——程序执行的最小单位;
  4. 进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间);
  5. 线程的粒度小于进程,通常多线程比多进程并发性更高;
  6. 进程是程序的一次执行,而线程可以理解为程序中运行的一个片段;
  7. 线程之间的通信简单(共享内存即可,但须注意互斥访问的问题),而不同进程之间的通信更为复杂,通常需要调用内核实现;;
  8. 进程是程序的一次执行,而线程可以理解为程序中运行的一个片段;
  9. 进程比线程安全的原因是每个进程由独立的虚拟地址空间,具有独立性。

4. 多线程与多进程

  1. 多进程之间的数据共享比多线程编程复杂;
  2. 多线程的创建,切换,销毁速度快于多进程;
  3. 多线程没有内存隔离,单个线程崩溃会导致整个应用程序的退出;
  4. 大量的计算使用多进程和多线程都可以实现并行/并发处理,而多线程的资源消耗小于多进程;
  5. 多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。

你可能感兴趣的:(Linux,笔记,线程,进程,linux)