![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机操作系统
文章平均质量分 62
小时候挺菜
这个作者很懒,什么都没留下…
展开
-
C语言编译和链接
编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译、链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件。编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码转变为功能有效的汇编代码。编译过程如下:1、 预编译过程在c语言的预编译过程中,主要是对宏定义、条件编译语句、头文件包含语句以及特殊符号进行处理。对于宏定义语句,比如#defi...转载 2018-11-05 20:13:00 · 178 阅读 · 0 评论 -
寄存器与存储器
存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右。内存和寄存器就是为了解决存储器读写速度慢而产生的多级存储机制,从20世纪50年代开始,磁芯存储器曾一度成为主存的主要存储介质,但从20世纪70年代开始,逐步被半导体存储器所取代,目前的计算机都是用半导体存储器。现在的DDR2内存的读写速度一般为6~...转载 2018-08-15 21:09:00 · 951 阅读 · 0 评论 -
线程与进程的区别
线程与进程的比较1) 调度。在传统的操作系统中,拥有资源和独立调度的基本单位都是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。2) 拥有资源。不论是传统操作系统还是设有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系...原创 2018-07-23 19:47:00 · 90 阅读 · 0 评论 -
同步异步
"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的."异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。 线程同步与异步区别线程同步是多个线程...原创 2018-07-23 19:39:00 · 80 阅读 · 0 评论 -
深入理解计算机操作系统(十一)
感想终于看完了《深入理解计算机系统》这本巨著。从今年1月初到现在5月底,历时5个月。做了一本笔记,写了九篇文章。由于看的是英文版,进度比较慢。但即使用了这么久的时间,仍然是非常值得的。这本书所教给我的东西是其它任何地方都难以学到的,它所讲述的是一个系统,而不是零散的体系结构、操作系统、网络编程。当我们能够站在整个系统的角度高屋建瓴,才算真正领悟到了计算机的精髓。然而领悟只是第一步,作者...转载 2018-07-23 14:51:00 · 124 阅读 · 0 评论 -
深入理解计算机操作系统(十)
阅读经典——《深入理解计算机系统》09本文,我们将使用C语言从零开始实现一个支持静态/动态网页的Web服务器。我们把这个服务器叫做Tiny。背景知识 客户端-服务器编程模型 使用socket处理请求与响应 HTTP协议与静/动态网页 关键代码解析 实验效果与源码背景知识Web服务器使用HTTP协议与客户端(即浏览器)通信,而HTTP协议又基于TCP/IP协议。因此我们...转载 2018-07-23 14:50:00 · 146 阅读 · 0 评论 -
深入理解计算机操作系统(八)
阅读经典——《深入理解计算机系统》07本文将介绍非常实用的程序性能优化手段,并用一个案例来详细说明。为什么要优化程序性能? 衡量性能的指标 未优化版本 提取重复操作 减少函数调用 避免内存读写 还能进一步优化吗? 循环展开 提高并行性 重结合变换 总结为什么要优化程序性能?对于c代码而言,从源代码到汇编代码再到机器指令,这中间是有一个编译器在起作用的。编译器...转载 2018-07-23 14:48:00 · 356 阅读 · 0 评论 -
深入理解计算机操作系统(六)
阅读经典——《深入理解计算机系统》05本文讲述三个比较冷门的话题:联合、数据对齐和缓冲区溢出攻击。联合体 数据对齐 栈帧为什么必须16字节对齐? 缓冲区溢出攻击联合体在C语言中有这么一个不常用的数据类型union,往往被人们遗忘。它就是联合体。与结构体类似,都是用来封装多种数据类型,但含义不同。结构体会将各个字段按顺序分配各自独立的内存空间。而联合体则是只申请一块内存...转载 2018-07-23 14:47:00 · 197 阅读 · 0 评论 -
深入理解计算机操作系统(七)
阅读经典——《深入理解计算机系统》06本文,我们要做一件大胆的事情,从零开始实现一个全新的指令集架构,以此深入理解处理器的工作原理。指令集发展历史概况 Y86指令集 指令集及其编码 硬件控制语言HCL 存储器和时钟 指令的分阶段执行 SEQ的状态改变周期 SEQ的各阶段实现 流水线的一般原则 流水线冒险 更完善的设计 与真实指令集架构的差距指令集发展历史概况...转载 2018-07-23 14:47:00 · 1227 阅读 · 0 评论 -
深入理解计算机操作系统(五)
阅读经典——《深入理解计算机系统》04函数调用时的栈结构变化是一个很有趣的话题,本文就来详细剖析这个过程。栈帧结构 寄存器使用惯例 这段代码的含义?栈帧结构在计算机系统概述中我们介绍了虚拟地址空间,其中有一部分是栈,用于函数调用和存放局部变量。本文将详细介绍这部分栈空间是如何使用的。首先引入一个概念:栈帧。栈帧是指为一个函数调用单独分配的那部分栈空间。比如,当运行中的程...转载 2018-07-23 14:46:00 · 462 阅读 · 0 评论 -
深入理解计算机操作系统(四)
阅读经典——《深入理解计算机系统》03复合型类型转换的内在原理 局部变量一定进内存? 奇葩的加载有效地址指令leal if...else和三元运算符复合型类型转换的内在原理上一篇文章的最后,我们讲解了复合型类型转换,比如从short到unsigned相当于分两步,先从short转换到int,再从int转换到unsigned。也就是说,先扩大范围,再改变符号性质。而实际上呢,在...转载 2018-07-23 14:45:00 · 481 阅读 · 0 评论 -
深入理解计算机操作系统(三)
阅读经典——《深入理解计算机系统》02基本数据类型 大小端模式 整型数范围与C标准 复合型类型转换——从short到unsigned<h3 id="what_is_information">基本数据类型</h3>让我们复习一下C语言中基本数据类型的字节数名称 32位 64位 char 1 1 short int ...转载 2018-07-23 14:44:00 · 264 阅读 · 0 评论 -
深入理解计算机操作系统(二)
阅读经典——《深入理解计算机系统》01信息是什么 文件 Hello World程序的生命周期 开始运行Hello World 虚拟地址空间 总结<h3 id="what_is_information">信息是什么?</h3>信息就是位+上下文。怎么理解呢?其实计算机系统中的所有信息都是一个一个的二进制位,不论是硬盘上的文件、内存中的代码还是网络...转载 2018-07-23 14:44:00 · 219 阅读 · 0 评论 -
深入理解计算机操作系统(一)
本系列来源自:https://www.jianshu.com/p/67688d8e9f37 前言Randal E.Bryant和David R. O'Hallaron于2003年发布了这本书的第一版,直到今天,《深入理解计算机系统》已经成为计算机领域不可多得的经典教材,每一个程序员都应该读一读这本书。这是一本巨著,全文一千余页,足以让人望而却步。但又不能不读,要想成为一名优秀的编程...转载 2018-07-23 14:43:00 · 237 阅读 · 0 评论 -
Context上下文
1.对于代码中某个值来说,上下文是指这个值所在的局部(全局)作用域对象。函数使用它们实参的值 来计算返回值,成为该函数调用表达式的值。除了实参之外,每次调用还会拥有另外一个值——本次调用的上下文——这就是this关键字的传值。如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。当通过这个对象来调用函数时,该对象就是此次调用上下文(context),也就是该函数的this的值 ...原创 2018-07-23 10:50:00 · 228 阅读 · 0 评论 -
深入理解计算机操作系统(九)
阅读经典——《深入理解计算机系统》08本文将介绍存储器层次结构以及局部性对程序性能的影响。什么是存储器层次结构? 局部性什么是存储器层次结构这个词大家也许并不陌生,计算机中的存储器从寄存器、缓存到内存、硬盘,形成了一个层次结构。为什么不用单一的一种存储设备,比如只用硬盘呢?因为每一种存储设备都有它的优缺点,硬盘虽然存储空间大,但传输速率太慢,完全跟不上CPU的节奏,直接与CP...转载 2018-11-26 15:11:31 · 326 阅读 · 0 评论 -
内存,寄存器和cache的区别与联系
1. 寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。2. 内存包含的范围非常广,一般分为只读存储器(ROM)、随机存储器(RAM)和高速缓存存储器(cache)。3. 寄存器是CPU内部的元件,寄...原创 2018-08-15 21:11:00 · 2166 阅读 · 0 评论 -
U-boot 启动内核
1:什么是UBOOT,为什么要有UBOOT? UBOOT的主要作用是用来启动linux内核,因为CPU不能直接从块设备中执行代码,需要把块设备中的程序复制到内存中,而复制之前还需要进行很多初始化工作,如时钟、串口、dram等; 如要想让CPU启动linux内核,只能通过另外的程序,进行必要的初始化工作,在把linux内核中代码复制到内存中,并执行这块内存中的代码,即可启动linux内核...转载 2018-08-16 11:44:00 · 197 阅读 · 0 评论 -
用户态和内核态
一、 Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接...原创 2018-10-12 11:04:00 · 213 阅读 · 0 评论 -
静态链接与动态链接的区别
动态链接库、静态库、import库区别动态链接库(Dynamic Linked Library): Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图...转载 2018-09-25 09:36:00 · 708 阅读 · 0 评论 -
优化程序性能
编写运行的快的程序有三个因素:①选择合适的算法和数据结构;②理解编译器的能力,使用有效的方式让编译器能进行优化;③对于运算量特别大的程序,可能还需要进行任务分解。在这一过程中可能还需要对程序的可读性和运行速度进行权衡。在阅读这一章节的过程中花费了大量的时间对我自己的自动办公软件进行了优化,算是学以致用。选择合适的算法和数据结构不在本章的讲解内容中,我们从编译器的能力和局限...转载 2018-09-13 19:15:00 · 497 阅读 · 0 评论 -
汇编中的数组分配和指针
数组简介 如果各位猿友是一路跟着LZ看到这里的,那么数组的定义就非常简单了,它就是一个相同数据类型的数据集合。数组存储在一系列逻辑上连续的内存块当中,之所以说是逻辑上连续,是因为整个内存或者说存储器本身就是逻辑上连续的一个大内存数组。如果我们用Java语言的类型来表示我们的存储器的话,可以看做是byte[] memory这样的类型。 数组的定义非常简单,它遵循以下这样简单的规则。...转载 2018-09-11 20:01:00 · 798 阅读 · 0 评论 -
汇编中的函数调用与递归
栈帧的结构 倘若我们要想搞清楚过程的实现,就必须先知道栈帧的结构是如何构成的。栈帧其实可以认为是程序栈的一段,而程序栈又是存储器的一段,因此栈帧说到底还是存储器的一段。那么既然是一段,肯定有两个端点,这个不需要LZ再普及了吧。 这两个端点其实就是两个地址,一个标识着起始地址,一个标识着结束地址,而这两个地址,则分别存储在固定的寄存器当中,即起始地址存在%ebp寄存器当中,结束地址...转载 2018-09-11 20:00:00 · 457 阅读 · 0 评论 -
汇编中的流程控制
条件码寄存器 这个子标题在之前就提到过,条件码寄存器与普通的寄存器不同,它们都是1位寄存器,换句话说,它们当中的值只有0和1。当有算术与逻辑操作发生时,这些条件码寄存器当中的值会相应的发生变化,这算是比较神奇的地方吧。 书中列出了四种常用的寄存器,它们的名字与作用分别如下所述,以下是LZ的理解。 CF:进位标志寄存器,它记录无符号操作的溢出,当溢出时会被设为1。 ZF...转载 2018-09-11 19:58:00 · 654 阅读 · 0 评论 -
特殊的算术操作指令
我们先来看看这些指令的大致介绍,如果各位看过上一章的话,会发现这里的指令有的会有些眼熟,但是它们的作用却截然不同。以下是书中的一张概图。 第一个指令有些眼熟吧,它就是我们上一章当中的imul乘法指令的双字形式。不过可以看出,这里的imull指令已经完全变了味道,它将结果存入两个寄存器。接下来,我们来仔细看看这些指令。 imull、mull指令 这两个指令一看就是双胞胎,它...转载 2018-09-11 09:14:00 · 677 阅读 · 0 评论 -
算术的逻辑运算与指令详解
eal指令是非常神奇的一个指令,它可以取一个存储器操作数的地址,并且将其赋给目的操作数。如果用C语言当中来对应的话,它就相当于&运算。 比如对于leal 4(%edx,%edx,4),%eax这条指令来讲,我们假设%edx寄存器的值为x的话,那么这条指令的作用就是将 4 + x + 4x = 5x + 4赋给%eax寄存器。它和mov指令的区别就在于,假设是movl 4(%edx,%...转载 2018-09-10 15:53:00 · 1003 阅读 · 0 评论 -
数据传送汇编指令
mov指令 mov指令的作用是将源操作数S中的数据复制到目的操作数D中,mov指令有一个数据格式和两个操作数,因此一般的形式为[movx S D]。其中x为数据格式,S为源操作数,D为目的操作数。 这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。 可以看到,在指令执行之后,%edx寄存器当中的...转载 2018-09-10 15:32:00 · 1262 阅读 · 0 评论 -
整数的运算
无符号数加法对满足0 =< x, y<2w的x和y有:例如:无符号数65535 + 1 为10000000000000000,由于超过16位,所以截断后0~15位都是0,因此结果为0结果为0 补码加法运算补码加法运算就是先按照无符号加法进行运算,而后在进行无符号和有符号的转换 对满足 -2w-1 <= x,y <= 2w-1-1...原创 2018-09-10 11:17:00 · 1021 阅读 · 0 评论 -
扩展和截断
扩展无符号数扩展:将一个无符号数转换为一个更大的数据类型,我们只需要简单的在二进制序列前面添加 0 即可有符号数的扩展:将其补码数字转换为一个更大的数据类型,我们需要在开头添加符号位,即在前面补符号位如果我们原始位为[xw-1 , xw-2 , … , x2 , x1 , x0],那么扩展k位后就可以表示为:[xw-1 ,xw-1 ,...,xw-1 , xw-2 , … , x2 ,...原创 2018-09-10 10:52:00 · 662 阅读 · 0 评论 -
有符号数与无符号数之间的转换
有符号数转换为无符号数 比较两个等式:(1) (2)我们计算(1)-(2) = xw-12w (3)我们可以得到 :B2U = xw-12w + B2T将x用T2B替代,则:B2U(T2B)= T2U = x + xw-12w位xw-1决定了x是否为负据此 我们可以得到公式:相应的转换图为: 结果为...原创 2018-09-10 10:37:00 · 2474 阅读 · 0 评论 -
计算机系统--补码,原码及反码
无符号数的编码 假设有一个w位的无符号整数,我们可以将位向量写成[xw-1 , xw-2 , … , x2 , x1 , x0]。其中每个xi都取值为0或1,我们用一个函数B2Uw(Binary to unsigned,长度为w)来表示: 函数B2U将一个长度为w的0、1串映射到非负整数: 对于一个无符号编码的数,由 w 位的二进制序列构成,那么它的最小值,即所有...原创 2018-09-10 10:02:00 · 324 阅读 · 0 评论 -
lib 和 dll 的区别、生成以及使用详解
首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个....转载 2018-08-16 12:50:00 · 96 阅读 · 0 评论 -
SDK
SDK 就是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”。即辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。APIAPI(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的 API而使操作系统去执行应用程序的命令(动作)。...原创 2018-08-16 11:59:00 · 178 阅读 · 0 评论 -
伪共享
一、伪共享的定义:伪共享的非标准定义为:缓存系统中是以缓存行(cache line)为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。二、CPU缓存机制CPU 缓存的百度百科定义为:CPU 缓存(Cache Memory)是位于 CPU 与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速...原创 2018-11-26 19:24:31 · 8238 阅读 · 2 评论