笔记
文章平均质量分 74
发如雪-ty
一个工作7年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有3年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
c++11 线程休眠
std::this_thread::sleep_for(std::chrono::seconds(4)); //休眠4秒std::this_thread::sleep_for(std::chrono:: milliseconds (150)); //休眠150毫秒原创 2021-06-02 09:53:30 · 708 阅读 · 1 评论 -
程序如何兼Linux和Windows系统
如果我们有一个可以能够解析 PE 格式的装载器,我们就有可能在 Linux 下运行 Windows 程序了。这样的程序真的存在吗?没错,Linux 下著名的开源项目 Wine,就是通过兼容 PE 格式的装载器,使得我们能直接在 Linux 下运行 Windows 程序的。而现在微软的 Windows 里面也提供了 WSL,也就是 Windows Subsystem for Linux,可以解析和加载 ELF 格式的文件。...原创 2021-05-16 00:05:54 · 236 阅读 · 0 评论 -
操作系统-16-进程退出后占用的内存去哪了?
进程退出后占用的内存去哪了?作为程序员我们需要执行,当进程结束后,进程占用的所有的内存空间将被操作系统回收,包括函数调用使用的栈、动态内存分配使用的堆、代码段中的机器指令、数据段中的全局变量等。所谓回收,就是将进程所占用的内存空间标记为可用,可以用于其它用途了。而当进程运行时这些所占用的内存是不可以用作其它用途的。因此,我们不用担心堆区上动态分配的内存在程序结束前没有释放,这是不会造成内存泄漏的,因为进程退出后包括堆区在内所有占用的内存都会被操作系统回收,如图所示:因此如果程序存在内存泄漏但是又一时找原创 2021-04-23 23:04:49 · 1218 阅读 · 0 评论 -
操作系统-15-进程的创建
从这一节起,我们将详细讲解进程的一生。进程如人生,进程的一生同样包含三个阶段,创建,运行和终结,本节是进程三部曲的开篇:进程创建。接下来,我们讲解关于进程创建的诸多问题。进程是由谁创建的?在什么情况下创建的?幸好这个问题不像鸡生蛋蛋生鸡那样,这个问题的答案相对简单,进程的创建者有两种:1.操作系统可以创建新的进程2.进程也可以创建新的进程其中,进程的创建者被称为父进程,创建出的进程被称为子进程。1,操作系统创建进程:初始化作为计算机的Boss,最初的进程是由操作系统创建的,操作系统在初始化的原创 2021-04-14 12:12:21 · 11570 阅读 · 3 评论 -
操作系统-14-操作系统是如何运行的
操作系统是如何启动的我们已经知道了,操作系统其实就是一个大的C程序,本质上和我们自己写的C程序没什么区别,用户程序要想运行起来需要被操作系统从磁盘加载到内存中,那么操作系统是如何运行起来的呢?我们可以自己想一下这个问题,计算机在关机状态下也就是不通电的状态下内存是不能保存内容的,因此一般情况下操作系统和我们的程序一样都是保存在磁盘当中(没有磁盘的计算设备,例如嵌入式设备,会保存在ROM中,稍后会有解释),那么操作系统要想运行起来必然需要被什么东西加载到内存当中。当我们按下计算机的开机按键后,这时的计算原创 2021-04-11 22:25:52 · 3204 阅读 · 2 评论 -
操作系统-13-程序员应如何理解中断
在这一节中我们聊一聊,操作系统管理外设的中断机制。为什么要在这一节聊一聊操作系统如何管理外设呢,外设管理是操作系统的核心任务之一,理解操作系统的外设管理机制对于我们理解操作系统工作原理至关重要。通过第二章的讲解,我们已经知道了,利用系统调用这种机制,我们可以向操作系统发起请求来创建进程、读写文件等等,虽然我们还没有讲解操作系统如何进行进程管理文件管理等,至少操作系统的这一部分工作机制,也就是系统调用,对于我们来说已经不再神秘了,但是我们依然不清楚操作系统是如何管理外部设备(鼠标、键盘、USB设备、打印机、原创 2021-04-09 00:04:46 · 596 阅读 · 5 评论 -
操作系统-11-以发展的眼光来看待操作系统
操作系统和生物一样也是在不断演变进化的,操作系统也不是一下子就变成现在这种样子的。现代的操作系统是什么样子的呢?1.非常靓丽易用的图形界面2.普遍支持多任务,也就是操作系统上可以同时运行很多程序。3.所有进程看到的内存都是4G(32位下),而且无论物理内存是多少都是这样的。4.应用程序无需全部加载到内存中就可以开始运行。5.一个进程崩溃后不会影响到其它进程。6.等等等等在个人计算机(PC)刚刚出现时,所谓的操作系统在现在看来还非常原始,在这里我们以微软的 MS-DOS 为例来给大家讲解一下最原创 2021-04-06 20:41:47 · 147 阅读 · 0 评论 -
操作系统-10-程序员应如何理解系统调用<下>
系统调用类型由于一个系统的功能都是通过系统调用对外提供的,因此应用程序能够实现的最强大的功能不会超过系统调用提供给应用程序的能力。根据类型系统调用大体可以划分为以下几类:1.进程控制:一个运行中的进程可以创建另外一个进程去完成某项工作,这样当前进程就有机会去处理自己感兴趣的事情,这类系统调用在Linux中是fork(),在Windows下CreateProcess()。当我们创建新的进程后,可能需要等待其运行完成,这时我们需要的系统调用是Linux下的wait()或者Windows下的WaitForS原创 2021-04-06 14:01:21 · 232 阅读 · 0 评论 -
操作系统-09-程序员应如何理解系统调用<上>
操作系统主要有两项功能:1.向用户程序提供一个友好的编程接口,即系统调用2.管理计算机资源(包括CPU、内存、磁盘、网卡等外设,以及进程管理,线程管理,文件管理等)通常操作系统如何管理计算资源对于程序员来说是不可见的,应用程序想要使用系统资源必须通过操作系统,从这个角度讲操作系统更像是server,我们的应用程序是client,client只需要向server发出request然后得到response,至于server如何处理请求并不要client关心。同样的道理,应用程序只需要进行系统调用,而操作系原创 2021-04-05 22:51:50 · 434 阅读 · 4 评论 -
操作系统-08-系统调用是如何实现的
在上一节《操作系统如何看待进程》中,我们已经知道,操作系统对于用户程序是不信任的,因此操作系统需要对用户程序进行严加防范,那么操作系统该如何做到这一点呢,这就涉及到了“控制与被控制”的问题,在这里被控制的一方是用户程序,而施加控制的一方是操作系统,同时“控制与被控制”是单向的,用户程序不能翻过来控制操作系统。要做到这一点,我们首先来看一个例子你就明白啦。警察与囚犯,操作系统与进程我们知道囚犯被关在监牢里面,其活动范围只能局限在监牢这个狭小的范围内,如果囚犯试图越狱的话会触发监狱的警报,这时警察就会立即将原创 2021-04-05 20:40:55 · 440 阅读 · 0 评论 -
操作系统-07-操作系统是如何看待进程的
进程是操作系统中最重要的概念,没有之一,操作系统中大部分设计都是围绕“进程”这个概念实现的。因此能否彻底理解进程将直接影响程序员对于操作系统的理解。不简单的HelloWorld可能许多程序员都没有意识到我们的代码中有许多操作必须依赖操作系统才能完成,比如在网络通信程序中,从socket进行数据的读取与写入实际上是操作系统替我们完成的。由于操作系统对复杂的操作过程进行了封装,因此在程序员眼里这仅仅就是一个函数调用没什么大不了的。不过这也从设计的角度说明了操作系统的作用,那就是封装复杂的硬件操作过程,对外界原创 2021-04-04 19:11:06 · 222 阅读 · 0 评论 -
操作系统-06-程序员应如何理解CPU<下>
程序计数器(Program Counter)到目前为止,我们介绍了CPU的工作过程,这个过程非常简单,CPU从内存中取出指令,执行指令然后继续从内存中取出指令。。但是有个问题我们没有回答,那就是:CPU是怎么知道从内存中的哪个位置取出指令呢?原来,CPU中有一个专门的寄存器用来存放下一条指令的内存地址。当CPU执行完一个指令后,就会根据这个寄存器中的内存地址取出下一条指令,取出指令后,该寄存器的内存地址+1,然后指向CPU要执行的下一条指令。这个寄存器在大部分教材中叫做Program Counter原创 2021-04-04 17:46:05 · 224 阅读 · 0 评论 -
操作系统-05-程序员应如何理解CPU<上>
你可能会想,作为程序员,我们需要理解CPU吗?是的,如果你想彻底理解操作系统的话。在后面的课程中你会发现,仅仅依赖软件是无法完成某些特定的功能的,比如,我们在《程序员如何理解内存》这一节中提到的虚拟内存,这项功能的实现需要依赖CPU的配合才能完成。因此在这一节中,将重点讲解一下作为程序员应该知道哪些CPU相关的知识。什么是机器指令你肯定已经知道了,CPU是计算机的大脑,程序员写的代码最终都是CPU来执行的。但作为计算机的大脑,CPU并不认识C,C++、Python、Java等语言,这些语言是人类可以原创 2021-04-04 17:05:48 · 212 阅读 · 0 评论 -
操作系统-04-程序员如何理解内存<下>
堆与栈的本质是什么在编程语言中,堆区和栈区本质上都是内存,因此二者在本质上没有任何区别,只不过这两块内存的使用方式是不一样的。在数据结构与算法中,我们也有堆和栈的概念,但那里指的不是内存,而是两种数据结构。你可能会想,我们为什么要费尽心力的提出堆和栈这两个概念呢?之所以需要区分两种内存用法,根源在于:内存是有限的。如果计算机内存是无限的,那么我们根本就不用这么麻烦的给内存划分两个区域,在其中的一个区域中这样使用内存,另一区域那样使用内存,这些都是不需要的。即使在今天PC内存普遍都在8G、16G,这依原创 2021-04-03 15:12:51 · 249 阅读 · 0 评论 -
操作系统-03-程序员如何理解内存<上>
什么是内存0和1这两个简单的数字能做什么?在其它学科中也许什么都做不了,但是在计算机科学中这就是全部。精彩纷呈的计算机世界正是构筑在这样两个简单数字之上。内存本身其实非常简单,内存的作用就是用来装数字0和数字1的,如图所示,图中的一个盒子就是内存的一个基本单元,装的不是0就是装的1。内存由一大堆的“盒子”组成,每个盒子中要么是0要么是1,其中8个盒子被称之为一个“字节”,每8个盒子也就是一个字节都有一个编号,这些编号就是简单的从0开始依次累加的,这个编号就被称之为“内存地址”。如图所示,你可以把内存原创 2021-04-02 16:34:37 · 189 阅读 · 0 评论 -
操作系统-02-什么是程序,什么又是进程?
本节是操作系统系列教程的第二篇文章,属于操作系统第一章即基础篇,在真正开始操作系统相关章节前在这一部分回顾一些重要的主题,算是温故知新吧,以下是正文。到目前为止,你肯定已经见过很多次这两个词了,“程序”“进程”。那程序和进程到底有什么区别呢。程序是一个静态的概念。进程是一个动态的概念。我们用一个例子来形象的讲解一下这个区别。程序其实本质上和我们的菜谱非常类似,一个菜谱规定了完成一道菜的整个流程,一步一步每个节点执行什么样的操作,但是看一遍菜谱是不能变出一道美味可口的菜肴的。要想真正做出一道菜就应该按原创 2021-04-01 19:43:44 · 886 阅读 · 0 评论 -
操作系统-01-什么是程序?
本节是操作系统系列教程的第一篇文章,属于操作系统第一章即基础篇,在真正开始操作系统相关章节前在这一部分回顾一些重要的主题,算是温故知新吧,以下是正文。虽然在这里我们主要关注的是操作系统,但毕竟操作系统的目的就是能更好的运行用户程序,而且该教程主要是站在程序员的角度来讲解操作系统,作为程序员是绕不开程序这个话题的,因此在深入理解操作系统之前还是有必要来聊一聊程序是怎么一回事。究竟什么是程序?我们引用Wikipedia对计算机程序的定义:A computer program is a collectio原创 2021-04-01 19:22:38 · 674 阅读 · 2 评论 -
telnet2020
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。...原创 2020-11-30 23:07:28 · 297 阅读 · 0 评论 -
一个C++源文件从文本到可执行文件经历的过程?-2020-11
对于C++源文件,从文本到可执行文件一般需要四个过程:预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件...原创 2020-11-27 12:03:13 · 189 阅读 · 0 评论 -
map和set 2020-11
是怎么实现的?map和set都是C++的关联容器,其底层实现都是红黑树(RB-Tree)。由于 map 和set所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 map 和set的操作tt行为,都只是转调 RB-tree 的操作行为。map和set区别在于:(1)map中的元素是key-value(关键字—值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。(2)set的迭代器是const的,不允许修改元素原创 2020-11-27 11:49:38 · 348 阅读 · 0 评论