- 1、本文档共44页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 图3-3 进程状态变化 * 设置当前进程状态 内核调整某个进程的状态: set_task_state(task,state) //将任务task的状态 设置为state 进程上下文 在用户空间执行的代码执行了系统调用或触发某个异常,陷入内核空间,即内核“代表进程执行”并处于进程上下文中 * 进程家族树 所有的进程都是PID为1的init进程的后代,内核在 系统启动的最后阶段启动init进程,该进程读取系统的初 始化脚本并执行其他的相关程序,最终完成系统启动的 整个过程。 除了init之外,所有进程都是由其他进程创建的。 创建新进程的进程称为新进程的父进程,而被创建的进 程称为原进程的子进程。若两个进程都是由同一个进程 创建的,则称这两个进程为兄弟进程。Task_struct结构 中就有进程的父进程指针、兄弟进程指针以及进程的子\ 进程指针。 * * 3.3 进程创建 Unix采用了与众不同的实现方式,它把上述步骤分解到 两个单独的函数中去执行:fork()和exec().首先,fork() 通过拷贝当前进程创建一个子进程。子进程与父进程的 区别仅仅在于PID(每个进程唯一)、PPID(父进程的进程 号,子进程将其设置为被拷贝进程的PID)和某些资源和 统计量(例如挂起的信号,它没有必要被继承)。exec() 函数负责读取可执行文件并将其载入地址空间开始运 行。把这两个函数组合起来使用的效果跟其他系统使用 的单一函数的效果相似。 * 写时拷贝 传统的fork()系统调用直接把所有的资源复制给新创建的 进程。这种实现过于简单并且效率低下。Linux的fork() 使用写时拷贝(copy-on-write)页实现。写时拷贝是一种 可以推迟甚至免除拷贝数据的技术。内核此时并不复制 整个进程地址空间,而是让父进程和子进程共享同一个 拷贝。只有在需要写入的时候,数据才会被复制,从而 使各个进程拥有各自的拷贝。 * fork() Linux通过clone()系统调用实现fork(),再由clone()去调用 do_fork(),定义在kernel/fork.c。再调用copy_process(): ①调用dup_task_struct()为新进程创建内核栈、thread_info结构 和task_struct,这些值与当前进程相同 ②检查当前用户所拥有的进程数目没有超出限值 ③子进程与父进程区分。子进程描述符内的成员被清0或初始化 ④子进程状态被设置为TASK_UNINTERRUPTBLE,不投入运行 ⑤copy_process()调用copy_flags()以更新task_struct的flags成员 ⑥调用alloc_pid()为新进程分配一个有效PID ⑦根据传递给clone()的参数标志,copy_process()拷贝或共享打 开的文件、文件系统信息、信号处理函数、进程地址空间和命 名空间等。 ⑧copy_process()做扫尾工作并返回一个指向子进程的指针 * 3.4 线程在Linux中的实现 线程:提供在同一程序内共享内存地址空间运行的一组线程。线程可以共享打开的文件和其他资源,支持并发程序设计技术。 Linux没有线程的概念,所有进程都当作进程 来实现,没有特别的调度算法或定义特别的数据 结构来表征线程,线程仅视为与其他进程共享某 些资源的进程。线程又称为“轻量级进程”,是一种进程间共享资源的手段。 * 创建线程:在调用clone()的时候需要传递一 些参数标志来指明需要共享的资源: clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0) //父子俩共享地址空间、文件系统资源、文件描述符和信号 处理程序 * 内核线程:独立运行在内核空间的标准进程,在后台执行操作。与普通进程间的区别在于内核线程没有独立的地址空间,只在内核空间运行,从不切换到用户空间,可以被调试和抢占。ps –ef可以看到内核线程。 内核线程的创建:内核线程只能由内核线程创建 方法: linux/kthread.h struct task_struct *kthread_create(int(*threadfn(void *data),void *data,const char namefmt[],…)//创建 struct task_struct *kthread_run(int (*threadfn(void *data),void *data,const char n
您可能关注的文档
最近下载
- 资本主义的发展历程(萌芽、制度确立、扩展)课件+++2024年湖南省中考二轮专题复习.pptx VIP
- 施耐德电气 SD328B 步进电机驱动器 产品手册.pdf
- J B-T 8975-2006 低压信号灯-机械行业标准规范.pdf VIP
- 医保支付方式改革—DRG与DIP.pptx
- 《10kV电杆结构部分计算书》.doc
- 《艺术学概论》随堂测验1-9答案.docx VIP
- 银行业防火演练方案.docx VIP
- 中医病历模板(腰突5).doc VIP
- Long-Term-Development-in-Sport-and-Physical-Activity-3.0体育运动中的长期发展.pdf
- 2023年陕西投资集团有限公司校园招聘考试笔试题库及答案解析.docx
文档评论(0)