进程管理
1、 进程
概念
进程就是处于执行的程序。包括可执行程序代码、打开的文件、挂起的信号、
内核数据、处理器状态,内存地址空间、一个或多个线程、全局数据段
线程
是进程中活动的对象。包括独立的程序计数器、进程栈、一组进程寄存器
虚拟机制
虚拟处理器、虚拟内存(后面详细讲解)
进程api
fork()->exec()
进程描述符及任务结构
实践:了解task_struct 结构定义
包括打开的文件,进程地址空间,挂起的信号,进程状态。。。
分配进程描述符
实践:了解thread_info,curent_thread_info()
进程描述符的存放
进程pid最大是 32768,但可以修改/proc/sys/kernel/pid_max
进程状态
TASK_RUNNING,TASK_INTRRUPTIBLE,TASK_UNINTRRUPTIBLE,__TASK_TRACE(例如ptrace),
进程树
init进程是根进程,其它进程都是由此的子树
进程创建
fork() 创建子进程,exec()读取执行文件并载入地址空间运行。
fork() 采用写时拷贝(copy-on-write),需要的时候才拷贝。可以减少拷贝,让父进程和子进程共享一个拷贝
vfork()
同fork()
线程
linux从本质上来说没有线程概念。windows上线程是执行单元,而linux只是进程间共享资源的手段。
创建线程
clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0) ;//地址空间,文件系统资源,文件描述符,信号
同fork()差不多,clone(SIGCHLD,0)
vfork() 是 clone(CLONE_VFORK|CLONE_VM|SIGCHLD,0)
标志位列表
参数标志 | 含义 |
---|---|
CLONE_FILES | 打开的文件 |
CLONE_FS | 文件系统信息 |
CLONE_IDLETASK | pid=0,只供idle进程使用 |
CLONE_NEWNS | 为子进程创建新命名空间 |
CLONE_PARENT | 子与父拥有同一个父进程 |
CLONE_PTRACE | 继续调试子进程 |
CLONE_SETTID | tid写至用户空间 |
CLONE_SETTLS | TLS |
CLONE_SIGHAND | 共享信号 |
CLONE_SYSVSEM | system v |
CLONE_THREAD | 父子进程放入相同的线程组 |
CLONE_VFORK | 父进程准备睡眠等子进程唤醒 |
CLONE_UNTRACED | 防止被CLONE_PTRACE |
CLONE_STOP | 以TASK_STOP开始进程 |
CLONE_SETTLS | 创建新的TLS(线程本地存储) |
CLONE_CHILD_CLEARTID | 清除子进程tid |
CLONE_CHILD_SETTID | 设置子进程tid |
CLONE_PARENT_SETTID | 设置父进程tid |
CLONE_VM | 共享地址空间 |