什么是线程?
Linux下线程用进程PCB模拟描述,也叫轻量级进程
线程是进程内部的一个执行流,也就是线程在进程的地址空间内运行。
一个进程内的所有线程共享进程资源
线程是CPU调度的基本单位(CPU调度是按照PCB进行调度的)
创建,销毁一个线程相较创建,销毁一个进程成本要低(创建进程要创建PCB,虚拟地址空间,创建页表,维护映射,把硬盘的代码数据加载到内存,文件描述符等等,而创建线程只需要一个PCB指向进程的虚拟地址空间即可,同样销毁一个线程只需要销毁PCB即可)
线程间的切换相比于进程间的切换容易的多(进程间的切换,PCB切换,页表切换等等,线程切换PCB切换,页表不切换)
什么是进程?
进程是拥有一个执行流,或多个执行流的线程组。
进程是一个能独立运行的基本单位,同时也是系统分配资源基本单位。(独立性)
进程是动态执行的程序(创建一个进程要创建PCB描述进程,为进程分配资源,进程可以被调度,被执行。而程序就只是静静躺在硬盘上)(动态性)
任何进程都可以同其他进程一起并发执行(并发性)(并发:一个CPU多个进程,分时切换)
进程间的相互制约,进程具有执行的间断性,进程按照各自独立不可预知的速度向前推进(异步性)(异步性:指进程以不可预知的速度向前推进,内存中的每个进程何时执行,何时暂停,以怎样的速度向前推进,要用多长时间完成等都是不可预知的)
进程和程序的区别?
程序是指令的有序集合(静静的躺在硬盘上,静态的),而进程是动态执行的程序(把程序加载到内存中,用PCB描述,被调度,被执行,有生命周期)--------------程序静态的,进程动态的
程序可以作为一种软件资料长期保存,而进程是有生命周期的。------------程序:可以一直被保存,无生命周期,进程是有生命周期的
进程和线程的区别?
线程是被CPU调度的基本单位,进程是能独立运行的基本单位,是系统分配资源的基本单位
创建销毁线程要比创建销毁进程成本低的多。(创建进程要,创建PCB,开辟虚拟地址空间,创建页表,维护映射关系,加载硬盘数据到内存,创建文件描述符,等等,而创建线程只要创建一个PCB指向进程的虚拟地址空间即可)
进程拥有自己独立的虚拟地址空间,而一个进程中的多个线程共享进程的虚拟地址空间
线程占用的资源要比进程少
线程缺乏访问控制,进程中的一个线程出错,会终止掉整个进程,从而导致其他线程也凉凉,而一个进程出错,不会影响另一个进程
线程和进程共享资源,但是有一部分数据是自己私有的?
线程和进程共享:
同一地址空间 (堆,代码段,数据段,环境变量,页表)
文件描述符表
每种信号的处理方式
当前工作目录
用户id和组id
线程和进程私有:
私有栈结构(保存临时数据,保证线程执行时不相互影响)
上下文数据(CPU调度切换数据保存)
调度优先级
errno
信号屏蔽字
线程优缺点,以及应用场景
线程优点:
线程共享进程的地址空间,因此线程间通信比较容易(但是不安全要注意维护),而进程间通信就相比较困难了,因为两个进程看到同一块资源不容易 ------------节约资源,成本低,调度切换快
创建销毁成本低
线程间切换容易
等待慢速I/O的同时,可以干其他事情
进程优点:
更强的容错性,安全,一个进程挂了,不影响其他.
多进程比多线程编写,调试容易。
线程应用场景:
等待慢速I/O时,交给一个线程等待,接着做其他事情
通信,比较容易(注意加锁)
进程的应用场景:
需要安全稳定时用进程,需要速度时用进程,既要速度又要安全。有的书上说,能用多进程解决的尽量不要用多线程