有哪些专业做饰品的网站app免费的黄冈网站有哪些平台
许多开发人员的一个误解是,并发解决方案总是比串行更快,大错特错。解决方案的整体性能取决于许多因素,例如,结构的效率(并发)、可以并行处理的部分以及计算单元的竞争程度。
1. GO调度
线程是操作系统可以执行的最小单元。如果一个进程想要同时执行多个动作,它可以启动多个线程。这些线程可以是:
- 并发--两个或者更多线程可以在同一时间段内启动、运行和完成。
- 并行--同一个任务可以同时执行多次,就像多个服务员线程一样。
操作系统负责优化调度线程的那些进程:
- 所有的线程都可以消费CPU周期,不会饥饿太久
- 工作负载尽可能地被均匀分布在不同的CPU核上。
注意
线程这个词在CPU级别上也可以有不同的含义。每个物理核可以由多个逻辑核(超线程的概念)组成,一个逻辑核也被称为一个线程。
CPU内核执行不同的线程。当CPU内核的执行从一个线程切换到另一个线程的时候,会执行一个操作,叫作上下文切换。切换时,正在消费CPU周期的活动线程正处于executing状态,然后转换成runnable状态,意味着它会等待,直到有一个可用的核可以执行它。上下文切换被视为是昂贵的操作,因为操作系统需要保存要切换线程的状态(如当前寄存器的值)。
作为Go开发者,我们不以直接创建线程,但是可以创建goroutine(协程),你可以把它看成应用级的线程。操作系统线程是由操作系统在CPU上进行的上下文切换,而goroutine是由Go运行时在操作系统线程上进行的上下文切换。此外,与操作系统线程相比,goroutine的内存占用更小:Go 1.4以后的goroutine只占用2KB(goroutine的内存占用会按需进行调整,更进一步地,Go 1.19会根据历史栈使用率来初始化goroutine栈,goroutine的内存占用不再是固定的2KB)。操作系统线程的内存占用取决于操作系统本身,例如,在Linux/x86-32中,默认的大小是2MB。较小的尺寸可使上下文切换更快。
注意
goroutine的上下文切换会比线程的上下文切换大约快 80% 到 90%,具体取决于CPU架构。
现在让我