- 博客(27)
- 收藏
- 关注
原创 计算机组成原理——指令系统
直接寻址:指令字中的形式地址A就是操作数的真实地址,特点是寻找操作数简单,不需要专门计算操作数的地址,在指令执行阶段对主存只访问一次,;间接寻址:倘若指令中的形式地址不直接指出操作数的地址,而是指出操作数地址所在的存储单元地址,这种寻址方式与直接寻址相比扩大了操作数的寻址范围,缺点在于指令的执行阶段需要访存两次或多次,致使指令执行时间变长;地址码用来指明该指令的源操作数的地址,结果的地址以及下一条指令的地址,这里的地址可以是主存的地址,也可以是寄存器的地址,还可以是i/o设备的地址。
2024-06-23 14:49:53 387
原创 计算机组成原理——输入输出系统
首先要明确i/o设备与主机交换信息是与cpu与主存交换信息是不同的,其次存在多种方式:i/o设备编址方式,设备寻址,传送方式,联络方式。在i/o设备与主机进行交换信息时,由于设备本身机电特性的影响,,其工作效率低,与pcu无法匹配,因此在启动设备后,往往需要等待一段时间才能实现主机和i/o设备之间的信息交换,如果在设备准备的同时,cpu不做无谓的等待,而继续执行现行程序,只有当i/o设备准备就绪后向cpu提出请求后,再暂时中断cpu现行程序转入i/o服务程序,这便产生了i/o中断。
2024-06-23 13:51:06 646
原创 计算机组成原理——存储器
缓存——主存结构解决的是cpu和主存速度不匹配的问题,主存——辅存层次主要解决存储系统的容量问题,在主存缓存这一层次发展中,逐渐形成了虚拟存储系统,它的作用是与辅存类似,当虚拟地址的内容在主存中时,机器可以立即使用;多体模块结构的存储器采用了交叉编址后,可以在不改变每个模块存取周期的前提下,提高存储器的带宽。随着计算机应用领域的不断扩大,处理的信息量越来越多,对存储器的工作速度和容量要求越来越高,此外,cpu的功能不断增强,i/o设备的数量不断增多,致使主存的存取速度已成为计算机系统的瓶颈。
2024-06-20 09:07:05 902
原创 计算机组成原理——总线
在通信时间上,则应按分时方式来处理,即以获得总线使用权的先后顺序分时占用总线,即哪一个部件获得使用权,此刻就由他传送,下一部件获得使用权,接着下一时刻传送。系统总线按照传输信息的不同又可以分为:数据总线,地址总线和控制总线,数据总线是用于传输各功能部件之间的数据信息,是双向传输总线,其位数与机器字长和存储字长有关,地址总线主要指数据总线上的源数据或目的数据在主存单元的地址或i/o设备的地址,其是单向传输总线,与存储地址和i/o地址有关,控制总线是用来发出各种控制信号的传输线。
2024-06-18 22:33:47 776
原创 Linux进程<4>
进程地址空间,每一个进程,都会存在一个进程地址空间,对于操作系统而言,物理内存是有限的,但是进程却有很多且都要申请物理空间的使用,那进程地址空间可以理解为是操作系统用来“欺骗”进程的,且每一个进程的进程地址空间都受操作系统的管理,根据“先描述,在组织”的原则去分配相适应的“饼”。正所谓虚拟地址,我们的地址空间,并不能像物理地址一样保存我们的代码和数据,但是地址空间上的虚拟地址可以转化到物理内存中,给我们的进程提供一张映射表(页表),进而实现对物理内存的管理。同时,地址空间+页表是保护内存安全的重要手段。
2024-03-20 23:16:35 525
原创 Linux进程<3>
接下来细说PRI,liux默认优先级是80,linux的优先级是可以被需改的,linux的优先级的范围是【60,99】,其pri=pri(old)+nice。接下来介绍的是环境变量,我先引入一下:在学习C语言中,main函数后面的括号内容一般被省略不写,那么系统默认会执行main函数的第一部分功能,事实上main函数有多个功能,其通过命令行参数去实现main函数的多功能,这样做的目的是可以让我们通过不同的选项,让我们的同一个程序去执行内部不同的功能,对于linux,命令行参数是linux选项的基础。
2024-03-20 23:15:38 616
原创 Linux进程<2>
在创建进程的时候,系统会多一个进程,这个进程就是熟知的子进程,其是以父进程为模板的。因为父进程和子进程都需要返回,返回的分别是父进程的返回值和子进程的返回值。进程状态 首先要了解进程排队的事情,对于操作系统而言,要同时处理多种进程,对于计算机而言,必要的系统进程运行是必须保证的,那么对于操作系统而言,进程的进行就有了先后之分,即会产生进程排队的现象。回到排队,也就是这些结构体(进程的task_struct)的排队,这里pcb可以理解为一种结构体,在这种结构体中,会存储着各种对象,比如键盘,鼠标等等。
2024-03-20 23:14:04 221
原创 Linux 进程<1>
进一步的说管理者核心的工作是做决策,根据数据做决策。第二管理者是通过辅导员拿到被管理者的信息的,第三管理者在面对大量的被管理的数据时,就会用到不同的数据结构去将这些数据封装,通过对数据结构的增删查改以实现对信息,人的管理。第二程序有两个去向,一是程序->文件->磁盘->外设->内存->cpu,二是程序-> 指令和数据 ->cpu,因为最终程序都会让其cpu去处理(cpu的处理数据的效率很高),第三是在内设(数据)层面,cpu和内存打交道,在外设层面,各种设备会和内存打交道,这一点也可以看作是第二点的补充。
2024-03-20 23:12:18 767 1
原创 树和二叉树<3>
这个实现思路在于 第一次进行判断这个1代表的是根结点的个数,及最大的一棵二叉树的根结点,当递归进入root->left后,其可以认为该节点以下的左右结点以及它自己组成了一棵小树,这个1就是这棵小二叉树的根结点,只不过在大二叉树里,这个小树的根结点不过是大树根结点的左结点。但是个人认为最重要的是思维,就像每一次递归,程序中的1的位置将决定了递归将以何种方式实现,是应该在遍历前就+1,还是在遍历后+1,将直接影响到我们算法的正确性。这个问题和求二叉树节点的思路类似,可以理解为从左往右的,从上往下的查找。
2023-09-22 08:01:39 124 3
原创 树和二叉树<2>
如果有一个关键码的集合K={k0,k1,k2,-----,k(n-1)},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki<=K(2i+1)且Ki<=K(2i+2)或者Ki>=K(2i+1)且Ki>=K(2i+2)(i是正整数和0),则称为小堆(或大堆)。2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。前k个最大的元素,则建小堆/前k个最小的元素,则建大堆。
2023-09-20 23:11:17 79 1
原创 树和二叉树<1>
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1
2023-09-19 22:09:55 81
原创 数据结构之单链表
要明确的是和头删有所不同,不同在于头删改变的是指向单链表指针的所指,担心原指针的数据是否被顶替,从而发生循环的现象,改变的是前指针,对于在有节点的查数据情况下,其改变的是结构体指针,改变的是后指针。这里传二级指针的原因是我要修改指向结构体的指针,这个和一级指针传参不同,传一级指针的原因是要修改的是结构体中的存放下一个数据地址的指针,和前面我所说的申请节点的一前一后指针分别对应。其次在单链表有元素的情况下,即让指向单链表的头节点的指针存储的是单链表的第二个节点数据的地址完成头删。重点在于前后指针的改变。
2023-08-01 08:09:38 109 2
原创 数据结构之顺序表
8.顺序表具体数的修改。然后是顺序表的自我增容,首先其开始条件是当有效数字的个数与容量大小相等时,迭代条件是每次以顺序表原有大小的二倍进行扩增,结束条件是开辟成功,并且让顺序表的地址成功转移到新开辟的空间上。5.顺序表的尾删,头删,首先思路是找到该顺序表的结尾/开头,前者找到顺序表的倒数第二的位置后直接删除,后者则是将除第一个元素外的其他元素全部左移,从而“挤掉第一个元素”。3.顺序表的尾插,头插,首先其思路是找到该顺序表的结尾/开头,再判断空间是否足够(运用顺序表的自我增容函数判断),再进行数的插入。
2023-07-26 10:59:58 83 1
原创 C语言分支和循环语句
C语言语句可以分为以下五类:1.表达式语句2.函数调用语句3.控制语句4.复合语句5.空语句。本章介绍的是控制语句。首先,控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构,选择结构,循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。可以分为如下三类:<1>条件判断语句(分支语句):if语句,switch语句;<2>循环执行语句:do while语句,while语句,for语句。
2023-04-23 20:34:23 93 3
原创 C语言语法之函数的初步认知
1>函数声明:1.告诉编译器有一个函数,其函数名,参数,返回类型。但是函数具体存不存在,声明决定不了。2.函数的声明一般出现在函数的使用之前,要先满足先声明后使用。3.函数的声明一般放在头文件中。(函数的声明多放在工程量较大的项目中,这时候项目往往包含多个源文件,一个头文件,此时函数的声明能够使代码整体调理)。以下举一个函数声明的简单例子:(这样写是为了防止ADD函数被重复引用)<2>函数的定义。
2023-04-23 17:49:01 45
原创 指针和数组的关系
结果我们会发现即使访问的方式不同,但打印出来的内容"abcdef"却相同,所以通过这个测试,我们可以得到指针和数组在在指向或者表示一块空间时,访问方式是相通的。通过前面数组的介绍,我们知道数组传参是要发生降维成为指针的现象(数组arr在main函数中为数组,但在传入函数后,其arr就变成数组首元素的指针变量)。(对于用指针指向的字符串内容,其内容放在字符串常量区中,虽然指针在栈上开辟,但当退出main函数后,指针所用的栈空间被释放后,其字符串因为在字符串常量区,所以不可被用户修改。
2023-04-05 09:49:08 118 4
原创 数组的深刻理解
如果定义连续的整形变量,会发现其在栈空间进行开辟空间,并且其首先定义的变量的地址是最大的,其他定义变量的地址随定义顺序而依此减少。但是这个规律对于数组并不适应,数组在栈空间是先开辟一块空间,然后自下而上的将每个数组元素的地址依次存放,这样会导致最先的数组元素的地址反而是最小的。综上可以一句话概括数组的空间布局:线性连续且自下而上的递增,且以一个整体去开辟空间和整体释放。
2023-04-03 21:59:08 230 1
原创 指针的深度理解
指针是地址,地址是数据,数据可以用空间来储存;指针变量则是一种变量,一种用来保存指针地址的变量。若是要区分这两种概念,首先要明确变量的两个属性:变量有两个属性,一个是左值(空间,存放内容的空间),另一个则是右值(数据,占具体内存的数据)。那么对于指针,既然是地址,那么则可理解为右值。但对于指针变量,它是变量,则存在两个属性,左值和右值。在解释之前,举个例子:如果学校领导要去学生公寓中找学生,若果没有宿舍的门牌号,那么领导只能按着楼层去一层一层的寻找目标宿舍,其过程十分繁琐。
2023-04-01 15:05:15 1045 12
原创 一段简短的自我介绍
虽然我的专业并不是直系计算机,但是这并不影响我对计算机编程的热爱,以及我对无限真理的热爱。追求约束者,终将获得解放",对于我而言,编程的奥秘就值得我去追求。与传统印象中的刻板的计算机工作者不同,我更倾向于用简单的语言阐释我所学过的知识,更乐意于身边有相同志向的朋友一同交流,共同监督,共同进步。我希望通过交流与学习,不仅能将c类语言深刻理解,更能学习更多的算法和数据结构,优化我的项目代码。相比一日千里,我更愿意细水长流,每天坚持搞懂至少一个知识点,并在博客中留下我的"微薄"看法,
2023-03-31 23:46:20 65
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人