Yuerer's Blog

钰儿的Blog

首先讲讲数在计算机上的表示

数的机器表示

众所周知 机器很笨 它是不认识什么 有符号数 和 无符号数的 它只认识 二进制串 那么在计算机上 是如何表示 有符号数和无符号数的呢?

计算机不区分有符号数和无符号数

首先在计算机眼中 它确确实实只认识 二进制串 二进制串所表示的数 是有符号数还是无符号数 取决于 用户(编码者)怎么看 当你认为 0xffff 为正数时 它就是 65535 当你认为 0xffff 为负数时 就为 -1

其次 在计算机中 它会将送进来的数 统一用补码计算 使用补码计算就不用区分 是有符号数还是无符号数 因为补码的加减法的规则相同

阅读全文 »

练习0:填写已有实验

请把你做的实验代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”/“LAB5”/“LAB6” /“LAB7”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab8的测试应用程序,可能需对已完成的实验1/2/3/4/5/6/7的代码进行进一步改进。

1
2
3
4
5
6
7
8
9
10
11
12
vmm.c default_pmm.c pmm.c proc.c swap_fifo.c trap.c check_sync.c
proc.c:
static struct proc_struct *alloc_proc(void) {
// 初始化 PCB 下的 fs(进程相关的文件信息)
proc->filesp = NULL;
}
int do_fork(uint32_t clone_flags, uintptr_t stack, struct trapframe *tf) {
// 使用 copy_files()函数复制父进程的fs到子进程中
if (copy_files(clone_flags, proc) != 0) {
goto bad_fork_cleanup_kstack;
}
}
阅读全文 »

文件系统和文件

  • 文件系统是操作系统中管理持久性数据的子系统 提供数据存储和访问功能
  • 文件是具有符号名 由字节序列构成的数据项集合
    • 文件是文件系统的基本数据单位
    • 文件名是文件的标识符号
阅读全文 »

死锁

由于竞争资源或者通信关系 两个或更多线程在执行中出现 用于相互等待只能由其他进程引发的事件

资源分类

  • 可重用资源(Resuable Resource)
    • 资源不能被删除且在任何时刻只能有一个进程使用
    • 进程释放资源后 其他进程可重用
    • 处理器 I/O通道 存储器 设备
    • 文件(进程访问过程中不能被删除) 数据库 信号量
    • 可能出现死锁(每个进程占用一部分资源并请求其它资源)
  • 消耗资源(Consumable Resource)
    • 资源创建和消耗
    • 在I/O缓冲区的中断 信号 消息
    • 可能出现死锁(进程间相互等待接受对方的消息)
阅读全文 »

练习0:填写已有实验

请把你做的实验代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”/“LAB5”/“LAB6”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab7的测试应用程序,可能需对已完成的实验1/2/3/4/5/6的代码进行进一步改进。

1
2
3
4
5
6
7
8
9
10
这次又是要修改 trap.c
vmm.c trap.c default_pmm.c pmm.c proc.c swap_fifo.c
trap.c:
static void trap_dispatch(struct trapframe *tf) {
++ticks;
/* 注销掉下面这一句 因为这一句被包含在了 run_timer_list()
run_timer_list() 在之前的基础上 加入了对 timer 的支持 */
// sched_class_proc_tick(current);
run_timer_list();
}
阅读全文 »

信号量(Semaphore)

操作系统提供的一种协调共享资源访问的方法 由 Dijkstra 提出

  • 软件同步是平等线程间的一种同步协调机制
  • OS是管理者 地位高于进程
  • 用信号量表示系统资源数量
  • 早期操作系统主要同步机制(现在很少用)
  • 信号量是一种抽象数据类型
    • 由一个整型变量(sem)和两个原子操作组成
    • P() sem - 1 若 sem < 0 进入等待 否则继续
    • V() sem + 1 若 sem <= 0 唤醒一个等待进程
阅读全文 »

并发进程的正确性

执行过程是不确定性和不可重现的 程序错误可能是间歇性发生的

  • 独立进程
    • 不和其他进程共享资源或状态
    • 确定性 输入状态决定结果
    • 可重现 能够重现起始条件
    • 调度顺序不重要
  • 并发进程
    • 在多个进程间有资源共享(都要CPU 内存)
    • 不确定性
    • 不可重现
阅读全文 »

练习0:填写已有实验

请把你做的实验2/3/4/5的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”“LAB5”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab6的测试应用程序,可能需对已完成的实验1/2/3/4/5的代码进行进一步改进。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
复制以下文件 其中 proc.c 和 trap.c 需要进行修正
vmm.c trap.c default_pmm.c pmm.c proc.c swap_fifo.c
proc.c:
static struct proc_struct *alloc_proc(void) {
// 添加如下几行 初始化进程所属就绪队列 初始化就绪队列指针 初始化时间片
proc->rq = NULL;
list_init(&(proc->run_link));
proc->time_slice = 0;
}
trap.c:
static void trap_dispatch(struct trapframe *tf) {
// 在时钟中断下 添加以下几行 并去掉之前设置 进程需要调度标记
// 这个标记现在已经被 调度程序所使用了 不再需要自己控制
++ticks;
sched_class_proc_tick(current);
// current->need_resched = 1;
}
阅读全文 »
0%