首页
学习
活动
专区
圈层
工具
发布

linux每日命令(34):ps命令和pstree命令

(参见《linux内核异步中断浅析》)在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用...只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING...只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING...进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。...而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径:1、响应信号而进入TASK_STOPED状态、或TASK_DEAD状态;2、执行系统调用主动进入TASK_INTERRUPTIBLE

2.6K30

VBA掌握循环结构,包你效率提高500倍

从而变更「变量x」的值,那么能不能让「变量x」完全自动变化呢?...「变量X」的值从1变为10,每次仅增加1,即:x可以取1 2 3 4 ...10。...我们可以看到此时程序自动返回「循环开始」的地方,由于此时「变量 x = 2」仍然符合「X 从 1 变为 10 每次增加1」这个区间,因此程序接着运行,一直等到「变量 x = 11」的时候,程序会跳出循环...(5)我们看下最终的程序的执行结果 image.png 看到这里我们大家也许就明白了,所谓的「For循环结构」就是: 提前设置一定的条件或规则,然后程序自动按照设定的条件或规则自动运行,等到不符合设定的条件或规则时...提前设置一定的条件或规则,然后程序自动按照设定的条件或规则自动运行,等到不符合设定的条件或规则时,程序跳出循环结构,执行下一个句子。

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

    韦东山freeRTOS系列教程之【第八章】事件组(event group)

    : 的每一位表示一个事件 每一位事件的含义由程序员决定,比如:Bit0表示用来串口是否就绪,Bit1表示按键是否被按下 这些位,值为1表示事件发生了,值为0表示事件没发生 一个或多个任务、ISR都可以去写这些位...可以设置为0:判断后即刻返回;可设置为portMAX_DELAY:一定等到成功才返回;可以设置为期望的Tick Count,一般用pdMS_TO_TICKS()把ms转换为Tick Count 返回值...可以设置为0:判断后即刻返回;可设置为portMAX_DELAY:一定等到成功才返回;可以设置为期望的Tick Count,一般用pdMS_TO_TICKS()把ms转换为Tick Count 返回值...源码中包含头文件 */ #include "event_groups.h" 假设大厨要等手下做完这些事才可以炒菜:洗菜、生火。 本程序创建3个任务: 任务1:洗菜 任务2:生火 任务3:炒菜。...D:"生火任务"等待的事件满足了,从B处继续执行,开始生火、发出"生火"事件 E:"炒菜任务"等待的事件满足了,从A出继续执行,开始炒菜、发出"炒菜"事件 F:"洗菜任务"等待的事件满足了,退出F、继续执行

    1.3K40

    Linux进程状态

    而尽管进程状态有好几种,但是进程状态的变迁却只有两个方向——从TASK_RUNNING状态变为非TASK_RUNNING状态、或者从非TASK_RUNNING状态变为TASK_RUNNING状态。...并不会从TASK_INTERRUPTIBLE状态直接退出。 进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。...而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径: 1、响应信号而进入TASK_STOPED状态、或TASK_DEAD状态; 2、执行系统调用主动进入TASK_INTERRUPTIBLE...(参见《linux内核异步中断浅析》) 在进程对某些硬件进行操作时(比如进程调用read对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用...只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING

    6.1K50

    VBA掌握循环结构,包你效率提高500倍

    那么能不能让「变量x」完全自动变化呢?...我们来模拟一下上述「For循环结构」的程序运行过程: (1)程序读取「循环开始」语句「For x = 1 To 10 Step 1」 由于我们使用了「For循环开始」,并且严格规定了「变量X」的值从1变为...」的地方,由于此时「变量 x = 2」仍然符合「X 从 1 变为 10 每次增加1」这个区间,因此程序接着运行,一直等到「变量 x = 11」的时候,程序会跳出循环,执行下一个语句。...(5)我们看下最终的程序的执行结果 看到这里我们大家也许就明白了,所谓的「For循环结构」就是: 提前设置一定的条件或规则,然后程序自动按照设定的条件或规则自动运行,等到不符合设定的条件或规则时,程序跳出循环结构...,等到不符合设定的条件或规则时,程序跳出循环结构,执行下一个句子。

    78330

    如果把线程当作一个人来对待,所有问题都瞬间明白了

    但是恢复是无法自主进行的,只能由操作系统来恢复线程的执行。...; } println("继续执行或选择退出。。。")...但老师必须等到所有的学生都走后,才可以收卷子,然后装订打包。 如果把学生和老师都看作线程,就是1个线程和20个线程的配合问题,即等20个线程都结束了,这1个线程才开始。...但这样的话就会引入一个新的问题,就是要能够准备的判断出对方有没有在睡大觉,为此就必须定义一个状态变量,在自己即将开始睡大觉时,自己设置下这个变量。 对方通过检测这个变量,来决定是否进行叫醒操作。...可能有些人会觉得可以通过判断队列的“空”或“满”(即队列中的元素数目)来决定是否进行叫醒操作。 在高并发下,可能刚刚判断队列不为空,瞬间之后队列可能已经变为空的了,这样会导致逻辑出错。

    42040

    一文搞懂Linux信号【下】

    我们刚开始学习信号时,知道操作系统认识对应的信号是通过程序员的编码完成的。现在我们知道每一个信号的相关信息都会被设置进3个结果中,等到信号来临时,就可以做出处理动作。...用户为了访问这些资源,必须直接或者间接的使用操作系统提供的系统调用接口。但是普通用户无法直接调用系统调用接口,必须让自己的身份从用户态变为内核态。实际执行系统调用的进程,但是身份其实是内核。...所以,我们知道从用户态和内核态之间的跳转是非常浪费资源的。当代码执行到需要访问操作系统资源的时候,尽管浪费资源和时间,但是进程还要从用户态变为内核态,然后执行相关的系统调用接口。...我把整个过程分为4个小过程,逐一说明 ①代码在执行过程中遇到了系统调用或者时间片已到要进行程序替换。进程从用户态变为内核态来执行该过程。 ②执行完毕。...初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。 这四个函数都是成功返回0,出错返回-1。

    24210

    归纳一下:C#线程同步的几种方法

    我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态;或者你的程序需要访问一些外部资源如数据库或网络文件等。...(【转自www.bitsCN.com 】)因此,当多线程同时访问该变量时,都将直接操作主存,从本质上做到了变量共享。   ...最好避免使用public类型或不受程序控制的对象实例,因为这样很可能导致死锁。...CompareExchange 方法组合了两个操作:比较两个值以及根据比较的结果将第三个值存储在其中一个变量中。比较和交换操作也是按原子操作执行的。...而ManualResetEvent要等到它的Reset方法被调用,状态才变为非终止,在这之前,ManualResetEvent可以激活任意多个线程。

    2.3K31

    传说中的并发编程ABA问题

    假设两个线程T1和T2访问同一个变量V,当T1访问变量V时,读取到V的值为A;此时线程T1被抢占了,T2开始执行,T2先将变量V的值从A变成了B,然后又将变量V从B变回了A;此时T1又抢占了主动权,继续执行...这个过程中,变量V从A变为B,再由B变为A就被形象地称为ABA问题了。 上面的描述看上去并不会导致什么问题。...毕竟在大多数程序代码中,我们只需要知道值是不是一样的,并不关心它在之前的过程中有没有发生变化;所以,当我需要知道之前的过程中“有没有发生变化”的时候,ABA就是问题了。...程序世界的ABA问题 在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS...ABA-2.png 此时轮到线程T1执行CAS操作,检测发现栈顶仍为A,所以CAS成功,栈顶变为B,但实际上B.next为null,所以此时的情况变为: ?

    1.8K71

    守护进程「建议收藏」

    默认情况下(没有重定向), 每个进程的标准输入, 标准输出和标准错误输出都指向控制终端, 进程从标准输入读也就是读用户的键盘输入, 进程往标准输出或标准错误输出写也就是输出到显示器上...., 比如从键盘读入字符和把字符输出到显示器, 线路规程像一个过滤器, 对于某些特殊字符并不是让它直接通过, 而是做特殊处理, 比如在键盘上按下Ctrl-z, 对应的字符并不会被用户程序的read读到,...成功:返回调用进程的会话ID;失败:-1,设置errno 调用了setsid函数的进程,既是新的会长,也是新的组长 守护进程 Daemon(精灵)进程, 是Linux中的后台服务进程, 通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件...; 必须 子进程创建新会话, setsid函数, 使子进程完全独立出来, 脱离控制; 必须 改变当前目录为根目录, chdir()函数, 防止占用可卸载的文件系统, 也可以换成其它路径, 为了增强程序的健壮性...(0), close(1), close(2); 非必须 执行核心工作 守护进程退出处理程序模型; 示例程序 函数使用 #include #include #include

    70840

    C语言——循环结构

    循环语句是程序中的一个基本语句,在编程中,如果我们需要对某些操作对象进行相同的操作,那么,使用循环语句,就能让计算机反复执行,从而减少我们编程时写的语句。...当为真且执行完语句后,计算表达式3,然后再重复过程② 整个循环过程中,表达式1只被执行一次 流程图: 关于表达式省略的运用: 1,表达式1 一般为赋值表达式,给控制变量赋初始值。...2的值,则也可能造成死循环,如: for(i = 0;i<100) {        循环语句;(若循环语句不能使表达式2变为假,则变成死循环) }  4,当表达式1,2,3都省略时,此时与无限的...,内层循环要执行完 说明: 1,三种循环可以互相嵌套,层数不限; 2,外层循环可包含两个以上的内存循环,但是这两个内存循环不能相互交叉; 3,①嵌套循环的跳转:只能跳出本层循环;②禁止从外层跳入内层;禁止跳入同层的另一循环和向上跳转...} 因为当程序遇到  goto next,程序就会跳转到下面的next,然后执行下面的  return0;的语句,所以这串代码打印出的结果应该是:hehe   注意:如果goto语句使用不当,比如标号位置不得当

    3.1K10

    Python自学01-数据类型

    在程序里,整数的表示方式与数学中的写法一致,例如:1、100、-8080、0等。由于计算机采用二进制进行运算,因此在某些情况下,使用十六进制来表示整数会更为便捷。...的格式来表示多行内容,可自行进行测试:>>> print('''line1... line2... line3''')line1line2line3上述代码是在交互式命令行中输入的示例。...例如下面的代码:x = 10x = x + 2从数学角度来看,x = x + 2显然是不成立的。但在程序中,赋值语句会先计算右侧的表达式x + 2,得到结果12,然后将其赋值给变量x。...当我们编写代码:a = 'ABC'时,Python解释器会执行以下两个操作:在内存中创建一个'ABC'的字符串;在内存中创建一个名为a的变量,并将其指向'ABC'。...小结Python支持多种数据类型,在计算机内部,可以将任何数据都视为一个“对象”,而变量则是在程序中用于指向这些数据对象的标识。对变量进行赋值操作,实际上就是将数据与变量进行关联。

    23010

    《代码的未来》读书笔记:内存管理与GC那点事儿

    引用计数的增减,一般发生在变量赋值、对象内容更新、函数结束(局部变量不再被引用)等时间点,当一个对象的引用计数变为0时,则说明它将来不会再被引用,因此可以释放响应的内存空间。   ...对于不同的实现方式,可能还会划分更多的代,   在.NET中,CLR就将内存中的对象分为了三代,每执行N次0代的回收,才会执行一次1代的回收,而每执行N次1代的回收,才会执行一次2代的回收。...(1)首先,从根开始一次常规扫描,找到“存活”对象。这个步骤可以采用标记清除或复制收集,不过大多数分代回收的实现都采用了复制收集算法。...因此,为了维持程序的实时性,不等到GC全部完成,而是将GC操作细分成多个部分逐一执行,这种方式就被称为“增量回收”(Incremental GC)。   ...不过,要让GC操作完全并行并且一点都不影响原有程序的运行是做不到的。因此,在GC操作的某些特定阶段,还是需要暂停原有程序的运行。

    45310

    Java多线程并发控制工具循环屏障CyclicBarrier,实现原理及案例

    当线程一调用await方法后倒计数器的值变为2,接着线程二继续调用await方法使倒计数器的值变为1,然后线程三也调用await方法,此时倒计数器的值为0,三个线程都通过屏障继续往下执行。...await方法能让倒计数器的值减一,并且让线程进入等待状态。触发点Runnable任务指的是当指定数量的线程到达屏障后会触发执行的任务。...程序的最终输出在下面,但输出看不出过程,我们看看执行的过程是怎样的。线程一启动后输出thread1 is waiting,然后调用await方法进入等待状态,倒计数器的值减一后为2。...循环屏障和闭锁都是等倒计数器的值为0时让所有等待的线程通过并往下执行,只是循环屏障规定倒计数器的减一操作只能由不同的线程来操作。...接着主线程启动线程二,线程二睡眠两秒后本想着打算调用两次循环屏障的await方法让倒计数器的值变为0,但实际上失败了,因为第一次执行barrier.await()时该线程就已经进入等待了,所以无法往下执行

    87130

    深入理解按位操作符:位运算的魅力

    什么是按位操作符?按位操作符按位操作符是一组用于执行位级别操作的特殊操作符。它们作用在整数类型的数据的二进制表示中的每个位上,允许程序员以位为单位执行各种操作。...这些操作符的作用是将一个变量的当前值与另一个值进行相应的位操作,然后将结果赋值给该变量。a |= b:将变量 a 的值与变量 b 的值进行按位或操作,并将结果赋值给 a。...a &= b:将变量 a 的值与变量 b 的值进行按位与操作,并将结果赋值给 a。a ^= b:将变量 a 的值与变量 b 的值进行按位异或操作,并将结果赋值给 a。...,只有当两个位都为1时,结果位才为1,否则为0| 按位或将两个二进制数的对应位相或,只有当两个位都为0时,结果位才为0,否则为1 ^ 按位异或将两个二进制数的对应位进行异或运算...,如果两个位不同,则结果位为1,否则为0 ~ 按位取反/非将翻转二进制数每个位的值,将0变为1,将1变为0 示例按位与5 & 3 = 1 //5 二进制表示为

    79631

    深入理解按位操作符:位运算的魅力

    什么是按位操作符? 按位操作符 按位操作符是一组用于执行位级别操作的特殊操作符。它们作用在整数类型的数据的二进制表示中的每个位上,允许程序员以位为单位执行各种操作。...这些操作符的作用是将一个变量的当前值与另一个值进行相应的位操作,然后将结果赋值给该变量。 a |= b:将变量 a 的值与变量 b 的值进行按位或操作,并将结果赋值给 a。...注意:~操作符是一个一元操作符,而 = 是赋值操作符,所以不能和等号联合使用 运算符及运算规则 **运算符 含义 运算规则** & 按位与 将两个二进制数的对应位相与,只有当两个位都为1时,结果位才为1...,否则为0 | 按位或 将两个二进制数的对应位相或,只有当两个位都为0时,结果位才为0,否则为1 ^ 按位异或 将两个二进制数的对应位进行异或运算,如果两个位不同,则结果位为1,否则为0 ~ 按位取反/...非 将翻转二进制数每个位的值,将0变为1,将1变为0 示例 按位与 5 & 3 = 1 //5 二进制表示为 00000101 //3 二进制表示为 00000011 //1 二进制表示为 00000001

    38321

    手撸MQ消息队列——循环数组

    我们看一下具体的过程,初始状态是一个空的队列,队头下标和队尾下标都是指向数组中的第0个元素,现在我们插入第一个元素“a”,如图:数组的第0个元素赋值“a”,tail的下标+1,由指向第0个元素变为指向第...另外一个方法,当front或tail指向数组最后一个元素时,再进行+1操作,我们将下标指向队列的开头,也就是第0个元素,形成一个循环,这就叫做循环数组。那么这里又引申出一个问题,我们的下标怎么计算呢?...我们再看看其他的情况符不符合,假设tail当前值是1,套入公式计算得出2,也相当于是+1操作,没有问题的。只有当tail+1=5时,才会变为0,这是符合我们的条件的。...队列的空与满队列的空与满对入队和出队的操作是有影响的,当队列是满的状态时,我们不能进行入队操作,要等到队列中有空余位置才可以入队。...,还有一个非常重要的变量flag,它表示导致front==tail的原因,0代表出队,1代表入队。

    18410

    Linux多线程编程(不限Linux)

    2,打印“this is thread2”,并将g_Flag设置为2   4) 线程序1需要在线程2退出后才能退出   5) 主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出我们带着这题开始这篇文章...5、线程之间的同步   第5点——主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出。就需要用到线程同步技术!线程同步需要条件变量。   ...如果另一个线程更改了条件,该线程可能会向相关的条件变量发出信号,从而使一个或多个等待的线程执行以下操作:   唤醒   再次获取互斥锁   重新评估条件   在以下情况下,条件变量可用于在进程之间同步线程...即可用到第5点,主线程main函数阻塞于等待g_Flag从1变为2,或者从2变为1。...2,打印“this is thread2”,并将g_Flag设置为2   4)线程序1需要在线程2退出后才能退出   5)主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出   */   #

    4.9K20

    【mongo】MongoDB副本集

    如果某个操作失败,则备份节点停止从当前数据源复制数据。...如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份...,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。...其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的...:OTHER> 说明: 设置1主1从1仲裁 > conf= { "_id" : "replicaset", "members" : [ { "_id" : 0, "host

    1.3K20
    领券