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++具体的机器指令序列执行的每一步过程中,操作系统都可能通过时钟中断打断对应线程的执行,进行线程的上下文切换。机器指令是原子性的,但高级语言中的一条指令底层可能对应多个机器指令,在执行的过程中可能被中断介入,无法保证执行的连贯性。
相关文章
MySQL 事务常见面试题总结 | JavaGuide
《Java 面试指北》来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。 本文原发于 MySQL知识点&面试题总...
Java中动态指定长度打印
C语言中的printf,sprintf打印实现 以前使用C语言的时候知道可以使用如下方法动态指定长度打印: 点击查看代码 printf("[%-*s]", 10, "he...
ch04 Java流程控制
Java 流程控制 Scanner对象 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般使用hasNext()与hasNextLine()判断是否还有输入的数...
JavaSE-对象所有字段判空
```java /* * 判断该对象是否所有属性为空 * 返回ture表示所有属性为null,返回false表示不是所有属性都是null / public static boolean isAllFi...
Netty源码分析之ByteBuf引用计数
引用计数是一种常用的内存管理机制,是指将资源的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。Netty在4.x版本开始使用引用计数机制进行部分对象的管理,其实现思路并不是特别复杂,它主要涉...
idea-启动速度优化
原因:默认分配的内存太小了 解决方式:更改idea(64).exe.vmoptions配置 D:\ADBSpace\ProgramFiles\ideaIU-2021.2.win\bin 默认配置 ``...
JVM-垃圾回收机制
引用计数法 可达性分析 Java 中常见的垃圾回收算法 标记-清除算法 复制算法 标记-整理算法 分代回收算法 内存分配机制 Minor GC 和 Full GC 垃圾收集器 在 JVM 进行垃圾回收...
Java学习 (12)Java流程控制篇(03)循环结构
While 循环 *while 是最基本的循环结构,结构为 public static void main(String[] args) { while (布尔表达式){ //循环内容; } } *循...
Netty源码分析之ChannelPipeline(五)—异常事件的传播
ChannelHandler中异常的获取与处理是通过继承重写exceptionCaught方法来实现的,本篇文章我们对ChannelPipeline中exceptionCaught异常事件的传播进行梳...
TypeScript(6)函数
函数 函数是 JavaScript 应用程序的基础,它帮助你实现抽象层,模拟类,信息隐藏和模块。在 TypeScript 里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方。Type...
JAVA流程控制if、switch、while、do while、for、break、continue的用法及区别
选择结构 if 选择结构 语法 if(布尔表达式) { //当布尔表达式为true将执行的语句 } ```java if(布尔表达式) { //当布尔表达式为true将执行的语句 }else{ //当...
多线程基础知识!!!
1.1、继承Thread类(重点) public class MyThread extends Thread{ @Override public void run() { } public stati...
图片在容器内水平垂直居中显示
图片在容器内水平垂直居中显示 效果: ``` .imgbox { border: 1px solid #dcdfe6; position: relative; width: 150px; height...