发布网友 发布时间:2022-04-30 07:00
共2个回答
热心网友 时间:2023-10-20 15:45
要搞清线程栈和进程栈的区别,首先要弄清线程和进程之间的关系。
线程和进程有很多类似的地方,人们习惯上把线程称为轻量级进程,这个所谓的轻量级是指线程并不拥有自己的系统资源,线程依附于创建自己的进程。
我们可以从l两个个方面来理解线程的轻量级
1. 调度
由于进程之间的线程共享同一个进程地址空间,因此在进程的线程之间做进程切换,并不会引起进程地址空间的切换,从而避免了昂贵的进程切换。当然不同进程组之间是需要进程切换的
2. 拥有资源
进程是操作系统中拥有资源的独立单位,在创建和撤销进程时,操作系统都会为进程分配和回收资源,资源包括地址空间,文件,IO,页表等。但是由于线程是依附与创建进程的,线程的代码段,数据段,打开文件,IO资源,地址空间,页表等都是和进程的所有线程共享的。
从上面我们看出线程并没有独立的地址空间,这就意味着隶属同一进程的所有线程栈,都在所属进程的地址空间中,他们的栈地址不同,但是如果操作栈时发生越界,是有可能破坏其他线程的栈空间的。
而进程实际上可以看作是主线程,它的栈和其它线程栈没有区别。
单线程只有一个栈,多线程则为每个线程都分配一个栈,并且这些栈的地址不同,可以通过如下方法验证这个结论
1. pslist输出系统进程以及他们的线程,在我的机器上得到如下结果
1889 gnome-session 1918 1926 1940 1969 1957 2282 2283 1971 1972 1973 1975 1998 2003 2010 2669 2691 2710 2776 2871
1889是主线程,后面是这个进程创建的线程
2. 对每一个线程ID执行,cat /proc/threadID/maps
可以看到没个线程的stack地址范围各不相同,这也从侧面验证了每个线程的栈地址在同一进程地址空间的不同地址范围内。
热心网友 时间:2023-10-20 15:46
线程和进程分别用的啊