首页 > 系统相关 >04_进程管理

04_进程管理

时间:2024-01-10 13:23:27浏览次数:35  
标签:fork task struct 04 管理 线程 内核 进程

0. 写在前面

  1. 进程与线程的关系
  2. Linux如何存放和表示进程(tast_struct、thread_info)
  3. 如何创建进程(fork()、最终调用clone())
  4. 如何把新的执行映像装入到地址空间(exec()族)
  5. 如何表示进程的层次关系,父进程如何收集后代信息(wait()系统调用族)
  6. 进程是如何消亡的(exit())

一、进程描述符

每个进程都是内核维护的一个结构体:task_struct,众多进程也就是众多结构体组成双向循环链表。

二、进程描述符 —— slab分配

Linux通过slab分配器分配task_struct结构。

三、进程描述符 —— 存放

  1. pid 是每个进程的唯一标识符,最大值默认为32768,通过修改/proc/sys/kernel/pid_max 提高上限。
  2. 有的硬件体系结构有专门寄存器来存放指向当前进程 task_struct 的指针,用于加速访问。x86这种体系结构,只能在内核栈的尾端创建 thread_info 结构,通过计算偏移间接查找 task_struct 结构。

四、进程的五态(三态是进程调度)

  • 当fork一个子进程时,子进程进入就绪态,当进程调度该子进程时,进入运行态。此时分为四种情况:
  1. CPU时间片耗尽,回到就绪态。
  2. 进程结束后,进入僵尸态,需要父进程调用 wait waitpid 释放进程描述符。
  3. 进程接收到 SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU 信号,进入停止态。若接收到 SIGCONT 信号,会重新进入就绪态
  4. 进程未申请到所需资源,进入等待态,等待态分为两种情况
    4.1 可中断等待态,所需资源被满足或被信号、中断唤醒,重新进入就绪态
    4.2 不可中断等待态,只有资源被满足才会重新进入就绪态。
  • 设置进程状态的函数:set_task_state(task, state)

五、进程上下文 —— 系统调用

系统调用中断是应用层陷入内核层的方法。
当一个程序执行了系统调用,或触发了某个异常,它就陷入了内核空间。此时称内核“代表进程执行”并处于进程上下文中。使用current宏定位task_struct指针。

六、进程家族树

  1. 获得父进程描述符
    struct task_struct *my_parent = current->parent;
  2. 访问子进程
struct task_struct *task;
struct list_head *list;
list_for_each(list, &current->children) {
	task = list_entry(list, struct task+struct, sibling);
	// task指向当前的某个子进程
}
  1. init进程的进程描述符是作为init_task静态分配的。
struct task_struct *task;
for(task = current; task != &init_task; task = task->parent);
// task指向init
  1. 获取链表中的下一个进程
    list_entry(task->task.next, struct task_struct, tasks)
  2. 获取链表中的上一个进程
    list_entry(task->task.prev, struct task_struct, tasks)
  3. 循环访问整个任务队列
struct task_struct *task;
for_each_process(task) {
	printk("%s[%d]\n", task->comm, task->pid);
}
  1. 通过摘链方法隐藏进程

七、读时共享/写时复制

  • 在调用 fork() 时先复制数据,这种复制是通过页面映射机制实现的,此时地址空间数据是只读的。
    1. 当父/子对数据进行写操作时,会触发页错误,此时内核会真正复制整个进程地址空间。
    2. 若此时调用exec(),它就无需复制了。
  • fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。

八、Linux通过clone()系统调用实现fork(),然后由clone()调用do_fork()

  1. fork ---> sys_fork ---> ... ---> do_fork
    读时共享,写时复制:内核对父进程的每个内存页都为子进程创建一个相同的副本
  2. vfork ---> sys_vfork ---> ... ---> do_fork
    父子进程间共享数据,节省大量CPU时间(如果一个进程操纵共享数据,另一个会被影响)
    子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()
  3. clone ---> sys_clone ---> ... ---> do_fork
    clone产生线程,可以对父子进程间的共享、复制进行精准控制

九、线程是特殊的进程

线程的创建和普通进程的创建类似,之色在调用clone()的时候需要传一些参数标志指明需要共享的资源:
clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);
共享地址空间、文件系统资源、文件描述符、信号处理程序
fork()的实现:
clone(SIGCHLD, 0);
vfork()的实现:
clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0);
调用vfork(),所以父进程准备睡眠等待子进程将其唤醒,共享地址空间

十、内核线程

内核线程和普通进程间的区别在于内核线程没有独立的地址空间(指向地址空间的mm指针被置为NULL)

  • 内核线程创建并运行
#define kthread_run(threadfn, data, namefmt, ...)			   \
({									   \
	struct task_struct *__k						   \
		= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
	if (!IS_ERR(__k))						   \
		wake_up_process(__k);					   \
	__k;								   \
})
  • 内核线程退出
int kthread_stop(struct task_struct *k);

标签:fork,task,struct,04,管理,线程,内核,进程
From: https://www.cnblogs.com/qinghuan190319/p/17956277

相关文章

  • 多线程任务管理:深入学习CompletionService的应用
    第1章:引言大家好,我是小黑,咱们都知道,在现代软件开发中,特别是对于Java程序员来说,高效地处理并发任务是一个非常关键的技能。就像在繁忙的餐厅里,多个厨师同时烹饪不同的菜肴一样,程序中的多线程也需要协调地工作。在这个背景下,Java的CompletionService就像是一个管理厨师的调度员,它......
  • HarmonyOS (ArkTS)状态管理
    一、状态管理分为:页面级变量的状态管理  (主要用于单页面,同一个页面内不同组件之间的状态管理。)应用级变量的状态管理(主要用于多页面,同一个应用内,不同页面之间的状态管理。例如:A页面和B页面实现数据共享)1、页面级变量的状态管理@State、@Prop、@Link、@Provi......
  • 基于java的小型超市管理系统
    使用旧方法对超市信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在超市信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的小型超市管理系统有管理员,用户,员工。管理员功能有个人中心,用户管理,员工管......
  • 2024 年的 API 管理新动向
    本文译自:WhatWillBetheAPIManagementTrendsfor2024?原文链接:https://thenewstack.io/what-will-be-the-api-management-trends-for-2024/原文作者:KennHussey预计到2030年末,API管理 市场的规模将增长六倍,这一增长主要受到一个核心理念的推动:API完全控制了数字世界。随......
  • 基于SSM的旅游景点管理系统设计
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游景点管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功......
  • IT外包必不可少的派单管理工具【推荐】
    背景IT外包单位也叫系统集成商,主要业务是承接甲方企业与政企的IT类运维、桌面管理等工作,甲方员工发IT办公类故障或设备故障需要外包单位来处理,存在故障统一报修入口,乙方维修员上门维修过程不透明,需要系统做管理。三点痛点据青鸟云报修平台大量的IT外包商反映,他们在日常管理中存在如......
  • 基于SSM框架的毕业生就业管理平台
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本毕业生就业管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半......
  • 2024年1月软考高级信息系统项目管理师多数人都到这报名
    信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。信息系统项目管理师,属于软考三个级别中的“高级”。 【报考要求】 不设学历与资历条......
  • 弘博创新PMP®项目管理认证面授课开课啦!学员学习热情高涨
    为了迎接2024年3月10日的PMP®认证考试,弘博创新2024年第一季度的PMP®项目管理认证面授课程于2024年1月6、7日正式开班,来自不同的行业和领域学员们积极参加培训学习,同时也吸引了多名对项目管理感兴趣的小伙伴前来试听。 本次课程由行业资深项目管理专家岳建伟老师授课,岳老师上课形......
  • 统一搜索管理系统的一些思考
    产品背景市场分析目前搜索类产品多集中在阿里云、腾讯云等大型云厂商手中,主要提供公有云服务的能力,而提供私有化部署,产品功能齐全,支持跨系统查询的智能搜索服务产品市场上较少。嘉诚统一搜索管理系统支持多数据源接入,支持跨系统统一搜索,支持私有化部署,能很好解决以上问题。用户......