自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 CS学习(九)—— 分支实现

汇编代码出现了jle类似的跳转指令。对于使用了流水线的CPU,这样的跳转是存在隐患的,分支预测失败就会刷新掉所有流水线中取到而未执行的指令,影响运行性能。18:若y

2024-04-10 20:05:16 387

原创 CS学习(八)——控制

cmpl Src, Dest:等价计算Dest - Src,但只会影响标志位,并不影响二者的值。testl Src, Dest:等价计算Dest & Src,但只会影响标志位,不影响二者的值。作用:根据eflag寄存器中的标志位,设置目的操作数为1或0,通常为8位寄存器。这个就是如果ecx中的值 < edx中的值,那么eax中的值 = ebx中的值。%eax %ebx %ecx %edx %edi %esi存储临时数据。ZF set:如果t == 0。SF:符号标志(结果的符号位)eflag寄存器存储。

2024-04-03 20:25:29 197

原创 CS学习(七)——程序的机器级表达

在Linux中,.c文件是如何一步一步转换为可执行文件的?何为反汇编?汇编:将汇编文件转化为可执行文件(里面都是机器码00010100……)。那么反汇编就是可执行文件转化为汇编文件。objdump -d/-D code.o/code (-d:反汇编要执行指令的节;-D:反汇编出所有节)gdb pdisassemble sum(一个函数)x/11xb sum(Src:源操作数,Dest:目的操作数)以下均用AT&T格式。立即数:$num寄存器:八个整数寄存器之一。

2024-04-03 19:16:39 1281 1

原创 OS学习(九)——空闲空间管理

空闲列表(在堆上管理空闲空间的数据结构,不一定真是列表)包含一组元素,记录堆中的空闲空间,例如:此时空闲列表会有两个元素,一个记录0~9字节,另一个记录20~29字节。若申请一个字节的内存,分配程序会执行操作:找到一块可满足请求的空间,将其分割,第一块给用户,另一块留在空闲列表中。若申请超过10字节的空间会咋样?分配程序会在释放内存时合并可用空间,注意是的。

2024-04-02 10:12:52 1279 1

原创 OS学习(八)——内存虚拟化

操作系统在单一的物理内存为多个运行的进程(所有进程共享内存)构建一个私有的,很大的地址空间的抽象。早期系统(举例,操作系统不一定从物理地址0开始)

2024-03-31 11:01:10 272 1

原创 CS学习(六)——浮点数plus

将原来阶码小的数的尾数右移|△E|位,其阶码值加上|△E|,即每右移一次尾数要使阶码加1,则该浮点数的值不变(但精度变差了)。1.2350000 ——> 1.24(刚好为一半即5,舍入到偶数位)10.11100 ——> 11.00 (=中间数,舍入到偶数位)10.10100 ——> 10.10 (=中间数,舍入到偶数位)1.2450000 ——> 1.24(一半,舍入到偶数位)10.00101 ——> 10.01(>中间数)若M >= 2,右移一位,并E = E + 1。数字不会溢出,但可能会舍入。

2024-03-27 19:46:30 311

原创 OS学习(七)——多处理器调度

进程在一个CPU上运行时会在其缓存维护许多状态,从而保证下次在同一CPU运行时更快,然而,在不同CPU上运行需要重新加载数据而很慢。此问题讲的就是多个CPU共享一个内存,但缓存不共享,可能导致CPU1修改内存中的值暂存于缓存1中,而CPU2没有及时更新的情况。工作窃取(work stealing):工作量较少的队列不定时”偷看“其他队列是不是工作比自己多,如果是,就“窃取”工作。多队列调度时,可能一个CPU上的工作都执行完了,其他CPU还一个都没完成,导致不同CPU负载不均衡。CFS是确定的比例调度方法。

2024-03-26 15:43:34 254

原创 浮点数在机器内的存储格式

所以15213.0 应该表示为 0100 0110 0110 1101 1011 0100 0000 0000。13用移码表示为140(13+Bias127),用二进制表示为:1000 1100。用IEEE754标准可以表示为1.1 1011 0110 1101 * 2^13。最后看一下-15213.0的存储,讲道理应该是只有最高位由0变1。其补码为1100 0100 1001 0011。小端法表示为上图所示(低位低地址,高位高地址)

2024-03-25 17:28:27 125

原创 CS学习(五)——浮点数

E = 1 - Bias,即-126,刚好实现与规范化值的平滑过度,这就是为啥Bias=127的原因之一。0 ,表示NAN(Not a Number),用来表示一些无法表示的数。1,即移码上的位数字不全为0或1。(1)frac = 000…0 ,表示无穷大和溢出结果,至于正负由s决定。(i个1)的数表示刚好小于1.0的数,可以用。在浮点数表示中,偏移量Bias=2^(k-1) - 1。s确定是正还是负,数值0的符号位特殊判断,故称为…,范围在[1.0,2.0)之间,用。E表示2的幂,是一个二进制整数,用?

2024-03-25 16:40:19 301

原创 OS学习(六)——进程调度(彩票机制)

初始行程值ABC均为0,假设选择A首先运行,行程值(A)=0+100=100。之后在BC(它们行程值最小)选择,假设选择了B,行程值(B)=0+200=200。A和B各有100张彩票,A有两个工作,B只有一个工作。当需要进行调度时,选择目前拥有最小行程值的进程,并且在运行之后将该进程的行程值增加一个步长。eg.A,B,C的票数分别为100,50,250。系统分配时,根据A:B=1:1来进行分配,给A的两个工作各全局货币50张,B100张。上图可知,A运行2次,B运行1次,C运行5次,正好是票数的比例。

2024-03-22 10:51:30 290 1

原创 一个有趣的问题

注意len是unsigned类型,传参0的时候,for循环里len-1会将int的-1转换为unsigned。-1的补码为1111 1111 1111 1111 1111 1111 1111 1111。这是一个讨论题,学了类型转换之后很好理解,但是之前我想法错了,在此分享一下。(表达式存在有符号数和无符号数时,int默认转换为unsigned)其中a数组只有3个元素,for循环中会非法访问,引起段错误。在unsigned中这个数代表2^32-1。运行后会有什么结果?

2024-03-20 20:39:56 208 1

原创 CS学习(四)——整数的编码

对于和=2^(w-1)的称为正溢出,这时由于符号位因为进位的原因变为1所以结果为负数。相差:2^(w+k)-|x|-(2^w-|x|)=2^w(2^k-1)两个w位的无符号数u,v相乘,得到2w位的结果,舍弃前w位。正数自不必说,原先的w位不变,w+1~w+k位为0即可。要使扩展后的值不变,|x|要加上上述相差的值。法一:写出原码,除符号位外均变反,再+1。扩展k位之后的补码:2^(w+k)-|x|

2024-03-20 19:51:36 267 1

原创 OS学习(五)——MLFQ

2.愚弄调度程序(game the scheduler):进程在时间片快用完时调用I/O,保持在高优先级,占用更多的CPU时间。3.一个程序在不同时间表现不同,计算密集的进程在另一个时间可能表现为交互型,用当前的方法,它不会享受交互型的待遇。1.饥饿(starvation)问题:若存在太多的交互型工作,长工作就永远无法得到CPU,被“饿死”了。交互型工作(灰色)在CPU密集工作一段时间后进入,连续运行完两个时间片后结束,继续运行黑色工作。占用CPU时间长,响应时间不重要的长时间计算密集型工作。

2024-03-18 16:24:49 340

原创 OS学习(四)——进程调度

A和B都需要50s的CPU时间,但A每运行10ms就发出I/O请求,假设每个I/O请求需要10ms,B不发出I/O请求。当工作发出I/O请求时,当前运行的程序会被阻塞,不使用CPU。时间片太长,响应时间不好。它抢占式地调度程序,即抢占一个工作,运行另一个工作。P1:24+36+30+12+1(切换)+1(切换)+1(调度)=105s。P3:18+24+36+1(进程切换)+1(进程调度)=80s。简单说来,就是不是一直做一个工作,A工作一会后B工作。A在0s到达,B和C在10s到达。到达顺序:A,B,C。

2024-03-15 10:46:17 328 1

原创 OS学习(三)——进程运行机制

程序可以执行特殊的陷阱(trap)命令,顾名思义,跳入内核并将级别提升。完成后,OS调用一个特殊的从陷阱返回的指令(return-from-trap),回到用户模式。即为当前正在执行的进程保存一些寄存器的值(到内核栈),并为即将执行的进程恢复一些寄存器的值。过程:OS在进程列表中创建一个进程条目,为其分配内存,将程序代码从磁盘加载到内存中,找到入口点(main()函数或类似的),跳转并运行。被OS显示保存在进程结构的内存中,这一操作让系统好像刚由A陷入内核变为好像刚由B陷入内核。由硬件隐式保存在内核栈;

2024-03-15 08:15:38 322 1

原创 CS学习(三)——信息的位与表示

以十进制的-18为例,其补码为1110 1110,算术右移1位为1111 0111(数据以补码形式保存在机器中),转为原码是1000 1001为-9,刚好是除以2。逻辑位移适用于无符号数,算术位移适用于有符号数(最高位是符号位)。左移x位是乘2^x(若无溢出),右移是除以2^x(但会有误差)因此连续存放的两个字之间相隔4(32位)/8(64位)个地址。(1)计算机是由仅具有“开”“关”两个状态的逻辑电路组成的。(返回值非1即0,就是说不用管多大,只要不是0就当作1来看)所以,补上符号位实现了除以2的操作。

2024-03-13 21:08:07 348

原创 Pytorch学习(二)—— Dataset类

因为我们要对图像进行处理,我们再导入PIL(Python Imaging Library)打开img有更详细的信息,在console中用img.xx查看。创建两个对象ants和bees,二者可以用"+"创建集合。这下就可以在getitem中实现对图片的读取了。想通过idx返回图片地址的话,首先创建图片列表。上文我们已经配置好环境,接下来进入实战环节。重写父类方法,init和getitem。用img_path接收,用img读取。首先在pycharm中创建py文件。查看文件路径,导入os。

2024-03-12 11:20:00 359 1

原创 CS学习(二)初识指令&stack

而ALU计算的话,加法需要1~3个时钟周期,乘法一般需要>10个时间周期,除法需要几十甚至上百个时间周期。有这样一个汇编语言文件,第八行有jmp指令,预期不会执行第九行的movl而是直接跳转到11行。18行:pushw读取value的后十六位,高位到低位依次入栈。22行:32位数据出栈,并将其写入ebx寄存器中。23行:32位数据出栈,并将其写入eax寄存器中。24行:16位数据出栈,并将其写入cx寄存器中。10行:将32位的0x88888888入栈。17行:bx(ebx的低十六位)入栈。

2024-03-11 15:08:15 410

原创 OS学习(二)——API&进程

应用程序编程接口(英语:Application Programming Interface,简称:API),是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。子进程创建(fork)完成后,shell在exec()之前关闭标准输出,打开文件newfile,wc的输出结果发送到newfile上,而不是在屏幕中打印出来。当fork()成功调用后,子进程的rc=0,父进程的rc>0。创建新进程,新进程为子进程,原来进程为父进程。

2024-03-08 11:10:37 300

原创 OS学习(一)——初识进程

这张表格中,Process0即使I/O完成也没有开始运行,而是等到Process1运行结束后才开始。资源管理器:让许多程序同时访问自己的指令和数据,让许多程序访问设备。操作系统将代码和静态数据load到内存中,加载到进程的地址空间。虚拟化CPU:让一个进程只运行一个时间片,然后切换到其他进程。为栈(stack)分配内存,存放局部变量,函数参数和返回地址。阻塞:常见例子,当进程向磁盘发出I/O请求时,它会被阻塞。将CPU的控制权转移到新创建的进程中,程序开始执行。进程:操作系统为正在运行的程序提供的抽象。

2024-03-08 09:31:49 376 1

原创 CS学习(一)——汇编入门

拿图的第一行举例:rax的后32位为eax,eax的后16位为ax,ax的前八位为ah,后八位为al。对这里而言,eax的值是values地址+edi寄存器存的数字+ebx存的数字*1得到的地址中的数。每条语句和.s文件顺序都对的上(注意:每次输入n之后在shell上显示的是下一条将要执行的语句)汇编器:处理汇编语言变成机器语言指令,生成一种“可重定位目标程序”,内容保存在.o文件中。有效地址:EA=D+(Rb+Ri*s),s只能是1,2,4,8(移位操作,速度快)?

2024-03-06 21:25:32 1626

原创 Pytorch学习(一)—— 关于配置环境

通过conda activate pytorch(创建虚拟环境的相关步骤在网上一抓一大片,这里不过多赘述)命令进入虚拟环境中(很好理解,activate为激活,pytorch为自己命名的虚拟环境名称)Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。anaconda下载好之后,在其目录下有名为“Anaconda Prompt”的程序,运行后是这个样子。谨以此笔记记录本人关于深度学习的经历,愿与诸君共勉。至此,准备阶段结束。

2024-03-04 15:27:49 347 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除