
Jyy-os
南京大学“操作系统:设计与实现”
Eternitykc
这个作者很懒,什么都没留下…
展开
-
五、并发控制(1):线程的互斥
看线程1,load(y)前面的是和y无关的store,所以操作系统允许store和load乱序。 这就使得实际可能是,线程1先执行load(y),线程2先执行load(x),然后分别进入(if !t1) goto,t1和t2同时进入临界区,所以Peterson算法出错。 Perterson算法在现代计算机上实际上是错误的 在do_sum代码中使用了内联汇编,使得其真正循环相加,彻底阻止了编译器的优化。 如果我们的状态机在每一个时刻,确实是执行一个线程的一条汇编指令的话,我们应该看到...原创 2020-12-17 02:09:54 · 313 阅读 · 0 评论 -
四、理解并发程序的执行 & 状态机视角下的程序执行
将上述模型扩展到并发程序: 多线程有好多个寄存器现场。 多线程的执行过程,可以看做每一个时刻,都选择一个线程执行一条指令,由于是共享内存的,所以执行的结果会直接反映到内存上 把复杂的并发程序执行,看做状态机的模型,就简单很多。将程序的整个执行看做是一个个指令的执行,一个状态向另一个状态的转移,而一个指令的执行是确定的。 有两面旗子,x和y。x是t1的旗子,y是t2的旗子。 turn是挂着的牌子,牌子上是t1或t2。 看thread1,如果想上厕所,就举起自己的牌子(x=1),然...原创 2020-12-16 14:41:06 · 441 阅读 · 0 评论 -
三、多处理器编程
1.多处理器编程入门 在多个CPU核心下,多线程的好处是显而易见的,不然多个CPU核心只跑一个线程其他的核心就都浪费了。 即便不考虑多核心,在单核下,多线程也是有意义的,因为在一些操作,比如IO操作阻塞的时候,是不需要CPU参与的,这时候CPU就可以另开一个线程去做别的事情,等待IO操作完成再回到之前的线程继续执行即可。 同一个线程组内线程间共享虚拟内存 思考:如果线程非常非常多,会发生什么情况? CPU会在N多线程之间调度,CPU会类似,消耗大量的CPU资源;每条线程被调度执行的频次会较低(线程的执行效率原创 2020-12-16 01:08:18 · 819 阅读 · 0 评论 -
二、<代码讲解>应用眼中的操作系统 & 系统调用
file filename:打印指定文件的信息 ps ax|less:打印所有进程 ip address:查看ip地址 xxd + filename:可以查看二进制文件 hello.c如下 #include <stdio.h> int main() { printf("hello,world\n"); return 0; } 命令: gcc -c hello.c ld hello.o会报错无法找到入口,且没有定义puts ld -e main hello.o,以main作为入口,链接h原创 2020-12-15 11:42:08 · 285 阅读 · 0 评论 -
一、操作系统的历史
操作系统发展的历史如下。 1.最初1940s的一个状态机,以电子管(vacuum tubes)为逻辑门,以延迟线(delay lines)为存储器,以打孔纸带/指示灯作为输入/输出。这种设计下,ENIAC程序是用物理线路(hard-wire)的,每次重编程都需要重新接线。这种设计下成功运行了打印平方数,微分方程数值求解等问题。 那时候是不需要操作系统的,因为计算机唯一的对象就是独占计算机运行的程序 2.40s的内存是在一维的线上保存数据,50s出现了磁芯来作为内存(是在二维上的,行选通和列选通),有了读卡原创 2020-12-14 20:56:33 · 1050 阅读 · 0 评论