1. ucore lab7介绍
ucore在前面的实验中实现了进程/线程机制,并在lab6中实现了抢占式的线程调度机制。基于中断的抢占式线程调度机制使得线程在执行的过程中随时可能被操作系统打断,被阻塞挂起而令其它的线程获得CPU。多个线程并发的执行,大大提升了非cpu密集型应用程序的cpu吞吐量,使得计算机系统中宝贵的cpu硬件资源得到了充分利用。
操作系统提供的内核线程并发机制的优点是明显的,但同时也带来了一些问题,其中首当其冲的便是线程安全问题。
并发带来的线程安全问题
线程安全指的是在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
举一个经典的例子:在高级语言中对于某一共享整型变量i(假设i=5)进行的i++操作,在最终的机器代码中会被分解为几个更细致的机器指令:
-
从内存的对应地址中读取出变量i的值(高级语言的变量在机器层面表现为一个内存地址),写入cpu的寄存器中(假设是edx)
-
对寄存器edx进行+1运算(运算后edx寄存器中的值为5+1=6)
-
将edx的值写入变量i对应的内存空间中(在高级语言层面看,写入edx中的新值后i变成了6)
通过之前lab5/lab6的学习,我们知道在i++具体的机器指令序列执行的每一步过程中,操作系统都可能通过时钟中断打断对应线程的执行,进行线程的上下文切换。机器指令是原子性的,但高级语言中的一条指令底层可能对应多个机器指令,在执行的过程中可能被中断介入,无法保证执行的连贯性。