操作系统伴学—第一期 | 青训营笔记

91 阅读4分钟

进程、线程和协程的区别和联系

进程线程协程
定义资源分配和拥有的基本单位程序执行的基本单位用户态的轻量级线程,线程内部调度的基本单位
切换情况进程CPU环境(栈、寄存器、页表和文件句柄等)的保存以及新调度的进程CPU环境的设置保存和设置程序计数器、少量寄存器和栈的内容先将寄存器上下文和栈保存,等切换回来的时候再进行恢复
切换者操作系统操作系统用户
切换过程用户态->内核态->用户态用户态->内核态->用户态用户态(没有陷入内核)
调用栈内核栈内核栈用户栈
拥有资源CPU资源、内存资源、文件资源和句柄等程序计数器、寄存器、栈和状态字拥有自己的寄存器上下文和栈
并发性不同进程之间切换实现并发,各自占有CPU实现并行一个进程内部的多个线程并发执行同一时间只能执行一个协程,而其他协程处于休眠状态,适合对任务进行分时处理
系统开销切换虚拟地址空间,切换内核栈和硬件上下文,CPU高速缓存失效、页表切换,开销很大切换时只需保存和设置少量寄存器内容,因此开销很小直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快
通信方面进程间通信需要借助操作系统线程间可以直接读写进程数据段(如全局变量)来进行通信共享内存、消息队列

1、进程是资源调度的基本单位,运行一个可执行程序会创建一个或多个进程,进程就是运行起来的可执行程序

2、线程是程序执行的基本单位,是轻量级的进程。每个进程中都有唯一的主线程,且只能有一个,主线程和进程是相互依存的关系,主线程结束进程也会结束。多提一句:协程是用户态的轻量级线程,线程内部调度的基本单位

线程与进程的比较

1、线程启动速度快,轻量级

2、线程的系统开销小

3、线程使用有一定难度,需要处理数据一致性问题

4、同一线程共享的有堆、全局变量、静态变量、指针,引用、文件等,而独自占有栈

线程和进程的区别?

  • 调度:线程是调度的基本单位(PC,状态码,通用寄存器,线程栈及栈指针);进程是拥有资源的基本单位(打开文件,堆,静态区,代码段等)。
  • 并发性:一个进程内多个线程可以并发(最好和CPU核数相等);多个进程可以并发。
  • 拥有资源:线程不拥有系统资源,但一个进程的多个线程可以共享隶属进程的资源;进程是拥有资源的独立单位。
  • 系统开销:线程创建销毁只需要处理PC值,状态码,通用寄存器值,线程栈及栈指针即可;进程创建和销毁需要重新分配及销毁task_struct结构。

一个进程可以创建多少线程,和什么有关?

这个要分不同系统去看:

  • 如果是32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
  • 如果是64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。

顺便多说一句,过多的线程将会导致大量的时间浪费在线程切换上,给程序运行效率带来负面影响,无用线程要及时销毁。

外中断和异常有什么区别?

外中断是指由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。

而异常时由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。