操作系统换之并发这点事儿
[TOC]
并发
桌子上有很多桃子,每个人看到桃子去抓取。这就是并发,他存在的问题是 不同的人会尝试去抓同一个桃子。这么导致后面的人抓不到。
可能的解决办法是大家排队一次拿桃子,这样又会降低效率。
如何又快又不出错的拿桃子,这就是问题所在。实际上,并发比这个更复杂。
线程
进程只有一个指令执行路径,也就是只有一个pc计数器。
线程的引入 增加了指令执行路径。每个线程有自己的指令执行路径,即PC计数器,也有自己独立的寄存器。
但是这些线程又共享地址空间,从而共享代码和数据。
类似于进程间的切换有上下文切换,线程间切换也有上下文切换。
进程是把状态保存到进程控制块 (Process Control Block, PCB)。
线程是把状态保存到线程控制块(Thread Control Block, TCB)。需要注意的是,同一个进程的线程间 本身是共享地址空间的,所以不需要切换当前使用的页表。
因为每个线程都有独立的栈,多线程的引入还影响了地址空间布局。有的应用程序会利用这个特性,譬如Java有ThtreadLocal, 在线程栈里存变量。
线程和进程一样,并不是创建了就马上运行,而是会由操作系统调度。
操作系统之内存这点事儿
go并发模式: Context
go并发模式: Context
介绍
在 Go 服务器中,每个传入请求都在其自己的 goroutine 中处理。请求处理程序通常会启动额外的 goroutine 来访问数据库和 RPC 服务等后端服务。处理请求的一组 goroutine 通常需要访问特定于请求的值,例如最终用户的身份、授权令牌和请求的截止日期。当请求被取消或超时时,所有处理该请求的 goroutines 都应该快速退出,以便系统可以回收它们正在使用的任何资源。
在 Google,我们开发了一个context
包,可以轻松地将请求范围的值、取消信号和截止日期跨 API 边界传递给处理请求所涉及的所有 goroutine。该软件包作为context公开可用 。本文介绍了如何使用该包并提供了一个完整的工作示例。