40.线程控制

lesson 30 为什么标记位是12项,因为在pageendtry中unsigned long是32个比特位,表示某个页起始地址只需要20位就行,剩下表示标志位。

地址空间也有指针指向页目录起始地址,每个进程都有自己的页目录,所以进程自己要记录,而寄存器的页目录地址是当前进程的。

看代码

云服务器指针8字节,以前4字节,所以这里long long 强转

主线程一般都是死循环,新线程执行完自己退掉

看课件3线程控制

看创建多线程代码

id指针指向没变。指针指向内容一直在变,所以最后一次都打印线程9.所以每个线程new一段堆空间,id往routine传参时候是拷贝所以id释放也没关系

进程自己的代码区可以通过库起始虚拟地址和偏移量访问到库

先描述在组织,怎么能在库创建tcb,就像是调用open,fopen返回file一样,这里open是C库分配的虚拟地址空间给用户层FILE结构体,真正用到时候再陷入内核进行缺页中断,这里调用pthread_creat,可以在库内创建tcb结构体,调度的在pcb中,也就是说线程实现一部分在用户层一部分在内核,代码区调用相关指令,库内创建相关结构体,这是描述

怎么组织,可以想成数组,但这几个结构体并不连续,这里只是这么想,也不是一次性开辟的整个每个数组快的内容 ,线程结束会把返回值写到struct pthread结构体 内,线程结束这个数组内对应的数据块并没有被释放,所以线程需要join,带出返回值,然后释放数据块,

当我们代码区调用create 库就会创建一个局部存储,线程的管理块,之后把这个线程块的起始地址写到代码区的id里面,

轻量级进程一旦启动,系统调用在内核创建tcb,让tcb执行routine,看clone,要把执行的方法和自己的栈结构交给我,所以cpu调度这个线程,会转而去执行这个用户层的routine,形成的临时数据也会入用户传进来的栈结构里,所以内核数据和用户数据在一定程度就联动起来了。

库创建了描述结构体,剩下的交给底层,然后底层执行完了,我接受返回结果,这就是内核线程和用户线程联动过程。

线程id:pthread_creat时候在库创建的描述线程的线程控制块的起始虚拟地址,所以大

2.返回值是现成退出结果写入线程控制块的void*变量里然后通过pthreadjoin回收它,

3.线程分离:tcb结构体内线程状态有个 int joinable 如果这个等于1,表明不是分离,需要接收,0,线程库自动释放掉控制块,joinable是线程控制块里的一个标记位,

但是Linux当中所有线程都在库里,但是互相访问不了,只能拿到自己线程的控制块虚拟地址,

看课件源码剖析标黄

相关推荐
orion571 天前
Missing Semester Class1:course overview and introduction of shell
linux
用户120487221612 天前
Linux驱动编译与加载
linux·嵌入式
用户805533698032 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式
用户805533698032 天前
RK-Forge外设系列开篇 - 把板子从「能启动」变成「能用」:Ethernet/SPI/MMC 三个纯接线外设
linux·github·嵌入式
七歌杜金房2 天前
我终于又有了自己的 Linux 电脑
linux·debian·mac
tntxia3 天前
linux curl命令详解_curl详解
linux
扛枪的书生4 天前
Linux 网络管理器用法速查
linux
顺风尿一寸4 天前
Java Socket 内核之旅:从 SocketChannel.read() 到 tcp_recvmsg 与 epoll 的完整调用链路
linux
XIAOHEZIcode4 天前
Ubuntu 终端美化全栈指南:Bash 到 Kitty 踩坑实录
linux·ubuntu·命令行
唐青枫4 天前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux