程序、进程、线程之间的联系和区别

一、进程

进程是程序执行的实例,即运行中的程序,也是程序的副本;程序放置于磁盘中,而进程放置于内存中;进程的启动及调度均是由内核发起的。init是所有进程的子进程,儿子进程是由fork()进程生成。

1、概念

从用户的角度来说,进程就是程序的一次动态执行过程。
从操作系统角度:操作系统分配内存,CPU时间等系统资源的基本单位。

2、特点

(1)、每一个进程都有自己独立的虚拟地址空间和进程状态。
(2)、进程是分配资源 的最小单位(基本单位)

3、进程和程序的区别和联系

联系

1、程序=文件(静态的可执行文件)
2、进程=执行中的程序=程序+执行状态
3、同一个程序的多次执行对应为不同的进程(ls的多次执行对应多个不同进程)
4、进程执行需要的资源:内存(保存代码和数据)+cpu(执行指令)

区别

1、程序是静态的,进程是动态的
(1)、程序是有序代码的集合
(2)、进程是程序的执行,进程有内核状态、用户态。

2、进程相对于程序的生命周期是短暂的,程序是永久的

3、进程有PCB的数据结构
(1)、程序 :数据段+代码段
(2)、进程 :代码段+数据段+堆栈+PCB

4、一个进程只能对应一个程序,一个程序可以对应多个进程

二、线程

1、线程和进程的区别

LWP :轻量级的进程,本质仍然是进程(linux环境下)

进程:进程有独立的地址空间(0-4G),拥有PCB

线程:拥有自己的PCB,但是没有独立的地址空间(共享)

区别:在于是否共享地址空间

独居(进程) ; 合租 (线程)

linux下 :
线程:最小的执行单位
进程:最小的分配资源单位,可以看成是只有一个线程的进程。
程序、进程、线程之间的联系和区别

程序、进程、线程之间的联系和区别

2、linux内核线程实现原理

进程和线程关系

1、轻量级进程也有PCB,创建线程使用的底层函数和进程是一样的,都是clone。
程序、进程、线程之间的联系和区别
2、从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的。
程序、进程、线程之间的联系和区别

三级映射:进程PCB --> 页目录(可看成数组,首地址位于PCB中) --> 页表 --> 物理页面 --> 内存单元

3、进程可以蜕变成线程。
4、线程可以看做寄存器和栈的集合。
5、在linux下,线程是最小的执行单位,进程是最小的分配资源单位。
6、察看LWP号:ps –Lf pid 查看指定线程的lwp号。

进程号:cpu分配时间轮片的依据
MMU帮忙把虚拟地址映射到物理地址上

3、线程优缺点

1、优点

1、提高程序的并发性
2、开销小
3、数据通信、共享数据方便

2、缺点

1、线程里面的函数都是库函数,不稳定。(进程里面绝大多数函数都是系统函数)
2、调试、编写困难、gdb不支持。
3、对信号支持不好。

4、进程和线程拓展知识

1、对于进程来说,相同的地址(同一个虚拟地址)在不同的进程中,反复使用而不冲突。虽然他们的虚拟地址是一样的,但是页目录、页表、物理页面各不相同。相同的虚拟地址,映射到不同的物理页面内存单元,最终访问不同的物理页面。

2、线程具有各自独立的PCB,当时共享同一个页目录,也就共享同一个页表和物理页面。所以两个PCB共享同一个地址空间。

3、实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层实现都是调用同一个内核函数clone.

4、如果是复制对方的地址空间,那么就会产生一个“进程”;如果共享对方的地址空间,就会产生一个“线程”。

5、Linux内核是不区分进程和线程的。只是在用户层面上进程区分。所以,线程所有操作函数pthread_* 是库函数,而非系统调用。