0%

本文翻译自 https://docs.docker.com/config/containers/multi-service_container/

我们都知道,所谓的容器就是一个被隔离到不同环境的进程而已,那我们如果在一个容器内运行多个进程呢?

一个容器的主进程是 ENTRYPOINT 或者在 Dockerfile 最后的 CMD

容器的主进程负责管理它启动的全部进程。

在某些条件下,主进程由于出错而退出,容器退出时,主进程并不能优雅地处理停止的子进程。

阅读全文 »

在此感谢 leetcode 网友提供的遍历方法

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/yan-se-biao-ji-fa-yi-chong-tong-yong-qie-jian-ming/

二叉树的遍历是老生常谈的话题,递归方法最容易理解,但空间复杂度极高,由此衍生出了迭代遍历,但思维量巨大,每种遍历都需要写不同风格的代码。

我最近重写遍历时发现 网友 独创的遍历方式。

采用颜色标记法,未访问的用白色标记,访问的用黑色标记。

阅读全文 »

其实说白了就是流程控制,现在有三个 goroutine,如果控制他们顺序呢?

具体细节忘了,但好像美团面试官就是这么问的

当时没说明白,要是手写一下让面试官看下,说不定就不会挂掉了…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
"fmt"
"sync"
)

func main() {
c1 := make(chan struct{})
c2 := make(chan struct{})
group := sync.WaitGroup{}
group.Add(1)
go func() {
fmt.Println("g1")
c1 <- struct{}{}
}()

go func() {
<- c1
fmt.Println("g2")
c2 <- struct{}{}
}()

go func() {
<- c2
fmt.Println("g3")
group.Done()
}()
group.Wait()
}

什么是协程

OS 并不理解 协程,协程是在 userspace 模拟出来的调度,协程运行在线程之上,所以协程没有上下文切换消耗。

Go什么时候会阻塞调用线程?

太长不看版:

Go 进行系统调用时,如果 OS 对于 socket,file 的 文件描述符fd 不支持 IO multiplxing,Go 会阻塞调用线程。

阅读全文 »

常见的 GC 算法

引用计数

每个对象分别引用一个计数器 count,被引用则 count + 1,被释放则 count - 1,当 count0 时,该对象可以被清除

缺点是对象之间存在循环引用的问题

标记-清除算法

阅读全文 »

这里收集着我平时用到的Git操作 :)

推送到不同的分支

将本地的 master 分支推送到远程仓库的 fixreadme 分支

origin 代表着你的远程仓库地址

1
git push origin master:fixreadme
阅读全文 »

题目来自

https://www.nowcoder.com/questionTerminal/c55f4f15cc3f4ff0adede7f9c69fa0c1

这是小米面试时考官给出的一道题。面试结束之后想了下,这不就是判断一个数是否是 2 的次方倍吗。我之前还做过判断关于指数幂的问题。

题目介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。
牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。
这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

输入描述:
输入一个正整数N (N <= 50)
接下来一行输入N个正整数,每个数均小于等于1e9.


输出描述:
假如经过若干次操作可以使得N个数都相等,那么输出 `"YES"`, 否则输出 `"NO"`

示例1
输入
2
1 2
输出

YES
阅读全文 »