博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程和线程的剖析
阅读量:6721 次
发布时间:2019-06-25

本文共 1485 字,大约阅读时间需要 4 分钟。

进程和线程的区别?什么时候用进程?什么时候用线程?

 

答:首先得知道什么是进程什么是线程?

我的理解是进程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程,或者更专业化来说:进程是指程序执行时的一个实例。

线程是进程的一个实体。

进程——资源分配的最小单位,线程——程序执行的最小单位。

 

线程进程的区别体现在几个方面:

第一:因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。

第二:体现在通信机制上面,正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。。

3.属于同一个进程的所有线程共享该进程的所有资源,包括文件描述符。而不同过的进程相互独立。

4.线程又称为轻量级进程,进程有进程控制块,线程有线程控制块;

5.线程必定也只能属于一个进程,而进程可以拥有多个线程而且至少拥有一个线程;

第四:体现在程序结构上,举一个简明易懂的列子:当我们使用进程的时候,我们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的时候还是要使用,所以线程对程序结构的改善有很大帮助。

 

 

进程与线程的选择取决以下几点:

1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。

2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应

3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;

4、并行操作时使用线程,如C/S的服务器端并发线程响应用户的请求;

5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

进程间通信

既然每个进程是占有独立的地址空间且不能共享数据,那就需要有进程通信的方式,进程间通信(IPC)方式有以下几种:

(1)共享内存,独立的开辟一段内存空间,进程1往内存中写数据,进程2从内存中读数据,如果有其他进程,则另开辟内存空间即可。

(2)消息队列:可以传递消息

(3)管道:可以用来传递消息,但是是单向的

(4)互斥器:用来进程同步和互斥

(5)信号量:用来进程同步和互斥

(6)信号:用来进程同步和互斥

 

线程间通信

因为同一个进程中的线程是共享地址空间的,可以共享数据,因此线程间的通信方式个人认为就是处理线程间的同步和互斥,常用线程间通信的方式有以下几种:

(1)原子操作符集

(2)关键代码段(Windows)

(3)互斥锁

(4)信号量

(5)条件变量(Linux)

(6)读写锁(Linux)

进程和线程不能进行直接通信。

操作:

https://www.cnblogs.com/microfan/p/5294250.html

转载于:https://www.cnblogs.com/lgx-fighting/p/9372594.html

你可能感兴趣的文章
10条影响CSS渲染速度的写法与建议
查看>>
[Android Pro] 注册 Google Play 开发者帐户
查看>>
TextView
查看>>
timeval gettimeofday
查看>>
runtime简介
查看>>
网站收集
查看>>
MySQL5.7 (审计)安装audit审计插件
查看>>
LightSpeed 之Sql和存储过程的使用
查看>>
codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱
查看>>
EntLib 3.1学习笔记(1) : Caching Application Block
查看>>
组合模式
查看>>
C++指针专题
查看>>
在asp.net中关于<% %>,用法总结
查看>>
Go-插入排序
查看>>
LeetCode-76-Minimum Window Substring
查看>>
oracle插入数据时解决和旧数据id的冲突
查看>>
linux yum命令详解
查看>>
struts——拦截器
查看>>
程序员软件
查看>>
Android学习记录--使用继承ListActivity 注意事项
查看>>