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

进程睡眠原理(基于linux2.6.12.1)

但这是被动,不是进程控制,也就是说,进程访问一个资源时候,如果不能被满足,进程会被系统挂起,等到条件满足时候,系统会唤起进程。 今天介绍是一种进程主动睡眠能力。...即进程自己让自己挂起,等到一定时间后,被系统唤醒(时间到或者收到信号)。这个能力由sleep函数提供。...即sleep函数是由操作系统[nanosleep](http://www.man7.org/linux/man-pages/man2/nanosleep.2.html)函数实现。...0 : timeout; } 接着往系统新增一个定时器,然后发送进程调度,该进程随即进入挂起状态。等到一定时间后,进程会唤醒。...__data是在 timer.data = (unsigned long) current; 中设置。这就是进程主动睡眠(sleep)大致原理。

1.3K10

linux0.11进程睡眠唤醒原理分析

进程睡眠是通过调用sleep_on函数,该函数修改了进程状态并且通过schedule函数切换到其他进程执行,从而实现进程挂起,TASK_UNINTERRUPTIBLE状态进程只能被wake_up...TASK_INTERRUPTIBLE状态进程可以被wake_up和信号唤醒。唤醒时候也是通过修改进程状态为可运行,然后等待下一次进程调度,被唤醒进程不一定马上得到执行。...,即tmp指向第一个睡眠节点 头指针指向当前进程,这个版本实现没有采用真正链表形式, 他通过每个进程在栈中临时变量形成一个链表,每个睡眠进程, 在栈里有一个变量指向后面一个睡眠节点...,然后把链表头指针指向当前进程, 然后切换到其他进程执行,当被wake_up唤醒时候,wake_up会唤醒链表第一个 睡眠节点,因为第一个节点里保存了后面一个节点地址...,可以通过wake_up和接收信号唤醒,不可中断时候, 能保证唤醒时候,是从前往后逐个唤醒,但是可中断睡眠无法保证这一点, 因为进程可能被信号唤醒了,所以需要判断全局指针是否指向了自己

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

    深入理解Linux内核之进程睡眠

    注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠三种状态 睡眠内核原理 用户态睡眠 内核态睡眠 总结 2....睡眠三种状态 任务睡眠有三种状态: 浅度睡眠 中度睡眠 深度睡眠 2.1 浅度睡眠 进程描述符state使用TASK_INTERRUPTIBLE表示这种状态。...当然,内核态中,睡眠有两种场景:一种是睡眠特定时间延迟操作(唤醒条件为超时),一种是等待特定条件满足(如IO读写完成,可睡眠锁被释放等)。...6.总结 进程睡眠按照应用场景可以分为:延迟睡眠和等待某些特定条件而睡眠,实际上都可以归于等待某些特定条件而睡眠,因为延迟特定时间也可以作为特定条件。...进程睡眠按照进程所处特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。

    2.8K40

    深入理解Linux内核之进程睡眠(下)

    当任务睡眠完成,定时器超时,会调用之前在__hrtimer_init_sleeper设置超时回调函数hrtimer_wakeup将睡眠任务唤醒(关于进程唤醒在这里就不在赘述,在后面的进程唤醒专题文章在进行详细解读...当然,内核态中,睡眠有两种场景:一种是睡眠特定时间延迟操作(唤醒条件为超时),一种是等待特定条件满足(如IO读写完成,可睡眠锁被释放等)。...6.总结 进程睡眠按照应用场景可以分为:延迟睡眠和等待某些特定条件而睡眠,实际上都可以归于等待某些特定条件而睡眠,因为延迟特定时间也可以作为特定条件。...进程睡眠按照进程所处特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。...对于进程睡眠,内核主要需要做三大步操作:1.设置任务状态为睡眠状态 2.记录睡眠任务 3.发起主动调度。

    2.1K20

    深入理解Linux内核之进程睡眠(上)

    注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠三种状态 睡眠内核原理 用户态睡眠 内核态睡眠 总结 2....睡眠三种状态 任务睡眠有三种状态: 浅度睡眠 中度睡眠 深度睡眠 2.1 浅度睡眠 进程描述符state使用TASK_INTERRUPTIBLE表示这种状态。...2.2 中度睡眠 进程描述符state使用TASK_KILLABLE表示这种状态。 可以被致命信号所打断。...进程描述符state使用TASK_UNINTERRUPTIBLE表示这种状态。...cfs运行队列最小虚拟运行时间 deactivate_task会设置任务on_rq 为0来 标识是睡眠 ,然后 调用到调度类dequeue_task方法,在cfs中设置se->on_rq

    1.5K20

    关于 Linux 进程睡眠和唤醒 ,来看这篇就够了~

    1 Linux 进程睡眠和唤醒 在 Linux 中,仅等待 CPU 时间进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程状 态标志位为 TASK_RUNNING。...一旦一个运行中进程时间片用完, Linux 内核调度器会剥夺这个进程对 CPU 控制权,并且从运行队列中选择一个合适进程投入运行。 当然,一个进程也可以主动释放 CPU 控制权。...在现代 Linux 操作系统中,进程一般都是用调用 schedule() 方法进入睡眠状态,下面的代码演示了如何让正在运行进程进入睡眠状态。...在这个时间片内,B 进程执行完了它所有的指令,因此它试图唤醒 A 进程,而此时 A 进程还没有进入睡眠,所以唤醒操作无效。...4 Linux 内核例子 在 Linux 操作系统中,内核稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠时候应该使用类似如下操作: /*

    2.3K90

    关于 Linux 进程睡眠和唤醒 ,来看这篇就够了~

    1 Linux 进程睡眠和唤醒 在Linux 中,仅等待 CPU 时间进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程状 态标志位为 TASK_RUNNING。...一旦一个运行中进程时间片用完, Linux 内核调度器会剥夺这个进程对 CPU 控制权,并且从运行队列中选择一个合适进程投入运行。 当然,一个进程也可以主动释放 CPU 控制权。...在现代 Linux 操作系统中,进程一般都是用调用 schedule() 方法进入睡眠状态,下面的代码演示了如何让正在运行进程进入睡眠状态。...在这个时间片内,B 进程执行完了它所有的指令,因此它试图唤醒 A 进程,而此时 A 进程还没有进入睡眠,所以唤醒操作无效。...4 Linux 内核例子 在 Linux 操作系统中,内核稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠时候应该使用类似如下操作: /*

    7.5K10

    进程启动时间监控(linux篇)

    摘要:这次我们来谈谈如何采集一个进程启动时间 以下内容使用go语言实现 linux 进程启动时间采集 方法一 直接读取/proc/{pid} 文件夹时间戳方式(不准确但效率高),以下是方法一代码,...= nil { return nil } proc.mtime = stat.ModTime().Unix() 方法二 使用(现在时间-从系统启动到现在时间) + 进程启动时距离系统启动时时间间隔得到...jiffies单位,用来记录自系统启动以来产生节拍总数。...启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量值。一秒内时钟中断次数等于Hz,所以jiffies一秒内增加值也就是Hz。...输出结果 [输出结果] 引用 go 获得进程启动时间两种方法

    4.1K10

    linux获取进程执行时间方法示例

    linux获取进程执行时间有两种方法可以获取,第一种是用time命令,time 进程。...第二种是通过在程序中进行记录,首先利用sysconf函数获取时钟滴答数,再用times获取tms结构,详细看下面的示例代码 1、前言 测试一个程序执行时间时间包括用户CPU时间、系统CPU时间、时钟时间...之前获取之前时间都是在程序main函数用time函数实现,这个只能粗略计算程序执行时间,不能准确获取其他时间。在看《APUE》时,书中有关程序时间测试程序,非常正规,提供这三个时间。...2、获取方法 有两种方法可以获取,第一种是用time命令,time 进程。第二种是通过在程序中进行记录,首先利用sysconf函数获取时钟滴答数,再用times获取tms结构。...time of children */   }; 复制代码 代码如下: #include  clock_t times(struct tms *buf); 注意:此处计算时间是时钟滴答数

    2.9K00

    Linux下查看进程启动和运行时间

    有时需要知道某进程运行时间,比如我想知道我sra文件转换成fq格式转化速度。以便我做好时间安排。...:进程名 lstart:开始时间 etime:运行时间 运行结果如下: 91413 pts/0 root fastq-dump Tue May 21 10:01:44...I 5月09 0:00 [rcu_bh] USER:用户名 %CPU:进程占用CPU百分比 %MEM:占用内存百分比 VSZ:该进程使用虚拟內存量(KB) RSS:该进程占用固定內存量...(KB)(驻留中页数量) STAT:进程状态 START:该进程被触发启动时间 TIME:该进程实际使用CPU运行时间 top命令 top也可以看进程信息,与ps区别如下 ps看命令执行那刻进程信息...,top是持续监视,ctrl c退出 ps只是查看进程,而top还可以监视系统性能,如平均负载,cpu和内存消耗 总体来说, ps主要是查看进程,尤其你关心进程 top主要看cpu,内存使用情况

    15.3K10

    Linux进程——Linux进程概念(PCB理解)

    前言:在了解完冯诺依曼体系结构和操作系统之后,我们进入了Linux下一篇章Linux进程,但在学习Linux进程之前,一定要阅读理解上一篇内容,理解“先描述,再组织”才能更好理解进程含义。...Linux进程学习基础 本篇主要内容: 进程概念 通过系统调用获取进程标示符 1....进程概念 在学习进程之前,大家对进程肯定初步了解,那么今天我们来深入了解一下 基本概念: 课本概念:程序一个执行实例,正在执行程序等 内核观点:担当分配系统资源(CPU时间,内存)实体。...课本上称之为PCB(process control block),Linux操作系统下PCB是: task_struct 1.2 CPU对于进程列表处理 在CPU对进程列表进行处理时,PCB中数据有时不会被...2.3 系统调用函数:getpid 每次查看进程使用如果都要使用ps查看这样的话很浪费时间且繁琐,因此我们可以使用即将学习到第一个系统调用函数: 函数:getpid 我们先来简单了解一下 getpid

    16410

    Linux进程——Linux下常见进程状态

    本篇主要内容: 操作系统中进程状态 Linux进程状态 在开始之前,我们先来简单了解以下进程状态 进程本质就是PCB中一个变量!!! 所谓状态变化,本质就是修改整形变量!!!...S睡眠状态(sleeping): 意味着进程在等待事件完成(这里睡眠有时候也叫做可中断睡眠(interruptible sleep))。...因为循环打印时,IO输出是很慢打印字符会和外设屏幕交互,因此大部分时间进程都处于阻塞状态,但也有极少时间在打印,所以查看进程状态时,我们偶尔可以看见R状态 如果我们将printf删除,单留while,...,有一个进程,需要将自己代码和数据写入磁盘,因为内容数据不小,在磁盘拷贝时,需要一段时间,此时进程变为S状态。...总结 在了解Linux进程分类时,我们通常是先了解操作系统进程,因为二者有一定联系,了解操作系统能更好理解进程在操作系统中运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!

    12810

    Linux进程调度_linux进程查看和调度

    这种类型进程经常处于可以运行状态,但是都只是运行一点点时间,绝大多数时间都在处于阻塞(睡眠状态。...Linux 系统为了提升响应速度,倾向于优先调度 I/O 消耗型。...一、普通进程Linux 中普通进程依赖称之为 nice 值 东东来进行进程优先级描述。nice 值范围是 [-20, 19]。...—— 小结 实时进程优先级:value 越高,优先级越大 普通进程优先级:nice值越高,普通进程优先级越小 任何实时进程优先级 > 普通进程 Linux 调度算法 ---- Linux 中有一个总调度结构...Linux 调度时机 ---- 一、进程切换 从进程角度看,CPU是共享资源,由所有的进程按特定策略轮番使用。

    20.6K10

    急性睡眠剥夺和慢性睡眠限制后个体调制睡眠稳态压力增长

    研究者收集了14名健康被试,其中有9名有效数据,参加实验被试分别进行了40小时急性睡眠剥夺和7天每晚床上时间为5个小时慢性睡眠限制,两种条件时间间隔为2个星期,在这个期间内进行一星期每晚8小时常规睡眠...急性睡眠剥夺在实验室进行,慢性睡眠限制则是通过减少被试在自己床上睡眠时间2小时。...EEG在0.5-4.5频段强度代表了由于清醒时间过长睡眠调控稳态压力增长。...值得一提是,实验结果发现SWA时间窗对于研究慢性睡眠限制影响十分重要,例如当在一个固定时间窗内计算SWA 时,如果第一个非快速眼动期间时长和第一个非快速眼动期间N3时长改变了,会导致这两种条件...因此在慢性睡眠限制后,处理时间动态变化尤为重要。如在快速眼动阶段睡眠压力会与非快速眼动阶段睡眠压力有交互作用,可能导致第一个非快速眼动阶段更短。

    1.8K70

    Linux进程——Linux进程进程优先级

    如果对前面Linux进程不太熟悉可以先阅读: Linux进程 本篇主要内容: 僵尸进程和孤儿进程 Linux进程优先级 1. 僵尸进程 僵尸进程就是处于僵尸状态下进程!...还可以把进程运行到指定CPU上,这样一来,把不重要进程安排到某个CPU,可以大大改善系统整体性能 优先级本质就是:得到某种资源先后顺序 优先级和权限: 优先级是能够得到申请资源,但是需要等待一段时间...NI :NICE值,表示优先级修改数据 NICE其取值范围是-20至19,一共40个级别 Linux进程优先级数值范围:60~99 Linux中默认进程优先级都是:80 Linux是支持动态优先级调整...容易导致优先级较低进程,长时间得不到CPU资源 --进程饥饿 因此:每一个进程不是占有CPU就一直运行,每隔一段时间,自动被从CPU上剥离下来 Linux 内核支持进程之间进行cpu资源抢占,基于时间轮转式抢占式内核...总结 本篇文章前部分紧贴上篇Linux进程,分析完了Linux下常见进程状态,然后初步了解了Linux进程优先级,而进程优先级与前面内容相差较大,希望大家能够多花点时间理解!

    9310

    LinuxLinux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    1.进程创建 1.1 fork函数 在linux中fork函数时非常重要函数,它从已存在进程中创建一个新进程。.../a.out #等20秒退出 child exit code:10 [root@localhost linux]# ....utility.h [root@localhost epoll]# ps PID TTY TIME CMD 3451 pts/0 00:00:00 bash 3514 pts/0 00:00:00 ps 用下图时间轴来表示事件发生次序...其中时间从左向右。shell由标识为sh方块代表,它随着时间流逝从左向右移动。shell从用户读入字符串"ls"。...Linux鼓励将这种应用于程序之内模式扩展到程序之间。如下图 一个C程序可以fork/exec另一个程序,并传给它一些参数。这个被调用程序执行一定操作,然后通过exit(n)来返回值。

    13910

    Linux进程控制——Linux进程等待

    前言:接着前面进程终止,话不多说我们进入Linux进程等待学习,如果你还不了解进程终止建议先了解: Linux进程终止 本篇主要内容: 什么是进程等待 为什么要进行进程等待 如何进程等待...进程等待概念: 我们通常说进程等待其实是通过wait/waitpid方式,让父进程(一般)对子进程进行资源回收等待过程,父进程必须等待这个子进程结束后,处理它代码和数据! 2....进程等待必要性 在了解完进程等待概念后,新问题出现了,我们为什么要进行进程等待,进程等待必要性是什么?...父进程创建子进程目的是为了让子进程协助自己完成任务,而父进程需要知道子进程将任务完成得如何。这就需要通过进程等待方式,获取子进程退出信息。 3....总结拓展 拓展一:父进程如何得知子进程退出信息 父进程调用wait()/waitpid()来获取子进程退出信息,调用接口就传入了一个status参数,而父进程中存在着一个statusp指针

    9610

    Linux进程管理

    02 — ps ps 命令用于显示当前系统中由该用户运行进程列表 选项 说明 -ef 查看所有进程及其 PID(进程号)、系统时间、命令详细目录、执行者等。...-aux 除可显示 -ef 所有内容外,还可显示 CPU 及内存占用率、进程状态。 -w 以加宽方式显示,这样可以显示较多信息。...00:01:57 /usr/sbin/mysqld 04 — kill 而 kill 命令用于输出特定信号给指定进程号(PID)进程并根据该信号完成指定行为,其中可能信号有进程挂起、进程等待、...一次性计划任务只执行一次,一般用于满足临时工作需求。我们可以用at命令实现这种功能,只需要写成“at 时间形式就可以。...07 — crontab 我们希望 Linux 系统能够周期性地、有规律地执行某些具体任务,那么Linux 系统中默认启用 crond 服务简直再适合不过了 创建、编辑计划任务命令为“crontab

    1.5K20

    Linux进程——进程创建(fork原理)

    查看进程第二种方法 在Linux系统中,不只有ps能够查看进程,还存在着一个动态目录proc,该目录存放了所有存在进程,目录名称。它会随着进程改变而随时更新它内容!...创建子进程 2.1 系统调用函数fork 在Linux中,进程创建方式有两种: 命令行中直接启动进程 通过代码创建 而在用代码创建进程时,实则是进行了系统调用,这里我们就得在学习一个系统调用函数...我们想让子进程协作父进程完成一些工作,这些工作是单进程解决不了,因此子进程创建是为了协助父进程,因此父子进程是不一样事情 我们怎么保证父子进程是不一样事情呢?...但是PCB选择调度是由操作系统自主决定(由各自PCB中调度信息(时间片,优先级等)+调度器算法共同决定) 所以我们不确定父子进程到底谁先运行 最后为什么fork会有两个返回值?...变量id是父进程定义变量,保存数据,返回时候发生写时拷贝,不同 进程执行代码中变量id获取值不同,所以id在父进程和子进程中值不同 3.

    10610

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券