前言
学习自用,这篇还比较没头绪,标题和内容很难对上
问题
子进程能继承父进程的什么东西?不能继承父进程的什么东西?
fork以后会生成一个task_struct,还会修改页表吧,每个线程还都有自己的thread_info,在栈的底部(应该是线程栈吧),其中有一个成员指针指向task_struct
信号处理函数不能继承,毕竟在子进程里对应的处理函数的地址是无效的(来自APUE),未决信号集也是不能继承的,
而task_struct存有被阻塞的信号集
线程独立的资源
linux内核并没有线程的概念. 每一个执行实体都是一个task_struct结构,,每个线程都有一个task_struct,
每个线程有独立的寄存器,如PC寄存器和栈指针,线程切换的时候也会现场保护就涉及到这些寄存器
线程中除了会用一个独立的线程栈,其余的内存区域都是共用的,比如堆,代码区,数据区
errno也是独立的(errno属于全局变量吗)
信号处理函数(参考资料5说是进程共享的?),信号屏蔽码也是独立的,这些也在task_struct里有记录,忽略的信号集,未处理的信号等
线程调度的优先级也是不一样的,这点与进程一样,PCB里就有记录相应的调度相关信息
而文件描述符是进程内共用的,进程通过PCB里面的struct files_struct *files位来存储打开了的文件描述符,里面有spinlock用来同步,还有个struct file *files_struct[] 数组指向所有打开的文件,每个struct file里也包含着dentry和spinlock等成员,
虽然task_struct是独立的,但是linux的线程设计成是共用文件描述符的,多线程服务器编程我们可以直接传递这个fd
线程和进程编程的选择
数据交互方面,多进程的数据传输需要额外的IPC,而线程的数据共享可以直接用堆区全局区做交换
数据交互会涉及到一个数据的同步,这个则是多进程占优(为什么?)
多进程的切换会比多线程的切换多一个页表的转换,与间接开销:页表的刷新
内存的占用也是多进程更高(为什么?),(好像线程的最大限制比进程的最大限制要更多吗)
多进程的调试一般比多线程复杂,
在一些语言里如cpp,一个线程异常退出会导致整个进程的崩溃,而多进程能保证可靠性
对于分布式,是多进程优势更大,拓展更好
内核空间
内核空间 内核空间总是驻留在内存中,它是为操作系统的内核保留的。内核空间按访问权限可以分为进程私有和进程共享两块区域。 进程私有的虚拟内存:每个进程都有单独的内核栈、页表、task_struct 结构以及 mem_map 结构等。 进程共享的虚拟内存:属于所有进程共享的内存区域,包括物理存储器、内核数据和内核代码区域。
内核态地址空间,分为,固定的映射区域,直接映射区,动态内存映射区
动态内存映射区用vmalloc来分配
永久内存映射区在32位系统是只能访问high memory的区域吧
vmalloc是通过修改vm_struct实现的
进程和线程
在Linux中线程编程符合Posix.1标准,称为Pthreads
内核线程:
内核线程由内核调度
内核线程的task_struct的mm位是空的(内核线程不是可以访问到所有地址吗)
参考资料1提到内核线程用active_mm来访问所有空间(为什么要多此一举)
所有的内核线程共享内核地址空间,linux下的每个进程或线程都有三个数据结构,thread_info,task_struct,内核栈
thread_info放在这个进程/线程内核空间的末尾,thread_info有个成员指向task_struct
用户线程
略,看另一篇
其他
用户线程和内核线程的区别,一个进程分为这两个部分,用户进程和内核进程不是独立的两个进程的意思,而是进程运行的不同状态。值得注意的是,用户进程不能访问内核虚拟地址空间,内核进程可以访问全部的虚拟地址空间,因此用户进程和内核进程进行数据交换只能通过内核进程从用户地址空间取数据,然后放入用户地址空间
TODO
- 进程和线程的应用场景,哪些场景适合用线程,哪些场景适合用进程
- 创建子进程,Linux的fork为什么比Windows高效?
- 进程栈和线程栈的区别?内核线程又是啥啊
- 内核线程是专门用来跑内核态任务的?为什么每个进程都有一部分内核态,所以每个进程都有内核线程?
- 参考资料5说道每个LWP都和其他的LWP共享资源,说的就是linux中的线程吧,
- 参考资料5提到了pthread是用户级线程,不太懂为什么用户级线程了pthread_create还会调用clone
- 结合用户线程和内核线程的好处,现在很多OS都是用户线程和内核线程的多对多实现是什么?
参考资料
- https://blog.youkuaiyun.com/qq_33883085/article/details/88799947
- https://www.cnblogs.com/lit10050528/p/6258656.html
- https://www.cnblogs.com/zhaoyl/p/3620204.html
- https://www.cnblogs.com/huang-y-x/p/10279506.html
- https://blog.youkuaiyun.com/rock_joker/article/details/72722008
- https://www.cnblogs.com/huang-y-x/p/10279506.html
- https://zhuanlan.zhihu.com/p/83398714内核空间
- https://www.cnblogs.com/alantu2018/p/8526916.html
- https://mp.weixin.qq.com/s/_MWR0tvSXNytm9rX70eLpw这个还有好多要消化
- https://www.cnblogs.com/sky-heaven/p/8204614.html多对多模型等