
操作系统
文章平均质量分 79
ychychychychychych
这个作者很懒,什么都没留下…
展开
-
操作系统——内存
内存使用和分段:内存是如何使用的:计算机是通过取指令,执行指令这两步来工作的,当我们需要一条指令,需要通过地址总线向内存读出数据当我们将磁盘上的程序发送到内存中,call 40想要执行,就需要将main函数的入口放在内存地址为0的位置,一直向后放,直到main函数,这样call 传向地址总线上的40地址才能正确匹配到地址但是0地址是唯一的,如果我们想要运行多个程序,他们都使用了40这个地址,显然会发生冲突我们可以通过逻辑地址的方式(也就是相对地址),每一个程序对应一个基址,这样程序内的地址就原创 2021-05-24 20:46:03 · 278 阅读 · 0 评论 -
操作系统——信号量(L16,L17,L18,L19)
进程同步与信号量:如生活中的司机和售票员的合作,就体现了两个进程之间的合作这里的代码就体现了两个进程之间的合作,他们使用共享数据来操作自身的停止和运行,当生产者判断counter为10,则进行停止,直到消费者进行了一次操作;当消费者判断counter为0,则进行停止,直到生产者中进行了一次操作,这样便实现了信号控制,但是这里的counter显然是需要互斥控制的。使用上述代码,当生产者为多个的时候就出现问题了,当缓冲区满p1进行生产首先会阻塞,然后生产者p2进行生产也会阻塞,这时候counter的为5,原创 2021-05-24 20:45:25 · 514 阅读 · 0 评论 -
哈工大OS实验五——基于内核栈切换的进程切换
基于内核栈切换的进程切换tss:linux0.11中主要是基于TSS方式的切换,通过switch_to函数来实现,在shcdule()函数中,给switch_to函数传递一个next参数,这个参数为下一个进程在进程队列中的索引值 while (1) { c = -1; next = 0;l i = NR_TASKS; p = &task[NR_TASKS原创 2021-05-06 17:14:22 · 329 阅读 · 0 评论 -
操作系统——用户级线程和内核级线程(L10,L11,L12)
用户级线程:不同的进程的映射表不同,当一个进程中断了,我们需要切换到另外一个线程,就需要我们切换指令执行序列,切换与设备等各种资源,这样的效率是很低的线程保留了并发的特点,又避免了进程切换的代价。yield放弃当前线程执行权限的函数。当遇到函数调用,压入返回地址,当遇到了yield()函数,也进行压栈返回地址,但是,当压入的位置为同一个栈,这时就出现问题了。过程:A函数执行,调用B函数压入返回地址104,B函数执行,遇到yield()压入返回地址204并切换线程到C中,这时候栈情况就是左边原创 2021-05-06 17:12:46 · 1073 阅读 · 0 评论 -
操作系统——银行家算法(递归)
银行家算法#include<iostream>using namespace std;#define NUM_PRO 4 //一共有多少个进程#define NUM_RES 3 //资源的种类有多少int allo[4][3]={{1,0,0},{5,1,1},{2,1,1},{0,0,2}};int max[4][3]={{3,2,2},{6,1,3},{3,1,4},{4,2,2}};int need[4][3]={{2,2,2},{1,0,2},{1,0,3},{4,2,0}原创 2021-05-06 17:00:28 · 467 阅读 · 0 评论 -
哈工大OS实验四——进程运行轨迹的跟踪与统计
进程运行轨迹的跟踪与统计进程从创建(Linux 下调用 fork())到结束的整个过程就是进程的生命期,进程在其生命期中的运行轨迹实际上就表现为进程状态的多次切换,如进程创建以后会成为就绪态;当该进程被调度以后会切换到运行态;在运行的过程中如果启动了一个文件读写操作,操作系统会将该进程切换到阻塞态(等待态)从而让出 CPU;当文件读写完毕以后,操作系统会在将其切换成就绪态,等待进程调度算法来调度该进程执行……process.c解读void cpuio_bound(int last, int cpu_原创 2021-04-30 12:26:00 · 883 阅读 · 1 评论 -
操作系统——进程(L8,L9)
cpu管理的直观想法CPU通过取值执行来运行。当没有fprintf这一句的时候,执行10000000次循环需要的时间大约为0.015s,但是当有fprintf时,执行100次循环却需要0.859s。说明使用这样的IO操作相比运算操作对于CPU的运行来说是一种负担。具体原因如下,也可以查看博主的计算机组成原理的中断的相关内容怎么实现并发呢当切换进程的时候,将进程的各个信息保存下来,当下一次切换到这个线程的时候,将保存下来的信息复原,就可以接下去执行这个被保存的进程了。多进程图像:当我们的1原创 2021-04-30 12:22:20 · 460 阅读 · 0 评论 -
操作系统——系统调用(L4,L5)
操作系统的接口什么是操作系统接口:操作系统接口的实现:为什么不能直接访问,内核中的代码:不安全内存被分程内核态和用户态对应内核段和用户段如何不让进去:通过权限检查的方式_syscall3(int ,write,int,fd,const char* buf,off_t,count)解释:3表示有三个参数,括号中第一个空表示返回值类型,第二个空表示系统调用为哪个,第三个空表示第一个参数的类型,第四个空表示第一个参数的名字将上面的_syscall3(int ,write,int,fd,cons原创 2021-03-30 17:13:11 · 360 阅读 · 0 评论 -
操作系统——操作系统的启动(L2,L3)
揭开钢琴的盖子通用计算机:可以进行编程操作从计算机外部存储程序到计算机内部存储程序当我们打开电源,第一条指令:开机,PC处于实模式,将CS:IP置为0xffff:0x0000,这里对应的是bios区域,开始检测硬件,然后将0磁盘,0扇区(512字节)内容读入0x7c00位置,设置CS:IP为0x07c0:0x0000。也就是从0x07c00位置开始执行代码。磁盘里存放的就是操作系统的引导扇区.s是汇编代码bootsect.s的作用:将ds:si置为0x07c0:0000,将es:di原创 2021-03-30 15:32:26 · 385 阅读 · 0 评论 -
哈工大OS实验三——系统调用
系统调用1)iam()第一个系统调用是 iam(),其原型为:int iam(const char * name);完成的功能是将字符串参数 name 的内容拷贝到内核中保存下来。要求 name 的长度不能超过 23 个字符。返回值是拷贝的字符数。如果 name 的字符个数超过了 23,则返回 “-1”,并置 errno 为 EINVAL。2)whoami()第二个系统调用是 whoami(),其原型为:int whoami(char* name, unsigned int size);[c原创 2021-03-14 14:43:32 · 1321 阅读 · 0 评论 -
哈工大OS实验二——操作系统的引导
操作系统的引导目标:改写 bootsect.s 主要完成如下功能: bootsect.s 能在屏幕上打印一段提示信息“XXX is booting…”,其中 XXX 是你给自己的操作系统起的名字,例如 LZJos、Sunix 等(可以上论坛上秀秀谁的 OS 名字最帅,也可以显示一个特色 logo,以表示自己操作系统的与众不同。)改写 setup.s 主要完成如下功能: bootsect.s 能完成 setup.s 的载入,并跳转到 setup.s 开始地址执行。而 setup.s 向屏幕输出一行"原创 2021-03-11 09:19:20 · 941 阅读 · 0 评论