linux进程管理
文章平均质量分 83
oqqYuJi12345678
这个作者很懒,什么都没留下…
展开
-
linux select的使用及其原理实现
linux select和poll的实现机制其实是类似的,而且最终都会使用到内核驱动提供的具体poll方法,poll的使用详解参考这篇文章:https://blog.csdn.net/oqqYuJi12345678/article/details/1063137681 应用层使用举例1.1函数原型int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);原创 2020-05-24 16:04:53 · 831 阅读 · 0 评论 -
linux poll的使用及其原理实现
1 poll的使用相对于select来说,poll 也是在指定时间内论询一定数量的文件描述符,来测试其中是否有就绪的,不过,poll 提供了一个易用的方法,来实现 i/o 复用。声明如下:#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);其中,struct pollfd 定义为:struct pollfd { int fd; /* file desc原创 2020-05-24 15:16:34 · 6196 阅读 · 0 评论 -
linux 内核等待队列机制原理分析
1.等待队列数据结构等待队列由双向链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头(wait queue head),等待队列头是一个类型为wait_queque_head_t的数据结构:struct __wait_queue_head { spinlock_t lock; struct list_head task_list;};typedef struct __wait_queue_head wait_queue_h...转载 2020-05-23 19:56:43 · 834 阅读 · 0 评论 -
linux3.10 中0号任务的创建以及堆栈初始化
该博文转自:https://blog.csdn.net/wennuanddianbo/article/details/55107046一、初识0号任务 打开linux系统的命令行,敲下“ps -A”命令,就能看到系统中的所有任务:其中有一个pid号为0任务格外的显眼。 我们知道linux中的task都是通过fork族函数由父进程创造出来,而这个0号进程却是个例外,它由人类捏...转载 2019-08-16 23:21:32 · 331 阅读 · 0 评论 -
linux workqueue
Workqueue 是内核里面很重要的一个机制,特别是内核驱动,一般的小型任务 (work) 都不会自己起一个线程来处理,而是扔到 Workqueue 中处理。Workqueue 的主要工作就是用进程上下文来处理内核中大量的小任务。所以 Workqueue 的主要设计思想:一个是并行,多个 work 不要相互阻塞;另外一个是节省资源,多个 work 尽量共享资源 ( 进程、调度、内存 ),不要...原创 2019-11-08 09:18:49 · 531 阅读 · 0 评论 -
内核线程kthreadd详解
linux在初始化的时候,除了静态的idle线程,还会创建kernel_init线程和kthreadd线程。kthreadd线程为2号线程,该线程专门用来负责为kernel创建其他线程。下面看一下如何利用kthreadd创建一个内核线程。struct kthread_create_info{ /* Information passed to kthread() from kthreadd...原创 2019-11-06 22:18:36 · 5642 阅读 · 0 评论 -
linux rest_init
在linux初始化start_kernel最后会调用rest_init进行最后的初始化工作。Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2)。rest_init函数的作用是创建了init和kthreadd这两个进程,并且idle进程继续往下执行,最终在一个while循环中作为空闲进程,如果没有其他进程调度,当前cpu...原创 2019-11-02 22:28:58 · 1075 阅读 · 0 评论 -
linux do_fork详解
当内核调用kernel_thread函数创建内核线程或者应用程序系统调用fork创建进程以及使用pthread_create创建线程的时候,其在内核中最终调用的函数就是do_fork。do_fork这个函数非常复杂,这边只介绍里面的两个子函数copy_mm和copy_thread。1copy_mmdo_fork --------->copy_process ...原创 2019-10-31 19:10:53 · 2332 阅读 · 0 评论 -
linux调度器源码分析 (四)- 调度原理
在前面的概述里说到过,调度分为周期性调度和特定时刻调度。1 周期性调度系统启动调度器初始化时会初始化一个调度定时器,定时器每隔一定时间产生一个中断,即一个滴答,在中断会对当前运行进程运行时间进行更新,如果进程需要被调度,在调度定时器中断中会设置一个调度标志位,而不会真正的调度时机将会推迟到特定时刻调度,总的来说周期性调度的任务并不完成进程的真正切换工作,只是检查当前进程是否需要调度并设置相...原创 2019-10-27 22:04:38 · 1108 阅读 · 0 评论 -
linux调度器源码分析(三) - 新进程加入
这篇文章主要说明系统如何把一个进程加入到队列中。1加入时机只有处于TASK_RUNNING状态下的进程才能够加入到调度器,其他状态都不行,也就说明了,当一个进程处于睡眠、挂起状态的时候是不存在于调度器中的,而进程加入调度器的时机如下:当进程创建完成时,进程刚创建完成时,即使它运行起来立即调用sleep()进程睡眠,它也必定先会加入到调度器,因为实际上它加入调度器后自己还需要进行一定的...转载 2019-10-26 16:25:02 · 397 阅读 · 0 评论 -
linux 进程优先级详解
Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级。在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级。linux 内核版本为 linux 2.6.34 。 进程优先级的相关信息,存放在进程描述符 task_struct 中:struct task_struct { ... int prio...转载 2019-10-25 23:02:33 · 440 阅读 · 0 评论 -
linux调度器源码分析(二) - 初始化
每个CPU(多核COU中的每个核)都有自己的struct rq队列,而rq队列中又有着自己的struct cfs_rq和struct rt_rq。在初始化时就是对这三个结构进行初始化。1 init_task和init进程在start_kernel函数中,进行了系统启动过程中几乎所有重要的初始化(有一部分在boot中初始化,有一部分在start_kernel之前的汇编代码进行初始化),包括内...转载 2019-10-25 16:18:36 · 377 阅读 · 0 评论 -
linux调度器源码分析 (一)- 概述
本系列文章源码基于linux3.10.1概述linux从其初始版本稳步发展到今天,从2.4的非抢占内核发展到今天的可抢占内核,调度器无论从代码结构还是设计思想上也都发生了翻天覆地的变化,其普通进程的调度算法也从O(1)到现在的CFS。在linux3.10版本上整个调度系统至少包含两种调度算法,是分别针对实时进程和普通进程,所以在整个linux内核中,实时进程和普通进程是并存的,但它们使...原创 2019-10-24 23:31:26 · 399 阅读 · 0 评论 -
linux 3.10 Pid hash 链表
pid,即process ID,进程ID。内核在初始化的时候有一个函数为pidhash_init,这个函数要做什么呢?我们都知道,我们可能在很多情况下,都想知道进程的一些状态,在这种情况,内核必须能够从进程的PID导出对应的进程描述符指针,这样我们才能获取我们想要的进程信息!进程有自己单独的链表叫进程链表,其原理是一个双向链表!但是如果查找的时候用双向链表的话,效率比较低,所以使用pidha...原创 2019-10-06 15:22:11 · 273 阅读 · 0 评论