深度解密Go语言之基于信号的抢占式调度

不知道大家在实际工作中有没有遇到过老版本 Go 调度器的坑:死循环导致程序“死机”。我去年就遇到过,并且搞出了一起 P0 事故,还写了篇弱智的找 bug 文章

识别事故的本质,并且用一个非常简单的示例展示出来,是功力的一种体现。那次事故的原因可以简化成如下的 demo:

demo-1

我来简单解释一下上面这个程序。在主 goroutine 里,先用 GoMAXPROCS 函数拿到 CPU 的逻辑核心数 threads。这意味着 Go 进程会创建 threads 个数的 P。接着,启动了 threads 个数的 goroutine,每个 goroutine 都在执行一个无限循环,并且这个无限循环只是简单地执行 x++

接着,主 goroutine sleep 了 1 秒钟;最后,打印 x 的值。

你可以自己思考一下,输出会是什么?

如果你想出了答案,接着再看下面这个 demo:

demo-2

我也来解释一下,在主 goroutine 里,只启动了一个 goroutine(虽然程序里用了一个 for 循环,但其实只循环了一次,完全是为了和前面的 demo 看起来更协调一些),同样执行了一个 x++ 的无限 for 循环。

和前一个 demo 的不同点在于,在主 goroutine 里,我们手动执行了一次 GC;最后,打印 x 的值。

如果你能答对第一题,大概率也能答对第二题。

下面我就来揭晓答案。

其实我留了一个坑,我没说用哪个版本的 Go 来运行代码。所以,正确的答案是:

Go 版本 demo-1 demo-2
1.13 卡死 卡死
1.14 0 0

这个其实就是 Go 调度器的坑了。

假设在 demo-1 中,共有 4 个 P,于是创建了 4 个 goroutine。当主 goroutine 执行 sleep 的时候,刚刚创建的 4 个 goroutine 马上就把 4 个 P 霸占了,执行死循环,而

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Go语言实现RSA加密解密的示例代码: ```go package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "fmt" ) func main() { // 生成RSA密钥对 privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { panic(err) } // 将私钥编码为PEM格式 privatePem := pem.EncodeToMemory(&pem.Block{ Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey), }) // 将公钥编码为PEM格式 publicPem, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey) if err != nil { panic(err) } publicPemBlock := &pem.Block{ Type: "PUBLIC KEY", Bytes: publicPem, } publicPemBytes := pem.EncodeToMemory(publicPemBlock) // 显示密钥对 fmt.Println("Private Key:") fmt.Println(string(privatePem)) fmt.Println("Public Key:") fmt.Println(string(publicPemBytes)) // 加密明文 plaintext := []byte("Hello, world!") ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, &privateKey.PublicKey, plaintext) if err != nil { panic(err) } fmt.Println("Ciphertext:", ciphertext) // 解密密文 decrypted, err := privateKey.Decrypt(nil, ciphertext, &rsa.OAEPOptions{Hash: rsa.HashSHA256}) if err != nil { panic(err) } fmt.Println("Decrypted:", string(decrypted)) } ``` 在上述示例中,首先使用`rsa.GenerateKey()`函数生成了一个2048位的RSA密钥对。然后,使用`x509.MarshalPKCS1PrivateKey()`和`x509.MarshalPKIXPublicKey()`函数将私钥和公钥编码为PEM格式,并将它们打印出来。 接着,使用`rsa.EncryptPKCS1v15()`函数对明文进行加密,得到密文。使用私钥的`Decrypt()`方法对密文进行解密,得到原始的明文。 需要注意的是,在进行加密和解密时,需要使用不同的密钥。在本例中,使用公钥加密明文,然后使用私钥解密密文。如果使用私钥加密明文,那么只有对应的公钥才能解密密文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值