非抢占式内核的优点有 中断响应快(与抢占式内核比较); 允许使用不可重入函数; 几乎不需要使用信号量保护共享数据, 运行的任务占有CPU,不必担心被别的任务抢占。...抢占式内核的优点有 使用抢占式内核,最高优先级的任务什么时候可以执行,可以得到CPU的使用权是可知的。使用抢占式内核使得任务级响应时间得以最优化。 抢占式内核的缺点有: 不能直接使用不可重入型函数。...调用不可重入函数时,要满足互斥条件,这点可以使用互斥型信号量来实现。如果调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。...任务主动放弃CPU使用权 内核抢占,并不是在任何一个地方都可以发生,以下情况不能发生 内核正进行中断处理。...如果在某些重要的点上内核停用了硬件中断, 以保证一次性完成相关的处理, 那么抢占也是不可能的.irqs_disabled会检测是否停用了中断.
新唤醒的进程不必一定由完全公平调度器处理, 如果新进程是一个实时进程, 则会立即请求调度, 因为实时进程优先极高, 实时进程总会抢占CFS进程. 2 Linux进程的睡眠 在Linux中,仅等待CPU时间的进程称为就绪进程.... */ 3 linux进程的唤醒 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程...TASK_RUNNING,所以wake_up_process将A进程状态从睡眠状态转变为运行状态的努力没有起到预期的作用. 4.3 避免无效抢占 要解决这个问题, 必须使用一种保障机制使得判断链表为空和设置进程状态为睡眠状态成为一个不可分割的步骤才行...内核中有很多地方使用了避免无效唤醒的时候, 最普遍的地方是内核线程的, 因为内核线程的主要功能是辅助内核完成一定的工作的, 大多数情况下他们处于睡眠态, 当内核发现有任务要做的时候, 才会唤醒它们. 5.2...2号进程的例子-避免无效抢占 下面让我们用linux内核中的实例来看看Linux 内核是如何避免无效睡眠的, 我还记得2号进程吧, 它的主要工作就是接手内核线程kthread的创建, 其工作流程函数是
在一个进程里,线程的调度有抢占式或者非抢占的模式。...在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。...Windows 95/NT, UNIX使用的就是这种线程调度方式。 在非抢占的调度模式下,每个线程可以需要CPU多少时间就占用CPU多少时间。...非抢占的调度策略在线程运行优先级一般时用到,而对于高优先级的线程调度则多采用抢占式的调度策略。如果你不确定系统采用的是那种调度策略,假设抢占的调度策略不可用是比较安全的。...在设计应用程序的时候,我们认为那些占用CPU时间比较多的线程在一定的间隔是会释放CPU的控制权的,这时候系统会查看那些在等待队列里面的与当前运行的线程同一优先级或者更高的优先级的线程,而让这些线程得以使用
Linux 那什么是抢占式内核呢?...实际上,支持内核抢占的内核叫做抢占式内核,不支持内核抢占的内核叫做不可抢占式内核。那么问题又来了,什么是内核抢占呢?...而对于服务器来说,它就对吞吐量要求较高,希望获得更多的cpu时间,而交互性或者低延迟都是次要的,所以被设计成不可抢占式内核。 下图给出非抢占式内核调度情况: ? 下图给出抢占式内核调度情况: ?...下面为抢占计数器的各个域的表示: ? 0-7 表示抢占计数 ,8-15表示软中断计数, 16-19表示硬中断计数,20-23表示不可屏蔽中断计数。...实际上,对于非抢占式内核来说,在内核的很多地方,特别是文件系统操作和内存管理相关的一些耗时路径中,都已经被内核开发者识别出来,并使用cond_resched来减小延迟(感兴趣的小伙伴可以通过grep和wc
c语言是面向过程的语言,是弱类型语言,c语言的源代码基本就是无数个函数的堆砌。 即很多函数就组成c语言源代码了,也即它的源代码基本就是函数构成的。...C语言里面的test()和test(void)是不一样的。什么也不写的话,C语言就比较含糊了,容易出错,结果不可知。 C++语言里面的test()和test(void)是一样的。
操作系统对于初学者来说是一个很神秘的东西,里面很多原理摸不清楚,导致还没入门就放弃了。 本文就来从底层开始,详细讲述抢占式操作系统(大多数RTOS)的抢占原理。...包含: 线程基础原理 线程之间抢占 中断抢占线程 中断抢占中断 strongerHuang 1 运行多个线程 1.单核“单线程” 严格来说,单核处理器一次只能执行一条指令,也就是说只能“单线程”。...值相加,结果保存到寄存器V0中 SW V0, -32496(GP) # 寄存器V0的值存储在RAM中(变量c所在的位置) 你会发现上面执行了4个动作,但是抢占式操作系统可以在任何时候抢占另一个线程,...假如在这过程中有其他线程抢占了,其他线程同样抢占了当前线程V0、 V1,如果不对V0、 V1进行保存,那么下次回来执行当前线程,结果就会出错。...strongerHuang 2 线程的堆栈 上面说的抢占位置,到底在哪里,每个线程保存在哪个寄存器值中?这就是线程的堆栈的内容。
, 当然因为大多数情况下, 系统中全是CFS调度的非实时进程, 因而linux内核也有一些优化的策略 一般情况下选择红黑树中的最左进程left作为最优进程完成调度, 如果选出的进程正好是cfs_rq->...中周期性调度器通过调用curr进程所属调度器类sched_class的task_tick函数完成周期性调度的工作 而entity_tick中则通过check_preempt_tick函数检查是否需要抢占当前进程...关于place_entity函数, 我们之前在讲解CFS队列操作的时候已经讲的很详细了 参见linux进程管理与调度之CFS入队出队操作 设想一下子如果休眠进程的vruntime保持不变,...而其他运行进程的 vruntime一直在推进, 那么等到休眠进程终于唤醒的时候, 它的vruntime比别人小很多, 会使它获得长时间抢占CPU的优势, 其他进程就要饿死了....,但不能补偿太多.这样由于休眠进程在唤醒时或者新进程创建完成后会获得vruntime的补偿,所以它在醒来和创建后有能力抢占CPU是大概率事件,这也是CFS调度算法的本意,即保证交互式进程的响应速度,因为交互式进程等待用户输入会频繁休眠
以数值命名的文件夹,如1,它存放的是init进程相关信息 非数字命名的文件夹,如drivers,它存放的是驱动相关信息 事实上,很多获取系统信息的命令都是通过读取/proc下相关文件内容获取的,例如uname...内存区域的详细信息列表 查看进程相关信息 以数字命名的文件夹中存储着进程的相关信息。...,包括: cmdline 用于开始进程的命令 cwd 当前进程工作目录的一个符号链接 environ 可用进程环境变量的列表 exe 正在进程中运行的程序链接 fd/ 这个目录包含了进程打开的文件描述符...mem 进程在内存中的内容 status 进程的状态信息 statm 进程的内存使用信息 limits 进程的软限制,硬限制等信息 maps 进程的内存区域映射信息 stack 当前进程的内核调用栈信息...每一项的具体内容含义,以及在实际中的应用,本文不做过多阐述,后面的文章将会继续介绍。/proc/pid下的内容对于问题的定位也十分地有帮助,本文只有简单举例,更多的使用也会在后续文章中不断应用。
当配置Linux内核的时候,我们可以选择一些参数,这些参数能影响系统的行为。...你可以用不同的优先级、调度类和抢占模型来工作。正确地选择这些参数是非常重要的。 本文将论述不同的抢占模型如何影响用户和系统的行为。...为了深入理解这三个抢占模型的区别,我们将写一个案例: 2个线程,一个高优先级RT(50),一个低优先级RT(30) 高优先级的线程要睡眠3秒 低优先级的线程用CPU来做计算 3秒后高优先级线程唤醒。...内核代码,简单的字符设备: #include #include #include #include <linux/cdev.h...这意味着任何代码可以抢占任何人。比如一个更加紧急的任务可以抢占中断服务程序ISR。
1.配置文件 /etc/vsftpd 目录下的vsftpd.conf文件 # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled...pasv_min_port=1024 pasv_max_port=1034 2.新建用户 adduser -m -d /home/data/ftp -s /bin/sh -g root ftptest3 这个用户的根目录...是/home/data/ftp 3.禁止登录 首先,设定用户的shell:/usr/bin/nologin 使用root用户:usermod -s /usr/bin/nologin username...因为ftp在登录时要检查该用户的shell设定是否正确,如果在/etc/shells中不存在的/usr/bin/nologin, 结果就会出错导致用户无法登录。
LINUX 的 XEN 和 KVM 到底区别在什么地方? LINUX 的 XEN 和 KVM 到底区别在什么地方?...kvm 是 linux 的内核的一个 module,而 xen 是一个 linux 的应用。 目前 xen 和 kvm 都支持虚拟化和半虚拟化。...kvm 的 I/O 性能比较强。 xen 较为老旧,后期发展没有 kvm 迅猛。 kvm 集成到了不少 linux 的发行版中,使用门槛较低。xen 与 linux 的整合度没那么高。...而 KVM 是基于 Linux 环境的开源虚拟化解决方案,其思想是在 Linux 内核的基础上添加虚拟机管理模块,重用 Linux 内核中已经完善的进程调度、内存管理与硬件设备交互等部分,使之成为一个可以支持运行虚拟机的...2.Xen 的缺点 Xen 是一个安装在 Linux 内核下层的一个产品。其工作环境的补丁包不能够和 Linux 内核兼容。
" 方法保护临界区 " 内的代码 , 这些代码禁止 内核 抢占 ; 然后 , 编写 " 方法保护临界区 " 代码 ; 最后 , 使用 preempt_enable(); 宏 , 表示之后的代码允许 内核...抢占 ; preempt_disable(); 与 preempt_enable(); 之间的代码 , 就是 " 方法保护临界区 " 代码 , 这样可以 阻止编译器重排指令 , 在 禁止 内核抢占...preempt_disable 与 开启内核抢占 preempt_enable 之间的 " 方法保护临界区 " 代码中 , 添加 " 编译器优化屏障 " ; 声明 " 方法保护临界区 " 代码示例 :...编译器 的 " 优化屏障 " 定义在 linux-5.6.18\include\linux\compiler-gcc.h 源码中 ; /* Optimization barrier */ /* The...-5.6.18\include\linux\compiler-gcc.h#20 三、preempt_disable 禁止内核抢占 源码 ---- 在 Linux 内核源码 linux-5.6.18\include
所以,我给大家写了一个抢占GPU的脚本,只需要花几秒钟运行一下就可以关机去玩了,卷死别人! 有人可能会说,网上抢占的脚本多的是啊,你这有啥区别?.../GrabGPU/blob/master/grab_gpu 目前这个脚本可以指定如下参数: 抢占的显存大小。...如果空闲的显存超过这个大小,就抢占成功,否则无限循环抢占。 占有的时间。如果抢占到了,你想占有的时间。如果运行你自己的程序,这个参数无效。 显卡ID。支持多卡,你想抢占哪几张卡。...你自己程序的执行脚本路径(可选)。你可以选择抢占到显卡后,执行你自己的程序,例如模型训练代码。你也可以不指定,这样默认使用我提供的程序,一直把卡占着,别人也用不了。.../grab_gpu 31 24 -1 gpu.sh 这里有四个参数,31表示每张卡要抢占31GB,24表示抢到后占有24小时(在运行自己程序脚本时无效),-1表示抢占全部8张显卡,gpu.sh是你程序的执行脚本
Linux操作系统太难?先爬过这6个陡坡 如今的软件开发行业,服务器端市场基本被 Linux 系统占领了。...移动端中的 Android 系统是基于 Linux 内核开发的,那些很火的虚拟化、消息队列、云计算、大数据等技术,都默认支持 Linux 操作系统。...而对软件工程师来说,也几乎一定会遇到 Linux 操作系统的应用场景:比如 Google 搜索,淘宝购物,QQ、微信聊天等,其实背后都是成千上万的 Linux 服务器在支撑。...可以说,打开 Linux 操作系统这扇门,你才是合格的软件工程师。如果不能熟练地操作 Linux,你基本上等于少了一半的功力,也少了一半的机会。...把外包公司做上市的过程,就是我们对 Linux 操作系统从入门到精通的过程。
经常我们会筛选一个可变数组里面的元素讲不符合条件的删除掉一般我们的做法: NSMutableArray *array = [[NSMutableArray alloc] initWithObjects...需要注意下面4个类型在32-bit和64-bit下的长度区别 size_t type1 = sizeof(int); size_t type2 = sizeof(long); size_t type3...float); size_t type4 = sizeof(double); 32-bit下:4, 4, 4, 8 64-bit下:4, 8, 4, 8 (PS: 这个结果随编译器,换其他平台可不一定)它们的长度变化可能并非我们对...64-bit长度加倍的预期,所以说,程序中出现sizeof 的代码多看两眼。
如果你有一台老旧的 PC,或者是基于单板计算机的小型系统,你可能希望运行的是一个占用资源较少且易于下载的 Linux 版本。在这里,我们来看看占用资源非常小的 Linux 发行版。...除了 Damn Small Linux 之外,这里列出的所有 Linux 发行版都是最近才更新的。每个发行版都可以在内存不足 1GB 的机器上运行,而且大多数发行版都可以在更小资源内运行。...image.png 下载:130 MB Alpine Linux 最初是针对虚拟服务器和设备的,它直接运行在内存中。它以安全为重点,面向最终用户的功能较少,但如果你需要的话,也可以支持桌面功能。...antiX Linux image.png 下载:约 1GB antiX 发行版声称完全不含 systemd —— 这是现代 Linux 发行版的基本构件。...ArchBang 下载:700MB Bodhi 是一款基于 Ubuntu 的轻量级发行版,这款发行版采用的是 Moksha(一种基于 Enlightenment 的桌面)。
页面中产生格式化的效果,我一般比较喜欢用span,因为其本身就是inline的,但是,在进行精细控制时就不行了,比如我想要这个效果,每行由三个部分构成:时间,柱状图,数值,分布用span表示,用br换行...但出来的效果,两行之间总有间隙。试了很多办法都没有搞定,最后,把span换成div,一下就成了。 效果如下: ?
前言 在实际开发中,有时候会收到一些服务的监控报警,比如CPU飙高,内存飙高等,这个时候,我们会登录到服务器上进行排查。本篇博客将涵盖这方面的知识:Linux性能工具。...进制转换 这里利用Python非常方便的把十进制的线程ID转化成了16进制,为什么要这么做呢? 因为在接下来的线程DUMP文件中使用的就是16进制的NID。 ? 线程DUMP文件 ?...至此,就可以到去查看代码去分析为什么锁迟迟不释放的原因了。 性能监测工具top详解 上文的案例中,就使用到了top,而在实际中,top的信息量是很大的,这里详细分析下。 ?...分别代表的是1MIN,5MIN,15MIN机器的负载情况,如何确定负载的大小呢?需要和CPU的核数相结合来看,比如该机器是4核CPU,那么如果load值超过了4,就意味着负载很大了!...第三行: 主要是CPU的一些信息。 US/SY,说的就是用户进程和系统进程使用CPU的占比。 NI,即NICE,表示被调整过线程优先级的进程占比,这个比例正常不应该很大。
前言 际开发中,有时候会收到一些服务的监控报警,比如CPU飙高,内存飙高等,这个时候,我们会登录到服务器上进行排查。本篇博客将涵盖这方面的知识:Linux性能工具。...这里利用Python非常方便的把十进制的线程ID转化成了16进制,为什么要这么做呢? 因为在接下来的线程DUMP文件中使用的就是16进制的NID。 ? ?...至此,就可以到去查看代码去分析为什么锁迟迟不释放的原因了。 性能监测工具top详解 上文的案例中,就使用到了top,而在实际中,top的信息量是很大的,这里详细分析下。 ?...第一行: 涉及到2个时间,一个是系统时间,一个是机器运行的时间。【我们应该重点关注的是机器运行的时间,Why? 有时候,重启机器能带来很多问题,你懂的!】 多少用户登录了系统?...分别代表的是1MIN,5MIN,15MIN机器的负载情况,如何确定负载的大小呢?需要和CPU的核数相结合来看,比如该机器是4核CPU,那么如果load值超过了4,就意味着负载很大了!
写程序应该注意的地方: 1. 对于文本编辑框,一定要判断是否含有非法字符。对于数字型一定要判断是否含有非数字。对于字符型,一定要判断是否在允许的字符内。 2....输入的路径长度是否超过了最大字符长度。 4. 对于要写进数据库的值,一定要判断是否超过了字段定义的长度。 5. 在往网络的某一个文件夹写数据时,要判断是否可写。 6....在做长时间的操作时,一定要使鼠标变成漏斗型,让别人知道你的程序还在运行。最好用一个进度条来显示进度。给用户继续等下去的信心。 9....参数在命名时,尽量取的要有意义,不要到处是a,b什么的。。一个函数不要写的太长,要多写注释。你走了,为后面来的人做点好事。 希望大家把自己觉得应该注意的地方也写下来,供新手参考
领取专属 10元无门槛券
手把手带您无忧上云