前言
操作系统对我来说很抽象的,学了几年,工作中天天打交道,却不懂它。偶然听了极客时间的一门课(这里就不打广告了),很有启发。其实操作系统就好比一个公司:
- 进程管理:可以理解为公司的项目管理
- 内存管理:可以理解为公共资源的管理,比如会议室
- 文件系统:可以理解为项目开发过程中文档的管理
- 输入输出系统:可以理解为售前售后体系
进程和线程
- 进程:相当于一个项目
- 线程:相当于一个项目中一个个的开发任务
就我的工作而言,一块开发板的软件开发(基于Android/Linux)叫一个项目,一个项目的开始我们叫开案。客户会要求我们要有什么什么功能,所以会有各个功能的需求,有些功能彼此之间没有关联性,可以并行执行;有些功能需要从头做到尾。
在Linux内核里,无论是进程,还是线程,都统一叫做Task,由一个task_struct进行管理。
任务管理
上节有说到task_struct结构,它在include/linux/sched.h中定义,很长。
- 任务ID
-
pid:process id -
tpid: thread group id(主线程的pid,如果tpid == pid,说明是主线程)
-
- 任务状态
-
state:通过bitset方式设置-
TASK_RUNNING:进程正在运行 -
TASK_INTERRUPTIBLE:可中断的睡眠状态 -
TASK_UNINTERRUPTIBLE:不可中断的睡眠状态 -
TASK_KILLABLE:可以终止的新睡眠状态
-
-
exit_state: -
flags:
-
- 信号处理
-
blocked:被阻塞暂不处理 -
pending:等待处理 -
sighand:正在通过信号处理函数进行处理
-
- 进程调度
- 运行统计信息
-
utime:用户态消耗的CPU时间 -
stime:内核态消耗的CPU时间 -
nvcsw:自愿(voluntary)上下文切换 -
nivcsw:非自愿(involuntary)上下文切换 -
start_time:进程启动时间,不包含睡眠时间 -
real_start_time:进程启动时间,包含睡眠时间
-
- 进程亲缘关系
-
parent:指向父进程,终止时,必须向父进程发送信号 -
children:表示链表的头部,链表中所有元素都是它的子进程 -
sibling:用户把当前进程插入到兄弟链表中
-
- 进程权限
-
real_cred:谁能操作这个进程 -
cred:这个进程能操作谁
-
- 内存管理
mmactive_mm
- 文件与文件系统
fs-
files