【操作系统】进程的创建 fork & 线程的创建_在fork中创建线程

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

+ [内核态创建任务](#_15)
+ [用户态执行线程](#_26)
+ [总结](#_28)

进程创建fork

fork做的事一个是将 task_struct 结构复制一份并且初始化,另一个是试图唤醒新创建的子进程,如果条件满足,就会将当前进程设置应该被调度的标识位,就等着当前进程执行 __schedule 了
在这里插入图片描述

创建线程

创建一个线程调用的是 pthread_create

用户态创建线程

  • 无论是进程还是线程,在内核里面都是任务task.
  • 线程不是一个完全由内核实现的机制,它是由内核态和用户态合作完成的。pthread_create 不是一个系统调用,是 Glibc 库的一个函数.
  • 首先处理的是线程的属性参数。如果没有传入线程属性,就取默认值。
  • 接下来,就像在内核里一样,每一个进程或者线程都有一个 task_struct 结构,在用户态也有一个用于维护线程的结构,就是这个 pthread 结构。
  • 凡是涉及函数的调用,都要使用到栈。每个线程也有自己的栈。那接下来就是创建线程栈了。int err = ALLOCATE_STACK 宏(iattr, &pd);
  • allocate_stack :为了防止栈的访问越界,在栈的末尾会有一块空间 guardsize,一旦访问到这里就错误了;线程栈是在进程的堆里面创建的。如果一个进程不断地创建和删除线程,我们不可能不断地去申请和清除线程栈使用的内存块,这样就需要有一个缓存。管理线程栈总共有两个链表,一个是 stack_used,也就是这个栈正被使用;另一个是 stack_cache,一旦线程结束,先缓存起来,不释放,等有其他的线程创建的时候,给其他的线程用.

内核态创建任务

  • start_routine 就是咱们给线程的函数,start_routine,start_routine 的参数 arg,以及调度策略都要赋值给 pthread。
  • 接下来 __nptl_nthreads 加一,说明有多了一个线程。
  • 真正创建线程的是调用 create_thread 函数 里面有 clone_flags,然后就是 ARCH_CLONE,其实调用的是 __clone(系统调用)
  • 和其他的系统调用不同的地方在于:
  • 复杂的标志位设定:CLONE_FILES 标识位变成将原来的 files_struct 引用计数加一。copy_fs,原来是调用 copy_fs_struct 复制一个 fs_struct,现在因为 CLONE_FS 标识位变成将原来的 fs_struct 的用户数加一。对于 copy_sighand,原来是创建一个新的 sighand_struct,现在因为 CLONE_SIGHAND 标识位变成将原来的 sighand_struct 引用计数加一。对于 copy_signal,原来是创建一个新的 signal_struct,现在因为 CLONE_THREAD 直接返回了。对于 copy_mm,原来是调用 dup_mm 复制一个 mm_struct,现在因为 CLONE_VM 标识位而直接指向了原来的 mm_struct
  • **第二个就是对于亲缘关系的影响,**新进程 id就是自己 , 对于新线程id 是当前进程的。如果是新进程 是进程树里面又见一辈人了 , 对于新线程 就是同辈
  • 第三,对于信号的处理 kill 一个进程,则所有线程都要被干掉。如果一个信号是发给一个线程的 pthread_kill,则应该只有线程能够收到。 整个进程里的所有线程共享一个 shared_pending,这也是一个信号列表,是发给整个进程的,哪个线程处理都一样。

用户态执行线程

  • 回到用户, start_thread函数,这是所有线程在用户态的统一入口,在用户的函数执行完毕之后,会释放这个线程相关的数据。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

如果你需要这些资料,可以戳这里获取

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值