首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

操作系统极简入门

第一个操作系统加强了程序加载方式,之前只能一次给一个程序,现在可以一次多个。当计算机运行完一个程序,会自动运行下一个程序,这样就不会浪费时间,找下一个程序的纸卡,这叫批处理。...很快,人们开始分享软件,但有一个问题,在哈佛1号和 ENIAC 那个时代,计算都是一次性的,程序员只需要给那"一台"机器写代码,处理器,读卡器,打印机都是已知的。...Atlas 会把程序标记成可继续运行,之后在某时刻会安排给 CPU 运行,并继续 print 语句之后的下一行代码,这样, Atlas 可以在 CPU 上运行一个程序,同时另一个程序在打印数据,同时另一个程序读数据...这只是个简单例子,真正的程序可能会分配到内存中数十个地方,你可能想到了,这对程序员来说很难跟踪。也许内存里有一长串销售额,每天下班后要算销售总额,但列表存在一堆不连续的内存块里。...这种机制使程序的内存大小可以灵活增减叫"动态内存分配" 05 内存保护 对程序来说,内存看起来是连续的,它简化了一切,为操作系统同时运行多个程序,提供了极大的灵活性。

87110

OC观察者模式之KVO的使用与思考

引言: 无论用哪种语言进行软件开发,我们都会接触到设计模式,个人认为设计模式存在的意义在于:在某些需求下,采用适合的设计模式,使代码结构合理,从而提高代码的可读性、可扩展性、可移植性,此文将要讨论的是OC...3.KVO的实现原理 当某一个类的实例第一次使用KVO的时候,系统就会在运行期间动态的创建该类的一个派生类,该类的命名规则一般是以NSKVONotifying为前缀,以原本的类名为后缀。...1、添加观察者次数与remove次数不匹配导致程序崩溃 连续对同一属性添加观察者是可以的,但是也要保证在移除观察者的时候也要移除对应次,不然可能会引发崩溃(iOS11以上不会崩溃)。...当对同一个keypath进行两次removeObserver时会导致程序crash,这种情况常常出现在父类有一个kvo,父类在dealloc中remove了一次,子类又remove了一次的情况下。...2、移除不存在的观察者(iOS11以上不会崩溃) 当某个对象并没有添加观察者时,却执行了移除观察者的操作,也会导致程序崩溃,此处不附相关代码。

1.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Spark RDD惰性计算的自主优化

    Spark运行是惰性的,在RDD转换阶段,只会记录该转换逻辑而不会执行,只有在遇到行动算子时,才会触发真正的运算,若整个生命周期都没有行动算子,那么RDD的转换代码便不会运行。...而在惰性计算的情况下,直至运行这行代码 value.take(10).foreach(println)而遇到foreach这个行动算子时,才会去执行前面的转换,这时它会基于RDD的转化自行做一个优化——...还是以一个代码案例说明,假如需要统计薪资在10000以上的人数。...可以通过coalesce(1)只设置一个分区,使代码串行运行,然后增加打印验证一下效果—— val value = ss.sparkContext.textFile(filePath).coalesce...Robert Rice,47,男,5347,时尚潮流,图书音像,拼多多,微信支付,8,有优惠券,兴趣爱好 过滤打印 Robert Rice 这样也提醒了我们,在遇到连续转换的RDD时,其实可以自行做代码优化

    46810

    【Linux篇】调试器-gdbcgdb使用

    我们要想我们的程序在debug模式下运行的话,我们就需要在翻译的时候加上-g选项 保存退出后我们再次make一下重新形成了可执行程序 上面是没有加-g选项的,下面是加了的,我们会发现下面的可执行程序的体积大于上面的...断点可以被使能 以上是一些常用命令,我将gdb的命令整理成表格,如下所示: 命令/缩写 作用 样例 list/l 显示源代码,从上次位置开始,每次列出10行 list/l 10 list/l 函数名 列出指定函数的源代码...list/l main list/l 文件名:行号 列出指定文件的源代码 list/l mycmd.c:1 r/run 从程序开始连续执行 run n/next 单步执行,不进入函数内部 next s...print start+end p 变量 打印指定变量的值 p x set var 变量=值 修改变量的值 set var i=10 continue/c 从当前位置开始连续执行程序 continue...,而不需要去源代码中去改,。

    13510

    460道Java后端面试高频题答案版【模块六:计算机操作系统】

    在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。 9、什么是死锁?...由于系统中存在一些不可剥夺资源,而当两个或两个以上进程占有自身资源,并请求对方资源时,会导致每个进程都无法向前推进,这就是死锁。...它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。...动态链接就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码...优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。

    1.1K30

    sed 命令+正则表达式

    ; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行       c 下一命令是编辑命令,使用多项编辑时加入此选项       f 如果正在调用sed脚本文件,使用此选项...*ing,而不是*ing     打印行号:  sed -e '/music/=' temp.txt     附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时....其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”...元字符规定其前导对象必须在目标对象中连续出现零次或一次。   下面,就让我们来看一下正则表达式元字符的具体应用。   ...为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。

    3.4K20

    SparkStreaming学习笔记

    2:SparkStreaming的内部结构:本质是一个个的RDD(RDD其实是离散流,不连续)         (*)问题:Spark Streaming是如何处理连续的数据         Spark...而没有留下任何的线程用于处理接收到的数据....2:核心概念:DStream离散流-》RDD         (*)本质:将连续的数据变成不 连续的RDD-》DStream     3:DStream离散流的算子:Transformation和Action...可以考虑WordCountNetwork这个例子,对于一个特定的数据处理速率,系统可能可以每2秒打印一次单词计数(批间隔时间为2秒),但无法每500毫秒打印一次单词计数。...这个配置使系统找出那些不需要经常保有的RDD,然后去持久化它们。这可以减少Spark RDD的内存使用,也可能改善垃圾回收的行为。

    1.1K20

    深入理解Linux C语言内存管理

    在操作系统中,一个进程就是处于执行期的程序(当然包括系统资源),实际上正在执行的程序代码的活标本。那么进程的逻辑地址空间是如何划分的呢?...(1)一个进程在运行过程中,代码是根据流程依次执行的,只需要访问一次,当然跳转和递归有可能使代码执行多次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间。   ...碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。   ...堆:堆是向高地址扩展的数据结构,是不连续的内存区域。   这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。...对于堆来讲,频繁的malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低(虽然程序在退出后操作系统会对内存进行回收管理)。

    2.8K10

    字符函数和字符串函数

    而strcpy是最开始就作用。就多了一个这个。 而还要额外说一个点,能否自己链接自己。如果按照我们模拟的代码来说,其会造成死循环而后越界访问。...长度限制函数 前文 由于前面三个函数 strcat strcpy strcmp 没有长度限制而直接运行,vs编译器认为不安全,在没有 的情况下会直接报错,不让运行。...strstr strstr会返回 str2在str1的第一次地址 ,前提要str1中有str2(不包含\0)。...所以模拟实现为上述代码。 strtok 这个strtok函数本质太过复杂,这里就不模拟其函数和讲它的本质。就讲下他该如何用。 当我们要分割一个字符串时,就用strtok 。...此时errno由于无错误,所以错误码为0,错误信息就为 No error ,所以打印出以上信息。 上面的图也是一个例子去证明其perror作用 总结 这就是字符函数和字符串函数。

    6510

    【C调试实用技巧】—作为程序员应如何面对并尝试解决Bug?

    如何写出好的代码 assert 与 const(C语言) 前言 我相信大家在写代码,或者刷题时,不可能每一次都是一次就能写出完美的不出错误的代码,如果真实这样的话,恭喜你,你是一个天才,并不需要进行本篇文章的学习...CTRL + F5 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。 我们在调试的时候,当然不仅仅是只看这两个快捷键,而是要通过查看程序的当前信息配合着使用,才能发挥最大作用。...(Debug版本下进行调试) 这里以上面的代码为例:解释下面代码在vs中运行死循环的原因。...为什么会在Debug版本下死循环打印呢? 我们发现,当i==12时,i又一次变成了0,所以才进行死循环的打印。...以上便是常见的错误类型。 如何写出好的代码 所谓优秀的代码,无非就以下几个特点: 1.代码运行正常 2. bug很少 3. 效率高 4. 可读性高 5. 可维护性高 6.

    46440

    JVM学习第二天(垃圾回收器和内存分配策略)大章

    即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。...它的主要不足是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。...吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间); 垃圾收集时间=垃圾回收频率*单次垃圾回收时间; 并行:垃圾收集的多线程的同时进行。 并发:垃圾收集的多线程和应用的多线程同时进行。...所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%...这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。 内存布局:在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1不再是这样。

    44750

    【C++11】线程库

    b的++操作被执行 , 就导致 x为 1 ,而进行线程 a 和 b 分别进行一次操作 为了避免并发访问的问题,需要加锁,即 只有一个线程可以调用全局变量 ---- 2....函数 进行加锁 ,导致死锁问题 ,使程序挂掉了 (死锁: 两个线程各自持有自己的锁,并向对方申请锁,从而导致互相申请锁不成功,进而导致双执行流互相被挂起访问临界资源的临界区代码,无法得以推进) 点击查看...问题1:如何保证 v1先运行,v2阻塞?...v1先运行,v2阻塞到锁上 情况2: 若v1先抢到锁,v2后抢到锁 v2先运行,v1阻塞到锁上,但是v2会被下一步的wait进行阻塞(在阻塞前的一瞬间,会进行解锁) 保证v1先运行 问题2:如何防止...锁, 由于x作为偶数,所以线程v2会阻塞到 条件变量中(这个过程中会解锁) ---- 此时 线程v2被唤醒,x作为偶数 进行打印, 同时 会继续运行,再次进行 wait ,使 线程v2也 阻塞 到条件变量中

    20630

    【C语言】动态内存管理及相关笔试题

    有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了    C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了,而动态内存开辟的空间属于堆区,...就帮我们在堆区开辟了5个连续的整型空间,就跟我们的数组一样,只是数组的空间一般在栈区开辟,接着我们就可以把arr当作5个元素的整型数组使用,其中arr是首地址,我们来看看代码运行结果:    可以看到代码很好地跑了起来...是不会的,如果不释放,那么我们写的程序就会一直占用这段空间,无法让其他程序利用    所以当我们使用内存函数开辟了空间,使用完毕要手动的把这段空间释放了,否则会造成空间浪费,而free函数就是用来释放内存空间的函数...我们来看看运行结果:    我们惊讶地发现程序居然什么都没有打印,这是为什么?...栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等 堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 ,分配⽅式类似于链表, 数据段(静态区):(static

    9210

    【计算机基础】操作系统

    4.投入运行 2.存储器管理(内存) a.内存分配:连续、离散(分段分页) b.内存保护:为每个程序设置自己的界限寄存器 c.地址映射:从“逻辑地址”到“物理地址” 1)装入程序:逻辑地址(从0开始)...如何将一个用户源程序变为一个可在内核中执行的程序 编译,由编译程序将若干源代码编译成目标模块 链接,由链接程序将一组目标块以及所需函数库接在一起,形成一个完整装入模块 装入,由装入程序将装入模块装入 链接方式...1.分页存储管理 (1)将程序逻辑地址分为若干相等切片,称为“页(面)”; (2)将内存空间分为相同大小块,称为“物理块 /页框” (3)分配内存时将若干页装入可不连续的页框 (4)进程最后一页装不满一个物理块而产生...完成I/O后,设备控制器向CPU发出一次中断,CPU保存现场,设置中断处理程序的现场处理中断。处理完后恢复现场。 缓冲 主要是缓和CPU与I/O设备之间速度不匹配。...例如在打印机和控制器中设置一缓冲区,用于快速暂存程序的输出数据,以后由打印机“慢慢地”从中取出数据打印,提高CPU效率。

    92630

    【C语言】函数

    函数了,那这两个函数应该如何设计呢?    ...0,我们曾经写过如何判断润年,这里直接将它包装为一个函数即可,如: get_days:我们可以使用一个数组来存放每个月的天数,这里可以用到一个小技巧,由于数组下标从0开始,而月份却是从1开始,我们就可以在...函数之前,编译器不会有警告,可以顺利完成编译 (2)函数定义在main函数下方: 此时程序还是可以正常运行,但是报了一条警告,说函数Add未定义,这是因为C语⾔编译器对源代码进⾏编译的时候,从第⼀⾏...,我们下面详细介绍一下 static修饰局部变量: 我们对比以下代码: 它们的运行结果有什么不同呢?...代码2中,test函数中的i创建好后,出函数的时候是不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算    以上两个代码的运行结果如下: 解析:代码1由于是局部变量,每一次调用函数结束就要被销毁

    10910

    C语言动态内存管理

    为什么要有动态内存分配 int val = 20;//在栈空间上开辟四个字节 char arr[10] = {0};//在栈空间上开辟10个字节的连续空间 通过以上例子我们可以总结一下几点: 1.在声明变量时...return 1;//如果是空指针直接结束程序 } //开辟成功,使用内存 for (int i = 0; i < 10; i++) { *(p+i) = i; } //打印 for...if (p == NULL) { perror("malloc");//申请失败就打印错误信息 return 1;//直接结束程序 } //我们还可以使用assert断言 assert(p) 4.2...} 运行结果:   指针 p 指向的内存并不是通过 malloc、calloc 或 realloc 等动态分配内存函数分配的。因此,调用 free(p) 会导致未定义的行为,可能会导致程序崩溃。...:   对同一块动态内存多次释放会导致严重的问题,因为 free() 函数只应该对动态分配的内存块进行一次释放。

    7910

    动态内存管理(超详细!)

    因此,C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就可以使得内存空间变得灵活,同时也可以不浪费空间。...我们举一个例子: int main() { int a = 1; int* ptr = &a; free(ptr); ptr=NULL; return 0; } 这个代码在运行是就会中断,因为...我们用代码验证一下: 用calloc函数开辟十个整形大小的空间,并将其打印 #include #include int main() { int* p =...= p) { exit(EXIT_FAILURE); } for(i=0; i<=10; i++) { *(p+i) = i; } free(p); 我们只为p申请了十个int的空间,而此代码中的...++”操作,p不再指向内存起始的位置,并没有释放整个动态内存,而是一部分 对同⼀块动态内存多次释放 int *p = (int *)malloc(100); free(p); free(p); 此代码中连续进行了两次

    13710

    数据结构---顺序表

    当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性 ⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的 ⽅式。...补充:其实顺序表是线性表的一种,具有相同特性的数据结构的集合 2.2顺序表的特性 既然顺序表是线性表的一种,那么逻辑结构在线性表上都是连续的那肯定在顺序表上也一定是连续的,而物理结构在线性表上是不一定连续...,所以物理结构在顺序表上是连续的还是不连续的呢?...,我们要明白一点顺序表的底层是数组而数组在物理结构上是连续的所以我们顺序表在物理结构上是连续的。 总结:顺序表在逻辑结构上一定是连续的,物理结构在顺序表上是连续的。...4.动态顺序表的代码实现 我们应该如何使用C语言实现一个动态顺序表呢,首先我们要知道一个项目里面有头文件和源文件,我们使用头文件来定义顺序表的方法和声明,用源文件来实现顺序表的方法,我们还需要创建一个源文件用来检测我们的方法是否正确运行我们称它为测试文件

    8310

    【C++】探索一维数组:从基础到深入剖析

    int arr[5] = {1, 2, 3, 4, 5}; cout << arr[5]; // 错误:越界访问 C++ 不会在编译阶段报错,但运行时可能产生不可预期的结果,甚至程序崩溃。 5....在学习STL之前,我花了大量时间自己实现这些数据结构,而STL的出现大大简化了我的开发过程。 通过学习STL,我认识到了高效代码的重要性,也学会了如何快速解决问题。...例如,在一次编程竞赛中,我需要快速实现一个排序功能,而STL中的sort函数帮助我节省了大量时间。与此同时,我还了解了STL背后的一些实现原理,例如迭代器的使用和时间复杂度的分析。...无论是编译错误还是运行时错误,几乎每次编写代码时都要面对各种各样的问题。这让我一开始感到沮丧,但随着经验的积累,我学会了如何分析错误信息并快速定位问题。 调试工具是我的好帮手。...在这个过程中,我学会了如何从问题中总结经验,如何不断优化自己的代码,以及如何以更高效的方式解决实际问题。

    8810
    领券