码迷,mamicode.com
首页 > 编程语言 > 详细

操作系统-线程与进程

时间:2017-06-14 23:26:23      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:在线   code   read   局部变量   全局   png   通过   不同的   共享   

首先要分清楚进程和线程的区别。

借用《操作系统概念》的一幅图:

技术分享

线程由线程ID、程序计数器、寄存器集合和栈组成。

进程由代码段、数据段、文件、线程组成。

可以想象成一个进程可以有多个线程。而每个线程可以共享进程里面的代码段、数据段等。

举个例子。

#include <stdio.h>
#include <pthread.h>
static int counter = 0;
void*
mythread(void* arg)
{
int i;
for (i =
0; i < 10; i++) { counter = counter + 1; } return NULL; } int main(int argc, char*argv[]) { pthread_t p1, p2; // 创建两个线程 Pthread_create(&p1, NULL, mythread, "A"); Pthread_create(&p2, NULL, mythread, "B"); // 等待创建的两个线程完成 Pthread_join(p1, NULL); Pthread_join(p2, NULL); return 0; }


简单解释一下:
首先将整个程序看成一个进程,一开始进入main函数看成一个线程T
然后线程T用
Pthread_create创建了两个线程A,B,即一个进程内包含了三个线程。
线程A,B执行mythread这个函数,当它们执行完这个函数也就结束了。
线程T等待线程A,B完成,然后就线程T结束。
在理解这个程序过程中,把线程的执行想象成在一定时间后(例如1s)就会执行另一个线程,也称为抢占调度。
如图
技术分享
以下是线程每部分解释:
static
int counter = 0;
counter属于数据段,可以说全局变量都是数据段的一部分。

mythread(void* arg)
mythread这个函数属于代码段,上面所有函数都是属于代码段,包括main函数。
那么,如果我用
Pthread_create创建线程A时,线程A是可以得到mythread和counter这两个共享资源的,线程B,T也
是一样,如果线程A改变了counter的值为1,那么再调度到线程B的时候执行counter = counter+1, counter就变为
2了。
但值得注意的是,mythread里面的变量i是局部变量,存放在每个线程各自的里面,所以是不共享的。
另外,如果我在线程T里改变了寄存器%eax的值,%eax=1,在1s后调度到线程A,它也改变了%eax的值,%eax=2
那么再回到线程T的时候%eax是会恢复到原来的值即%eax=1,换句话说每个线程的寄存器是相互独立的。
所以线程与进程之间的不同就很简单了。
线程与进程其实差不多,而不同在于,前者是可以在同一进程内共享数据、内存地址空间,后者要通过进程间通信
或者地址空间映射来共享数据。此外,它们在上下文切换(例如线程调度)的时候保存的数据有点不同的。





 

操作系统-线程与进程

标签:在线   code   read   局部变量   全局   png   通过   不同的   共享   

原文地址:http://www.cnblogs.com/thougr/p/7011445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!