bjmayor 发布于 2022-02-11

docker 基础命令

[TOC]

工作中用的比较多的命令。

docker

run

systemctl start docker #启动 systemctl daemon-reload #守护进程重启 systemctl restart docker / service docker restart #重启docker服务 docker service docker stop / docker systemctl stop docker #关闭

阅读全文 »

bjmayor 发布于 2022-02-10

操作系统换之并发这点事儿

[TOC]

并发

桌子上有很多桃子,每个人看到桃子去抓取。这就是并发,他存在的问题是 不同的人会尝试去抓同一个桃子。这么导致后面的人抓不到。

可能的解决办法是大家排队一次拿桃子,这样又会降低效率。

如何又快又不出错的拿桃子,这就是问题所在。实际上,并发比这个更复杂。

线程

进程只有一个指令执行路径,也就是只有一个pc计数器。

线程的引入 增加了指令执行路径。每个线程有自己的指令执行路径,即PC计数器,也有自己独立的寄存器。

但是这些线程又共享地址空间,从而共享代码和数据。

类似于进程间的切换有上下文切换,线程间切换也有上下文切换。

进程是把状态保存到进程控制块 (Process Control Block, PCB)。

线程是把状态保存到线程控制块(Thread Control Block, TCB)。需要注意的是,同一个进程的线程间 本身是共享地址空间的,所以不需要切换当前使用的页表。

因为每个线程都有独立的栈,多线程的引入还影响了地址空间布局。有的应用程序会利用这个特性,譬如Java有ThtreadLocal, 在线程栈里存变量。

线程和进程一样,并不是创建了就马上运行,而是会由操作系统调度。

阅读全文 »

bjmayor 发布于 2022-01-24

操作系统之内存这点事儿

[TOC]

内存介绍

虚拟化内存

设计目标

目标:

  1. 透明, 这里指运行的程序感知不到内存被虚拟化的事实,相反,程序的行为就好像它拥有自己的私有物理内存。
  2. 效率 这里依赖硬件。譬如TLB, 主要消耗是虚拟地址转为实际物理地址。
  3. 保护 即程序不能访问它的地址空间之外的任何内容。从而也实现了隔离。

阅读全文 »

bjmayor 发布于 2022-01-22

go并发模式: Context

go并发模式: Context

原文链接

介绍

在 Go 服务器中,每个传入请求都在其自己的 goroutine 中处理。请求处理程序通常会启动额外的 goroutine 来访问数据库和 RPC 服务等后端服务。处理请求的一组 goroutine 通常需要访问特定于请求的值,例如最终用户的身份、授权令牌和请求的截止日期。当请求被取消或超时时,所有处理该请求的 goroutines 都应该快速退出,以便系统可以回收它们正在使用的任何资源。

在 Google,我们开发了一个context包,可以轻松地将请求范围的值、取消信号和截止日期跨 API 边界传递给处理请求所涉及的所有 goroutine。该软件包作为context公开可用 。本文介绍了如何使用该包并提供了一个完整的工作示例。

阅读全文 »

bjmayor 发布于 2022-01-11

go工具链

[TOC]

交叉编译

交叉编译

通过go env GOARCH 可获取到当前平台的架构。一般有 amd64,386,

mac上编译linux和windows二进制

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=linux GOARCH=386 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

阅读全文 »

bjmayor 发布于 2021-12-10

调度: 多级反馈队列

多级反馈队列

Multi-level Feedback Queue = MLFQ

如名字所示,解决思路就是将任务分级。

分成多个队列,每个队列的优先级不同,调度程序永远先运行完高优先级中的任务,再运行低优先级队列中的任务。

同一队列有多个任务时,轮转运行。

一个任务只能存在于一个队列中。

MLFQ调度策略的关键在于如何设置优先级。

阅读全文 »