Go语言学习笔记-进程和线程

简介: Go语言学习笔记-进程和线程

1、虚拟地址空间划分

  • 每个进程都有自己虚拟地址空间
  • 为了保障系统运行的安全,虚拟地址空间被划分为用户空间内核空间
  • 操作系统运行在内核空间,用户程序运行在用户空间,内核空间由所有进程地址共享,但是用户程序不能直接访问内核空间

2、线程

  • 操作系统的进程控制信息是保存在内核空间的,里边有页目录、进程ID、打开文件句柄等信息
  • 线程就是进程中的执行体,有指定的执行入口(通常是某个函数的入口)
  • 线程执行时要使用从进程虚拟地址空间中分配的栈空间来存储数据
  • 在创建线程时,操作系统会使用用户空间和内核空间分别分配用户栈内核栈

  • 线程切换到内核态执行时会使用内核栈,目的是为了不允许用户代码对它进行修改
  • 操作系统会记录每个线程的控制信息,如线程栈、线程入口、线程ID等等
  • 在Windows中线程控制信息对应TCB
  • 在Linux中对应task_struct结构体
  • 在PCB中可以找到进程拥有的线程列表
  • 同一个进程内的线程可以共享进程的控制信息,如进程ID、句柄表等

3、线程执行

  • 当执行进程中某个线程时,CPU的指令指针会指向线程的执行入口,栈基和栈指针寄存器会记录线程的用户栈空位置
  • CPU执行程序时,面向的是某个线程,所以线程是操作系统调度与执行的基本单位
  • 一个进程中至少要有一个线程,从某个开始执行的线程称为主线程,它是由父进程或操作系统创建的
  • 进程中的其他线程一般都是由主线程创建的
  • 线程中发生函数调用时就会分配函数调用栈
  • 虚拟内存分配、文件操作、网络读写等都是由操作系统来实现的

4、系统服务

  • 当线程调用操作系统提供的系统服务,需要进行系统调用
  • CPU中会有一个标志用于记录当前程序是用户态还是内核态
  • 当发生系统调用时,CPU就会切换到内核态,就能使用内核空间的内核栈,使用内核的系统函数
  • 最初系统调用是通过软中断触发的(通过指令模拟中断),与其对应的就是硬件中断,操作系统会记录各种中断信息(如x86的sysenter和amd64的syscall),等系统调用结束后会利用之前保存的信息恢复到用户线程的执行现场

5、线程切换

  • 只有获得CPU时间片的程序才能运行,由于时间片很短,用户感觉不到程序的切换过程
  • CPU执行的很快,在很短的时间内足够执行很多很多的指令
  • 某个线程获得的时间片用完时,CPU硬件时钟会触发中断,会执行下一个准备就绪的线程
  • 同一个进程的线程间切换

  • 不同进程的线程切换



相关文章
|
5天前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
53 22
零值在go语言和初始化数据
|
7天前
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
68 1
在go语言中使用泛型和反射
|
9天前
|
缓存 编译器 Shell
回顾go语言基础中一些特别的概念
【7月更文挑战第6天】本文介绍Go语言基础涵盖包声明、导入、函数、变量、语句和表达式以及注释。零值可用类型如切片、互斥锁和缓冲,支持预分配容量以优化性能。
40 2
回顾go语言基础中一些特别的概念
|
13天前
|
存储 Go API
一个go语言编码的例子
【7月更文挑战第2天】本文介绍Go语言使用Unicode字符集和UTF-8编码。Go中,`unicode/utf8`包处理编码转换,如`EncodeRune`和`DecodeRune`。`golang.org/x/text`库支持更多编码转换,如GBK到UTF-8。编码规则覆盖7位至21位的不同长度码点。
115 1
一个go语言编码的例子
|
16天前
|
JSON 算法 测试技术
在go语言中调试程序
【6月更文挑战第29天】Go语言内置`testing`包支持单元测试、基准测试和模糊测试。`go test`命令可执行测试,如`-run`选择特定测试,`-bench`运行基准测试,`-fuzz`进行模糊测试。
37 2
在go语言中调试程序
|
5天前
|
JSON Java Go
Go 语言性能优化技巧
在Go语言中优化性能涉及数字字符串转换(如用`strconv.Itoa()`代替`fmt.Sprintf()`)、避免不必要的字符串到字节切片转换、预分配切片容量、使用`strings.Builder`拼接、有效利用并发(`goroutine`和`sync.WaitGroup`)、减少内存分配、对象重用(`sync.Pool`)、无锁编程、I/O缓冲、正则预编译和选择高效的序列化方法。这些策略能显著提升代码执行效率和系统资源利用率。
41 13
|
1天前
|
Cloud Native Java Go
为什么要学习Go语言?
GO logo的核心理念,即简单胜于复杂。使用现代斜体无衬线字体与三条简单的运动线相结合,形成一个类似于快速运动的两个轮子的标记,传达速度和效率。字母的圆形暗示了GO地鼠的眼睛,创造了一个熟悉的形状,让标记和吉祥物很好地搭配在一起。
12 4
|
5天前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
41 8
|
7天前
|
前端开发 JavaScript Go
|
5天前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
17 1