进程与线程
-
并发:一个程序同时执行多个独立的任务。
- 多个任务之间的切换(上下文切换)是要有时间开销的,比如操作系统要保存切换时的状态、执行进度等信息,切换回来后要复原这些信息。
- 使用并发的原因主要是能够同时处理不同的任务,提高性能。
-
可执行程序:磁盘上的一个文件,windows上以.exe为后缀名的文件。Linux上rwxrwxrwx中x代表执行权限。
-
进程:就是一个可执行程序运行起来了,就创建了一个进程。进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发。
-
线程:每个进程都有一个主线程,当进程被创建后,主线程就会自动启动。运行一个程序的时候,实际上是主线程在运行main()中的代码。线程可以理解成一条代码的执行通路。线程是进程中执行运算的最小单位。多线程就是允许一个进程中在同一时刻执行多个任务。
区别
-
一个线程只能属于一个进程,但是一个进程可以拥有多个线程。
-
进程是资源分配的最小单位,线程是CPU调度的最小单位。
-
进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。
-
一个进程崩溃,不会对其他进程产生影响;而一个线程崩溃,会让同一进程内的其他线程也死掉。
-
进程在创建、切换和销毁时开销比较大,而线程比较小。在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。
-
进程间通信比较复杂,而同一进程的线程由于共享代码段和数据段,所以通信比较容易。
进程间通信方式
- 两个进程在同一台电脑上:管道、文件、消息队列、共享内存
- 两个进程在不同电脑上:socket通信技术
线程间通信方式
- 临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
- 互斥量 Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
- 信号量 Semphare:为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
- 事件(信号)Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作