首页 > 代码库 > 操作系统-线程与进程
操作系统-线程与进程
首先要分清楚进程和线程的区别。
借用《操作系统概念》的一幅图:
线程由线程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,换句话说每个线程的寄存器是相互独立的。
所以线程与进程之间的不同就很简单了。
线程与进程其实差不多,而不同在于,前者是可以在同一进程内共享数据、内存地址空间,后者要通过进程间通信
或者地址空间映射来共享数据。此外,它们在上下文切换(例如线程调度)的时候保存的数据有点不同的。
操作系统-线程与进程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。