进程定义
是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。 进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。
线程定义
单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。
区别
- 一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
- 线程是一种轻量级的进程,与进程相比,线程给操作系统侧带来创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。
- 线程没有地址空间,线程包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程 的文本片段中,进程拥有的所有资源都属于线程。所有的线程共享进程的内存和资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。
- 父和子进程使用进程间通信机制,同一进程的线程通过读取和写入数据到进程变量来通信。
- 进程内的任何线程都被看做是同位体,且处于相同的级别。不管是哪个线程创建了哪一个线程,进程内的任何线程都可以销毁、挂起、恢复和更改其它线程的优先权。线程也要对进程施加控制,进程中任何线程都可以通过销毁主线程来销毁进程,销毁主线程将导致该进程的销毁,对主线程的修改可能影响所有的线程。
- 子进程不对任何其他子进程施加控制,进程的线程可以对同一进程的其它线程施加控制。子进程不能对父进程施加控制,进程中所有线程都可以对主线程施加控制。
相同点
进程和线程都有ID/寄存器组、状态和优先权、信息块,创建后都可更改自己的属性,都可与父进程共享资源、都不能直接访问其他无关进程或线程的资源。
死锁
两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,这种状况,就称为死锁。
例如,一个进程 p1占用了显示器,同时又必须使用打印机,而打印机被进程p2占用,p2又必须使用显示器,这样就形成了死锁。
线程以及多线程,多进程的选择
进程是指在系统中正在运行的一个应用程序; 程序一旦运行就是进程,或者更专业化来说:进程是指程序执行时的一个实例,线程是进程的一个实体。
进程——资源分配的最小单位,线程——程序执行的最小单位。
线程进程的区别体现在几个方面:
0:因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。
1:体现在通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。
2:属于同一个进程的所有线程共享该进程的所有资源,包括文件描述符。而不同的进程相互独立。
3:线程又称为轻量级进程,进程有进程控制块,线程有线程控制块;
4:线程必定也只能属于一个进程,而进程可以拥有多个线程而且至少拥有一个线程;
5:体现在程序结构上,举一个简明易懂的列子:当我们使用进程的时候,我们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的时候还是要使用,所以线程对程序结构的改善有很大帮助。
进程与线程的选择取决以下几点:
0:需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。 1:线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应 2:因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程; 3:并行操作时使用线程,如C/S 的服务器端并发线程响应用户的请求; 4:需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。
参考链接
- https://www.runoob.com/ruby/ruby-multithreading.html
- https://baijiahao.baidu.com/s?id=1645900492241810279&wfr=spider&for=pc
- https://www.linuxprobe.com/process-thread-pk.html
- https://www.linuxprobe.com/thread-process.html