标签:org 水平 多线程 返回 shel prepare write def span
fork
进程四个要素:
1. task_struct
2. 可执行的代码
3. 独立的地址空间
4. 独立的堆栈
内存复制与COW copy-on-write
fork之后两个进程共用同一内存
COW基于页而不基于段(进程)
fork与多线程
线程:调用fork的线程外,其他线程在子进程中“蒸发”了
锁:锁的实现在用户态,父进程的所有锁都会被复制(子进程可以lock已经在父进程中被lock的锁)
FD_CLOEXEC
fork出的子进程执行exec之前就不能读写父进程中已打开的文件
pthread_atfork
prepare 处理函数由父进程在fork创建子进程前调用
parent 处理函数是在fork创建了子进程以后,但在fork返回之前在父进程环境中调用的
child 处理函数在fork返回之前在子进程环境中调用
https://blog.csdn.net/yangbodong22011/article/details/78648419
exec函数族
exec函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样
常与vfork混合使用
wait函数族
http://man7.org/linux/man-pages/man2/waitid.2.html
孤儿进程与僵尸进程
孤儿进程:父进程先结束,init收养子进程,并释放其资源
僵尸进程:子进程先结束,且父进程未收集其状态(子进程运行时才可能被收养,僵尸进程无法转化为孤儿进程)
僵尸进程解决方案:
1. fork两次,将僵尸进程转化为孤儿进程
2. 忽略SIGCLD(子进程状态改变时产生此信号)
task_struct thread_info 内核栈
内核栈:内核态中,进程使用内核空间中的栈,而不是原用户空间中的栈
task_struct:描述进程的内核栈
thread_info:记录部分进程信息,保存了进程描述符中需要频繁访问和快速访问的字段
https://blog.csdn.net/tiankong_/article/details/75647488
O_NONBLOCK
read调用阻塞,即进程暂停执行,一直等到有数据来到为止
write调用阻塞,直到有进程读走数据
硬链接、软链接
硬链接是一个指向i-node的路径
软链接是一个文件,文件内容为另一个文件路径
select、poll、epoll
epoll是Linux所特有,而select则应该是POSIX所规定
select:
单个进程所打开的FD是有一定限制的,它由FD_SETSIZE设置,默认值是1024
对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低
需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
poll:
本质上和select没有区别
没有最大连接数的限制,原因是它是基于链表来存储的
epoll:
没有最大并发连接的限制
效率提升,不是轮询的方式,不会随着FD数目的增加效率下降
内存拷贝,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次
水平触发、边缘触发
水平触发:如果没有把数据一次性全部读写完,epoll_wait()会一直通知你
边缘触发:对比于水平触发,epoll_wait()不会一直通知你
select(),poll()模型都是水平触发模式,信号驱动IO是边缘触发模式,epoll()模型即支持水平触发,也支持边缘触发,默认是水平触发
https://www.jianshu.com/p/dfd940e7fca2
https://www.cnblogs.com/creazylinux/p/7364685.html
http://www.cnblogs.com/yuuyuu/p/5103744.html
内建命令与外部命令
内建命令:由Shell本身所执行的命令
外部命令:由Shell副本(新的进程)所执行的命令
mmap
https://www.cnblogs.com/huxiao-tee/p/4660352.html#undefined
简化文件读写的操作,提高性能
多进程共享文件
https://www.cnblogs.com/huxiao-tee/p/4660352.html
ptrace
提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像(包括寄存器)的值
所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED
父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行
实现:
strace 跟踪程所执行的系统调用
gdb 程序调试器
标签:org 水平 多线程 返回 shel prepare write def span
原文地址:https://www.cnblogs.com/shaellancelot/p/9021869.html