-
线程,进程,协程
- 进程:
- 进程是用来管理指令,内存,IO的,一个应用程序可以开一个进程,也可以开多个进程,由程序而定,一个进程就是一个实例
- 线程:
- 线程是进程中实例,一个进程中可以有一个或多个线程,一个线程必须有一个父进程,一个线程是一个指令流,将指令按顺序交给cpu执行
- 线程也是轻量级进程,由cpu执行的最小单元
- 协程【java中协程框架: kilim quasar】:
- 基于线程之上但又比线程轻量的存在,协程是基于应用程序执行的既基于用户态性而非内核态,协程对内核态不可见
- 线程的切换由操作系统调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率
- 线程的默认stack大小是1M,而协程更轻量,接近1k。因此可以在相同的内存中开启更多的协程。
- 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
- 协程适用于被阻塞的,且需要大量并发的场景(网络io)。不适合大量计算的场景
- 进程:
-
进程通信机制
- 管道及有名管道
- 管道可以用于存在亲缘关系的进程之间进行通讯
- 有名管道用于存在亲缘关系的进程之间通讯也可以用于没有亲缘关系的进程之间通讯
- 信号
- 信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的
- 消息队列
- 消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息
- 共享内存
- 可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等
- 信号量
- 主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段
- 套接字
- 这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛
- 管道及有名管道
-
线程通讯机制
- 线程同步:一个线程的执行依赖另一个线程,需要等待另一个线程的通知,当另一个线程没有通知执行时,线程要处于等待状态
- 线程互斥:多个线程之间对共享变量的操作要有排它性
- 线程同步互斥的控制方法
- 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。(在一段时间内只允许一个线程访问的资源就称为临界资源)
- 互斥量:为协调共同对一个共享资源的单独访问而设计的。
- 信号量:为控制一个具有有限数量用户资源而设计。
- 事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
-
上下文切换
- 上下文切换是cpu从一个进程或线程切换到另一个进程或线程
- 上下文切换流程
- 暂停当前执行的进程或线程,保存上下文信息
- 切换到另一个进程或线程,获取上次保存的上下文信息,由cpu的寄存器恢复上下文数据
- 返回到程序计数器指示的位置恢复中断的代码,以恢复进程。
-
用户态与内核态 【出于保护原因】
- 内核模式:执行代码可以完全且不受限制地访问底层硬件。可以执行任何指令和引用任何地址,内核模式通常为操作系统的最低级别、最受信任的功能保留。内核模式下的崩溃是灾难性的;他们会让整个电脑瘫痪。
- 用户模式:不能直接访问硬件或引用内存,必须通过调用api的方式申请,由于这种隔离提供的保护,用户模式下的崩溃总是可恢复的。在您的计算机上运行的大多数代码将在用户模式下执行。
- 用户模式切换成内核模式的方式:
- 系统调用:api调用接口申请
- 异常事件:当发生某些预先不可知的异常时,就会切换到内核态,以执行相关的异常事件
- 设备中断:在使用外围设备时,如外围设备完成了用户请求,就会向CPU发送一个中断信号,此时,CPU就会暂停执行原本的下一条指令,转去处理中断事件。此时,如果原来在用户态,则自然就会切换到内核态。
进程&线程&协程&用户态&内核态
最新推荐文章于 2024-08-23 15:54:50 发布
本文探讨了进程、线程、协程的概念及其在程序中的作用,强调了它们在内存管理、调度和并发场景中的优势,还介绍了进程间通信的各种方式,如管道、有名管道、信号、消息队列、信号量和套接字,以及线程同步和互斥的控制手段。
摘要由CSDN通过智能技术生成