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

操作系统极简入门

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

84810

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

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

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

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时,其实可以自行做代码优化

39310

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

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

1K30

SparkStreaming学习笔记

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

1K20

sed 命令+正则表达式

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

3.4K20

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

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

2.7K10

字符函数和字符串函数

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

4510

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

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

39340

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

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

41850

【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也 阻塞 到条件变量中

17730

【计算机基础】操作系统

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

85830

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

因此,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); 此代码连续进行了两次

9310

JavaScript—事件

JavaScript—事件 事件机制: 在用户使用键盘、鼠标等设备进行操作时,实际上每一次的操作都是在发起一个事件。...确认完毕后,图像数据层就会将这个动作事件提交给相对应的执行程序,执行程序里的代码先寻找是哪个位置的数据哪个对象提供的,进行一系列的搜索,找到后这个对象就会执行相对应的代码,然后再将执行后的显示传送到图像数据中心进行显示...在介绍如何委托事件前,先介绍一下如何控制元素对象(标签对象),因为有些委托事件的方式需要去获得元素对象来进行事件的委托: 第一种获得方式是通过id去获得,这种方式需要用document对象去调用getElementById...父元素和子元素不完全重叠的情况,不定义addEventListener函数布尔值的代码示例: ? 运行结果: 父元素的事件不会连续执行 ?...父元素和子元素不完全重叠的情况,定义addEventListener函数布尔值为true的代码示例: ? 运行结果: 父元素的事件会连续执行 ?

1.6K20

Full GC触发条件总结以及解决策略「建议收藏」

System.gc()方法的调用 在代码中调用System.gc()方法会建议JVM进行Full GC,但是注意这只是建议,JVM执行执行是另外一回事儿,不过在大多数情况下会增加Full GC的次数,...Metaspace使用的是本地内存,不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。...老年代连续空间不足 JVM如果判断老年代没有做足够的连续空间来放置大对象,那么就会引起Full GC,例如老年代可用空间大小为200K,但不是连续的,连续内存只要100K,晋升到老年代的对象大小为120K...无非是这两点,元数据区Metaspace引发的Full GC可能是阈值引起的,详细原因还是建议参考其他文章,我就不误人子弟了。...运行程序前设置-XX:+PrintGCDetails,-XX:+PrintGCDateStamps参数打印GC的详细信息进行分析。

5.1K20

驱动库分享整理(1)——用于单片机中的小巧多功能按键支持库

,                      灵活适配使应用项目能够兼备按键的强实时性要求以及超长(主循环执行一遍的时间长达1秒以上的)程序的适应性。...同时,统筹优化了自适应变频扫键、智能节省CPU算力等措施代码; (2018年8月29日) 调整程序结构,使强实时性的紧急按键可优先得到处理,从而兼具按键的强实时性要求以及适应超长(主循环执行一遍的时间长达...1秒以上的)程序。...这两种模式本键盘扫描程序都支持。 事实上等待按键释放后才被认为是一次按键还可以派生出一种按键,那就是长按,只有按下不松开超出指定时间(如2秒以上)就被认为是一次长按事件成立。...连续执行操作又可分为是真正连续操作还是每间隔一个短时间才执行一次操作(最后这种比较典型的应用就是大家熟悉的电子表调整时间的按键,比如“+”键,按下不放超过时间后变成连续增加,而这个连续增加实际是间隔比如

1K10

JVM 学习笔记(五)

有以下缺点: 标记清除之后会产生大量连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存不得不提前触发另 一次垃圾收集动作。...(1)标记和清除两个过程都比较耗时,效率不高 (2)会产生大量连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存不得不提前触发另一次垃圾收集动作。...这里解释一下什么是吞吐量: 吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间) 比如虚拟机总共运行了100分钟,垃圾收集时间用了1分钟,吞吐量=(100-1)/100=99%。...因为特性的不同使G1成为比CMS更好的解决方案....吞吐量->运行用户代码时间/(运行用户代码时间+垃圾收集时间) 。

37620

多线程 如何停止一个线程

当然有意义,意义在于,一般创建线程后,如果是一次性的线程,执行结束就可以了,不用管它。 如果是一个一直需要保持运行需要在某一时刻才需要停止的线程,就需要关注线程是如何退出的。...退出方式 退出标志: 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 interrupt: 使用interrupt方法中断线程。...可以但不推荐: 推荐使用 stop、suspend及resume 方法。stop 相当于电脑断电关机一样,是不安全的方法。 退出标志 方式:使用一个标志控制线程是否需要继续执行。...常驻的业务线程当中一般都会写循环,如果写循环,一句话能搞定的事或者需要调用才执行的事,就没必要再开线程来处理。 stop方法已经过时,推荐使用。...开启多线程时,运行代码通常是循环结构,只要控制住循环,就可以让run方法结束,也就是线程结束。 原理:只要循环终止了,线程也就终止了。

15820
领券