一、进程
进程是程序执行的实例,即运行中的程序,也是程序的副本;程序放置于磁盘中,而进程放置于内存中;进程的启动及调度均是由内核发起的。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_* 是库函数,而非系统调用。