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

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

进程是一个动态的实体,满足条件的情况下,他一直在执行,但是有时候,进程需要条件得不到满足的时候,他就会被挂起。...但这是被动的,不是进程控制的,也就是说,进程访问一个资源的时候,如果不能被满足,进程会被系统挂起,等到条件满足的时候,系统会唤起进程。 今天介绍的是一种进程主动睡眠的能力。...0 : timeout; } 接着往系统新增一个定时器,然后发送进程调度,该进程随即进入挂起状态。等到一定的时间后,进程会唤醒。...另外我们注意到挂起的进程状态是TASK_INTERRUPTIBLE,即可中断的。意思是这种状态的进程可以被信号唤醒。而TASK_UNINTERRUPTIBLE是不能被信号唤醒的。...这就是进程主动睡眠(sleep)的大致原理。

1.3K10

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

进程睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRUPTIBLE状态的进程只能被wake_up...} // 当前进程挂载到睡眠队列p中,p指向队列头指针的地址 void sleep_on(struct task_struct **p) { struct task_struct *tmp;...,即tmp指向第一个睡眠节点 头指针指向当前进程,这个版本的实现没有采用真正链表的形式, 他通过每个进程在栈中的临时变量形成一个链表,每个睡眠进程, 在栈里有一个变量指向后面一个睡眠节点...,然后把链表的头指针指向当前进程, 然后切换到其他进程执行,当被wake_up唤醒的时候,wake_up会唤醒链表的第一个 睡眠节点,因为第一个节点里保存了后面一个节点的地址...去唤醒别的进程,自己却还睡眠 */ if (*p && *p !

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

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

注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....睡眠的三种状态 任务睡眠有三种状态: 浅度睡眠 中度睡眠 深度睡眠 2.1 浅度睡眠 进程描述符的state使用TASK_INTERRUPTIBLE表示这种状态。...当任务睡眠完成,定时器超时,会调用之前在__hrtimer_init_sleeper设置的超时回调函数hrtimer_wakeup将睡眠的任务唤醒(关于进程唤醒在这里就不在赘述,在后面的进程唤醒专题文章在进行详细解读...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。...对于进程睡眠,内核主要需要做三大步操作:1.设置任务状态为睡眠状态 2.记录睡眠的任务 3.发起主动调度。

2.6K40

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

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

1.8K20

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

本文来探讨一下,任务处于睡眠中有哪些状态?睡眠对于任务来说究竟意味着什么?内核是如何管理睡眠的任务的?我们会结合内核源代码来分析任务的睡眠,力求全方位角度来剖析。...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....睡眠的三种状态 任务睡眠有三种状态: 浅度睡眠 中度睡眠 深度睡眠 2.1 浅度睡眠 进程描述符的state使用TASK_INTERRUPTIBLE表示这种状态。...2.2 中度睡眠 进程描述符的state使用TASK_KILLABLE表示这种状态。 可以被致命信号所打断。...进程描述符的state使用TASK_UNINTERRUPTIBLE表示这种状态。

1.4K20

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

可中断的睡眠状态的进程睡眠直到某个条件变为真,比如说产生一个硬件中断、释放 进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件。...不可中断睡眠状态与可中断睡眠状态类似,但是它有一个例外,那就是把信号传递到这种睡眠 状态的进程不能改变它的状态,也就是说它不响应信号的唤醒。...sleeping_task = current; set_current_state(TASK_INTERRUPTIBLE); schedule(); func1(); /* Rest of the code...... */ 在第一个语句中,程序存储了一份进程结构指针 sleeping_task,current 是一个宏,它指向正在执行的进程结构。...wake_up_process(sleeping_task); 在调用了 wake_up_process() 以后,这个睡眠进程的状态会被设置为 TASK_RUNNING,而且调度器会把它加入到运行队列中去

2.2K90

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

可中断的睡眠状态的进程睡眠直到某个条件变为真,比如说产生一个硬件中断、释放 进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件。...不可中断睡眠状态与可中断睡眠状态类似,但是它有一个例外,那就是把信号传递到这种睡眠 状态的进程不能改变它的状态,也就是说它不响应信号的唤醒。...sleeping_task = current; set_current_state(TASK_INTERRUPTIBLE); schedule(); func1(); /* Rest of the code...... */ 在第一个语句中,程序存储了一份进程结构指针 sleeping_task,current 是一个宏,它指向正在执行的进程结构。...wake_up_process(sleeping_task); 在调用了 wake_up_process() 以后,这个睡眠进程的状态会被设置为 TASK_RUNNING,而且调度器会把它加入到运行队列中去

7.2K10

python fork()多进程

在子进程终止后,必须调用wait()函数,否则系统系统资源会被大量的zombie进程消耗掉,最终会使服务器不可用。 操作系统可以非常容易地完成这个工作。...示例中子进程睡眠5秒钟后,父进程就开始收割。time.sleep()有一种特殊情况,如果任意一个信号处理程序被调用,睡眠会被立刻终止,而不是继续等待剩余的时间。...七、总结 大多数服务器都需要同时处理多个客户端。对于服务器的设计者来说,有几种方法可以实现它,其中最简单的就是forking,它主要适用于Linux和UNIX平台。...使用forking的服务器通常会调用fork()来为每一个到来的连接建立一个新进程。对于进程中不使用的文件描述符,重要的一点是父进程和子进程都应该关闭。 如果文件被修改,锁定是非常重要的。...如果多个进程同时修改一个文件,或者一个进程读取文件的时候,另一个进程正在写文件,都会损坏文件。 如果系统不能执行fork,os.fork()函数可以产生异常。为了防止服务器当机,必须处理这个异常。

2K20

Linux系列之学会使用Top命令进行系统监控

:01 up 231 days, 2:06, 1 user, load average: 0.88, 0.22, 0.18 Tasks: 170 total, 1 running, 169 sleeping...Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie 170 total(系统当前总进程总数) 1 running (正在运行的进程数...) 169 sleeping睡眠进程数) 0 stopped (停止进程数) 0 zombie (僵尸进程数) row3:CPU 统计信息 %Cpu(s): 38.7 us, 3.5 sy, 0.0...、 系统进程信息 PID :进程id USER :进程所有者的用户名 PR :进程优先级 NI :nice值。负值表示高优先级,正值表示低优先级 VIRT :进程使用的虚拟内存总量,单位kb。...D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 %CPU :上次更新到现在的CPU时间占用百分比 %MEM :进程使用的物理内存百分比 TIME+ :进程使用的CPU时间总计,

41110

10分钟教会你看懂top

后端们最怕的事情之一就是服务器的负载突然飙升,这可能又意味着一个个夺目Call马上要打过来了。碰到这种情况怎么办,大家第一反应一定是登陆到服务器上,先敲一个top命令看看Load Average吧。...先来说说定义吧:在一段时间内,CPU正在处理以及等待CPU处理的进程数之和。三个数字分别代表了1分钟,5分钟,15分钟的统计值。 所以,这个数值的确能反应服务器的负载情况。...第二行:Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie Tasks:当前有多少进程 running:正在运行的进程...sleeping:正在休眠的进程 stopped:停止的进程 zombie:僵尸进程 running越多,服务器自然压力越大。...D表示不可中断的睡眠状态;R表示运行;S表示睡眠;T表示跟踪/停止;Z表示僵尸进程

1.3K10

进程服务器

一、思路 先与客户端建立好连接, 每次监听到一个客户端之后,都需要产生一个子进程去处理这个连接,然后父进程继续去等待监听,唯一一个要注意的点就是要使用信号来监听子进程是否结束,从而对其进行回收,防止僵尸进程的产生...&opt, sizeof(opt)); (3)bind函数 bind(lfd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));b这个函数主要目的就是将服务器的地址结构绑定到套接字...lfd上,所以开始要设置服务器的ser_addr:ser_addr.sin_family = AF_INET, ser_addr.sin_port = htons(8888);ser_addr.sin_addr.s_addr...监听到了客户端后,就要开始创建子进程来对这个监听进行处理;pid = fork() 3、子进程处理通信 因为子进程不需要监听连接,使用可以close(lfd);之后便可以进行通信处理 void do_work...sizeof(buf)); tcp.Write(cfd, buf, n); tcp.Write(STDOUT_FILENO, buf, n); } } 4、父进程回收子进程

4.7K20

宋宝华: 聊一聊进程深度睡眠的TASK_KILLABLE这个状态

众所周知,Linux的进程睡眠有两种常规状态: TASK_INTERRUPTIBLE(浅度睡眠):可以被等待的资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE(深度睡眠):可以被等待的资源唤醒...简单来说,深度睡眠进程必须等待资源来了才能醒,在此之前,甚至你给它发任何的信号,它都不可能醒来。...浅度睡眠进程,则可以被信号唤醒,对于常规的键盘、串口、触摸屏等等这些I/O设备,显然符合此类模型。...正在读本文的你,可能都有过这样的悲催经历,在NFS文件系统上面运行程序,但是NFS服务器挂了,你怎么都ctrl + c不掉那个进程,因为它就是个深度睡眠的场景。...这样就使得深度睡眠进程,还可以被杀死,妈妈再也不用担心NFS服务器挂了后,我痛苦,我孤独,我精分了!

2.2K30

Linux 进程管理之四大名捕

时间占用比率 MEM%:内存占用百分比 VSZ:virtual size虚拟内存集; RSS:Resident Size,常驻内存集; STAT: R:running 运行 S:interruptable sleeping...可中断睡眠 D:uninterruptable sleeping 不可中断睡眠 T:Stopped 停止 Z:zombie 僵死态 +:前台进程 l:多线程进程 N:低优先级进程 <:高优先级进程 s...:session leader 进程领导者 常用组合之二:-ef -e:显示所有进程 -f:显示完整格式的进程信息 ?...user:登录当前系统上的用户数 load average: 0.01, 0.02, 0.05:平均负载(等待运行的队列长度的负载) Tasks: 353 total, 2 running, 351 sleeping..., 0 stopped, 0 zombie Tasks:任务 353 total:一共运行多少进程 2 running:几个处于运行 351 sleeping:多少个睡眠 0 stopped:多少个停止

91720

Linux 进程管理之四大名捕

VSZ:virtual size虚拟内存集; RSS:Resident Size,常驻内存集; STAT: R:running 运行 S:interruptable sleeping 可中断睡眠 D:...uninterruptable sleeping 不可中断睡眠 T:Stopped 停止 Z:zombie 僵死态 +:前台进程 l:多线程进程 N:低优先级进程 <:高优先级进程 s:session...–top-cpu:显示最占用CPU的进程; –top-io:最占用io的进程; –top-mem:最占用内存的进程; 五、腿功惊人的“追命”[top] top:列出inux进程 top为动态显示进程...user:登录当前系统上的用户数 load average: 0.01, 0.02, 0.05:平均负载(等待运行的队列长度的负载) Tasks: 353 total, 2 running, 351 sleeping..., 0 stopped, 0 zombie Tasks:任务 353 total:一共运行多少进程 2 running:几个处于运行 351 sleeping:多少个睡眠 0 stopped:多少个停止

1.1K40

如何查看linux系统中空闲内存物理内存使用剩余内存

:32 up 16 days,  6:34, 17 users,  load average: 0.24, 0.21, 0.24 Tasks: 481 total,   3 running, 474 sleeping...内容如下: Tasks: 29 total  进程总数   1 running  正在运行的进程数   28 sleeping  睡眠进程数   0 stopped  停止的进程数   0 zombie...D =不可中断的睡眠状态             R =运行             S =睡眠             T =跟踪/停止             Z =僵尸进程   x  COMMAND... 命令名/命令行   y  WCHAN  若该进程睡眠,则显示睡眠中的系统函数名   z  Flags  任务标志,参考 sched.h  默认情况下仅显示比较重要的  PID、USER、PR、...proc/cpuinfo | grep "cpu cores" | uniq 查看CPU型号 # cat /proc/cpuinfo | grep 'model name' |uniq 那么,该服务器

19.7K41

面试官:生产环境中 CPU 利用率飙高怎么办?

第一,不会让你随便登录生产服务器;第二,服务器太多,这种方式根本管不过来。所以,一般都会有成体系的监控平台。 TOP 命令相关指标 top 命令除了查看 CPU 的使用情况外,还有很多很有用的信息。.../线程)情况 字段含义total总进程/线程数 running正在运行的进程/线程数sleeping睡眠进程/线程数stopped停止的进程/线程数zombie僵尸进程/线程数 CPU 资源使用情况.../线程详情 字段含义PID进程/线程 IDUSER进程/线程所有者PR进程/线程优先级NInice值。...负值表示高优先级,正值表示低优先级VIRT进程/线程(申请)使用的虚拟内存,单位 KB,VIRT=SWAP+RESRES进程/线程(实际)使用的物理内存SHR进程/线程使用的共享内存S进程/线程状态,D...=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程%CPU上次更新到现在的 CPU 时间百分比(单核)%MEM上次更新到现在的内存百分比TIME+进程/线程占用 CPU 的总时间,精确到百分之一秒

67030
领券