南京大学操作系统笔记(一)

本文档涵盖了南京大学操作系统课程的多处理器编程关键知识点,包括NP难问题、线程共享与独享部分、C语言特性、__attribute__使用、pthread库内存分配、原子性和Dekker's algorithm详解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

南京大学操作系统学习笔记
第三课 多处理器编程
1.Non-deterministic Polynomial Complete NP难的问题
2.线程共享那些部分
a)全局变量
b)Foo函数的代码共享
3.线程独享的部分
a)堆栈、寄存器独享
4.写了malloc以后需要判断是否分配成功
a)Assert()是偷懒的方法
b)判断是否为NULL
5.实验得到pthread库给每个线程分配8M内存
6.C语言问题 (之前一直有,但是一直没深究)
a)_tmain( int argc ,_TCHAR *ARGV[])
argc: 表示程序运行时命令行的个数
*argv: 指令字符串数组的指针,每个字符串对应一个参数
Argc[0]: 表示程序的路径及名称
Argv[1],argv[2]: 表示自己输入的参数
7.__attribute__介绍
attribute是GNU C特色之一,在iOS用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等.
·函数属性
·noreturn
· noinline
·always_inline
·pure
·const
·nothrow
·sentinel
·format
· format_arg
·no_instrument_function
·section
·constructor
·destructor
· unused
·deprecated
·weak
·malloc
·alias
·warn_unused_result
·nonnull
详细见https://www.jianshu.com/p/29eb7b5c8b2d
在这里用到的是__attribute((constructor)) 表示在main之前执行,attribute((destructor)) 表示在main()执行结束后执行,也可以用attexit()
8.原子性
Dekker’s algorithm——一个实现锁的算法
是实现锁的一种算法。这种算法只解决两个线程竞争资源的情况。为了不让两个线程同时执行一段代码,比较直观的方案是设一个共享bool变量,线程进入前先检测它的值,有线程进入后改变它的值。但是在并发的情况下,可能在A检查完认为B没进入,准备改备值前,B也检测完了,这时候就两个线程都进入了。为了解决这个问题AB应该能够知道对方的情况,所以把一个BOOL变量变成两个BOOL变量,分别表示AB是否已经到这个区域。这时候怎么决定谁先继续走下去呢?要增加一个BIT,等于0表示A,等于1表示B,A,B进入后都把这个值改成它们对应的值,在决定往下走前,再回头检查一下这个值,看有没有被别人改了,如果被对方改了,则让对方先走。如果没被对方改,则认为自己仍然应该走,但是在对方放弃之前,不继续往下走。这时候会不会两个人都不往下走呢?不会的,因为那个BIT不是0就是1,所以总有一个人放弃的。也有一种可能是对方已经进入临界区,这时候对方就会一直执行到结束才修改自身状态,另一个线程才能往下走。
伪代码
flag[0] = 0
flag[1] = 0

P0: flag[0] = 1 P1: flag[1] = 1
turn = 1 turn = 0
while (flag[1] && turn==1); while (flag[0] && turn == 0); //Busy test loop
// critical section // critical section
… …
// end of critical section // end of critical section
flag[0] = 0 flag[1] = 0
这个算法的好处是,不用硬件配合。当然局限也是很明显的,只支持两个线程。另外这是一个很古老的算法,在现在某些CPU架构下是不能工作的。

目录 I 基础知识9 1 MINIX操作系统简介11 1.1 MINIX与UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2 探索MINIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 编辑器:vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4 编译器:CC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 Intel 8086体系结构19 2.1 8086 CPU结构. . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2 运算器与指令部件. . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 寄存器组. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4 主存. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5 堆栈. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.6 系统启动. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.7 二进制文件结构. . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 ACK 8086汇编语言27 3.1 寻址. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 数据移动指令. . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3 常量、标号、数据与全局变量. . . . . . . . . . . . . . . . . . 29 3.4 运算指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5 标志位操纵指令. . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.6 串操作指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.7 跳转、分支与循环. . . . . . . . . . . . . . . . . . . . . . . . 33 3.8 堆栈与子程序. . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5 6 目录 4 实习:Hello World 37 4.1 Hello World程序. . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 II 汇编语言进阶41 5 C与汇编联合开发43 5.1 函数调用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2 全局与局部变量. . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3 编译与连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.4 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 6 中断与I/O 49 6.1 中断. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 输入输出设备. . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.3 编写中断处理程序. . . . . . . . . . . . . . . . . . . . . . . . 51 6.4 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7 实习:小游戏55 7.1 make工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 III 操作系统内核59 8 进程切换61 8.1 进程模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 8.2 进程的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 8.3 进程切换. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 8.4 中断嵌套. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.5 MiniOS中的进程切换. . . . . . . . . . . . . . . . . . . . . . . 68 8.6 操作系统实现原则. . . . . . . . . . . . . . . . . . . . . . . . 69 9 进程通信71 9.1 信号量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 9.2 消息机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 9.3 消息机制的实现. . . . . . . . . . . . . . . . . . . . . . . . . . 76 9.4 调试消息内核. . . . . . . . . . . . . . . . . . . . . . . . . . . 78 目录7 10 实习:操作系统内核83 10.1 引导操作系统. . . . . . . . . . . . . . . . . . . . . . . . . . . 83 10.2 微内核与层次式操作系统结构. . . . . . . . . . . . . . . . . . 83 10.3 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 IV 轻量操作系统实现87 11 设备驱动程序89 11.1 设备驱动程序原理. . . . . . . . . . . . . . . . . . . . . . . . 89 11.2 键盘设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11.3 屏幕设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 11.4 死锁的产生与预防. . . . . . . . . . . . . . . . . . . . . . . . 93 12 存储管理95 12.1 存储管理与系统调用服务进程. . . . . . . . . . . . . . . . . . 95 12.2 进程映像的创建与终止. . . . . . . . . . . . . . . . . . . . . . 97 12.3 替换进程映像. . . . . . . . . . . . . . . . . . . . . . . . . . . 98 13 文件系统101 13.1 文件与目录. . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 13.2 文件与目录管理. . . . . . . . . . . . . . . . . . . . . . . . . . 103 13.3 文件描述符. . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 14 实习:迷你操作系统109 14.1 个简易的Shell . . . . . . . . . . . . . . . . . . . . . . . . . . 109 14.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 附录111 A vi常用命令113 B 虚拟机与外部的文件交换117
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值