进程与线程

# 小例子
我们打开一个微信软件,这时就开启了一个进程,当在微信里进行各种操作(查看朋友圈、扫一扫等),这么多的操作就是线程。 进程包含线程,线程是进程的一个子集 进程:在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程是资源分配的最小单位。 线程:系统分配处理器时间资源的基本单元,或进程内独立执行的一个单元执行流。线程是程序执行的最小单位
# 深入理解
# 进程(线程+内存+文件/网络句柄)
# 内存
我们通常所理解的内存是我们见到的(2G/4G/8G/16G)物理内存。这里的内存是逻辑内存。是内存的寻址空间。每个进程的内存是相互独立的。
# 文件/网络句柄
是所有的进程所共有的,如打开同一个文件夹,抢同一个网络的端口等这样的操作是被允许的。
# 线程
# 线程(栈+PC+TLS)
# 栈
我们通常都说调用堆栈,其实这里堆是无含义的,调用堆栈就是调用栈的意思。那么栈里面有什么呢?从主线程的入口main函数,会不断的进行函数调用,每次函数调用,会把所有的参数和返回地址压入栈中。
# PC(程序计数器)
操作系统真正运行的是一个个线程,而进程只是线程的一个容器。 PC就是指向当前的指令,指令放在内存中。 每个线程都有一串自己的指针,指向自己当前所在内存的指针。 计算机绝大部分是数据和程序存储在同一片内存里,即内存既有数据变量又有程序。 所以PC指针指向内存。 缓冲区溢出 我们经常听到这个漏洞。如:有个表单要输入用户名,本来是用来存数据的地方。黑客把数据输入的特别长,长度超出给数据存储的内存区,跑到了给程序分配的一部分内存中。黑客可通过这种办法将要运行的代码写入用户名框中,来植入进来。解决办法:限制用户名长度不超过其缓冲区大小。
# TLS(线程本地存储)
线程独立的内存就是TLS。存储线程独有的数据。
# 进程间怎么交互
通过TCP/IP的端口来实现
# 线程间怎么交互
有一大块共享的内存,只要大家的指针是同一个就可看到各自的内存。
# 总结
1.进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了. 2.一个程序至少有一个进程,一个进程至少有一个线程. 3.进程是资源分配的最小单位,线程是程序执行的最小单位。 4.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.