3. 进程创建3.1 基本概念
- unix进程创建分为:fork和exec两步
- fork通过拷贝当前进程创建子进程 。子进程和父进程仅有很少差异:pid,ppid,某些资源和统计量
- exec负责读取可执行文件并载入地址空间开始运行
- 传统的fork直接拷贝资源效率低下,linux使用写时拷贝(copy on write)技术提高效率
- COW并不会复制整个地址空间,而是让父子进程以只读方式共享内存,数据的复制只有在写入时才进行
- linux通过clone()系统调用实现fork(), 这个调用通过参数标识(很多种类型)指明需要共享的资源
- clone内部调用do_fork完成主要工作(kernel/fork.c)
- do_fork内部调用copy_process,然后让进程运行
- copy_process调用过程: 调用dup_task_struct为新进程创建内核栈,thread_info结构和task_struct,这些值与当前进程相同,此时描述符完全相同 检查系统拥有的进程数是否超过限制 将很多成员重置 设置状态为TASK_UNINTERRUPTIBLE保证不会被运行 调用copy_flags以更新task_struct的flags成员 调用get_pid获取新的pid 根据参数标识,拷贝或共享打开的文件,文件系统信息,信号处理函数,进程地址空间,命名空间等 。一般情况下,这些资源是线程共享的 父子进程平分时间片 扫尾工作,并返回指向子进程的指针
- 新创建的进程被唤醒并让其投入运行,一般优先子进程首先执行
- 和fork功能相同,除了补考吧父进程的页表项
- 通过向clone系统调用传递一个特殊标志进行的
- 该函数的设计并不是很优良的
- 一组线程共享进程内的内存地址空间,打开的文件和其他资源
- 线程机制支持并发程序设计技术,多处理器上保证真正的并行处理
- linux实现线程的机制非常独特,从内核角度看,没有线程的概念
- linux把所有线程都当做进程来实现,内核没有特别的调度算法或数据结构来表征线程,被视为一个使用某些共享资源的进程
- 每个线程有自己的task_struct,就像一个普通的进程,这个进程和其他进程共享某些资源
- 与其他系统(windows,solaris)实现差异巨大,这些系统内核专门提供线程的支持
- 线程的创建和普通进程创建类型,只不过调用clone时需要传递一些参数标志,指明需要共享的资源
- 参数标志说明: CLONE_VM:父子进程共享地址空间 CLONE_SIGHAND:父子进程共享信号处理函数 CLONE_THREAD:父子进程放入相同线程组 CLONE_FS:父子进程共享文件系统信息 CLONE_FILES:共享打开的文件 …
- 内核线程:独立运行在内核空间的标准进程
- 和普通进程的区别:没有独立的地址空间,只能在内核空间运行
- 创建只能由其他内核线程创建,函数为kernel_thread
- 进程终结时,内核必须释放它所占有的资源,并通知父进程
- 结束可以是正常,异常,还可以注册终止清理函数
- 最终结束会调用do_exit(kenel/exit.c),完成的工作包括: 将task_struct的标志成员设置为PF_EXITING 如果进程会计功能开启,会调用acct_process输出统计信息 调用_exit_mm函数放弃进程占用的mm_struct,如果没有被共享就彻底释放 调用sem_exit 。如果排队等待IPC信号,则离开队列 调用__exit_files:递减文件描述符;__exit_fs:递减文件系统数据;exit_namespace:名字空间引用计数;exit_sighand:信号处理函数引用计数,如果某个降为0,则可释放 task_struct的exit_code设置退出代码 调用exit_notify向进程发送信号,父进程修改为其他线程或init进程,进程状态设置为TASK_ZOMBLE(僵死,不被调度) 最后,调用schedule切换到其他进程
- 调用完do_exit,与进程相关的所有资源都被释放了,它所占有的资源只剩报错thread_info的内核栈和保存task_struct的那一小片slab,存在的唯一目的就是向父进程提供信息 。
- 调用do_exit之后,线程僵死,但是还保留文件描述符
- 父进程获取到子进程的信息后,子进程的task_sturct结构才被释放
- wait函数调用系统函数wait4实现,将挂起调用它的进程,直到其中一个子进程退出,函数返回子进程的pid
- 当最终需要释放进程描述符时,release_task会被调用,执行以下工作: 调用free_uid减少该进程拥有者的进程使用计数 调用unhash_process从pidhash上删除该进程,同时从task_list删除该进程 如果进程正在被ptrace跟踪,将跟踪父进程重置 最后,调用put_task_struct释放内核栈和thread_info结构所占的页,并释放task_struct所占的slab高速缓存 这时资源和描述符就全部被释放掉了
- 艺术电子签名一键生成器 设计名字签名的免费软件
- 免费姓氏头像logo在线制作工具 用自己的名字设计头像的软件
- 设计图片的软件有哪些 手写背景图制作软件推荐
- 专业的网页制作工具有哪些 网页设计制作网站推荐
- 网站设计哪家好做 关于网站设计制作
- 内饰设计十分豪华 迈巴赫vs680报价 迈巴赫vs680落地价48万元
- 平面图用什么软件做最简单 手机平面设计制图软件介绍
- web设计一个简单网页 web创建一个简单网页教程
- 在线做网站怎么做 网页设计与制作分享
- 网页设计的目的与意义是什么 介绍花网页设计选题意义