首先大家可以看看这篇文章,这篇文章对进程和线程的关系做了生动的讲解:
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
什么是进程
前面我们学习了进程的相关知识,现在我们先来做以下回顾。
进程:进程是指在系统中能够独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成,并且每一个进程都有一个进程控制块PCB,在Linux下被称为task_struct;另外每个进程还有一个独立的地址,它和物理内存通过页表联系在一起。
什么是线程
线程:线程是进程的一个部分,它在进程的地址空间上运行,和主线程一起共享虚拟地址空间的资源,一个没有线程的进程可以看做是单线程,线程主要是作为系统调度和分派的基本单位,Linux下没有线程的概念,系统将线程看做轻量级进程,这里的轻量级是因为线程没有自己独立的地址空间和相关数据结构。
进程和线程的区别
1.首先比较重要的一点是,进程是拥有系统资源的一个独立单位,而线程不能拥有资源,但它可以访问创建它的进程中的资源。
2.任一时刻,cpu只能运行一个进程,其他进程则处于非运行状态,而任一时刻,线程可以同时执行,还可以协同完成一项任务,这是线程的并发性。
3.当我们创建一个进程时,系统通过写时拷贝的方式给被创建的进程分配了地址空间和相关数据结构,而当我们创建一个线程时,这个线程会和当前进程中的其他线程一起共享地址空间中的资源。
线程之间的共享和私有资源
首先,各个进程之间共享同一个虚拟地址空间,所以,它的文本段和数据段都是共享的,另外,各个线程还共享文件描述符表,还有用户id和用户组,但是有些资源各个线程之间也不是相互共享的,例如:线程id、硬件上下文(PC指针,各个寄存器变量的值,还有栈指针等等)、栈空间、调度优先级。
下面我们写一个例子来验证一下:
线程标识
进程ID在整个系统中是唯一的,但是线程ID不同,线程ID只有在它所属的进程上下文中才有意义。
线程ID是用pthread_t数据类型来表示的;