一、更新认知
之前的认知
- 进程:一个执行起来的程序。进程 = 内核数据结构 + 代码和数据
- 线程:执行流,执行粒度比进程要更细。是进程内部的一个执行分值
更新认识:
- a. 进程是承担分配系统资源的基本实体
- b. 线程是OS调度的基本单位
二、Linux下线程的概念和实现
线程是进程内部的一个执行分支,说明一个进程就可能有多个线程,这样OS就必须将线程管理起来,Linux系统管理线程会通过先描述,再组织的方式,先将线程描述成一个结构 struct threadctlblock
,再对该结构进行组织,达到对系统内线程的管理组织。
问题:线程结构也是 task_struct
?
实际上,在 Linux系统中,没有真正的 struct threadctlblock
的 TCB 结构,Linux下的线程是用进程模拟实现的!
线程也使用进程的 task_struct
来描述,这样就无需为线程单独创建一套线程的管理机制,毕竟线程和进程过于相像,用进程模拟线程,大大减少了操作系统内核设计的难度,复用了历史代码,增加代码可维护性
减少了许多设计工作,如:线程创建、线程队列链表组织…、线程切换、线程….
Linux 这一点设计是非常厉害巧妙的,因为其他一些操作系统如 windows
是真的有线程的,内核代码和管理复杂不少!不像 Linux 的伪线程
线程共享资源:进程内多线程共用进程资源
一个进程 task_struct
内部还有多个用于描述线程的 task_struct
。
进程 task_struct
和线程 task_struct
同属于一个PCB结构,他们共享同一个进程地址空间,共享进程内的资源。
多个线程共享同一地址空间,因此 Text Segment、Data Segment
都是共享的。如果定义一个函数,在各线程中都可以调用;如果定义一个全局变量,在各线程中都可以访问到。除此之外,各线程还共享以下进程资源和环境:
- 文件描述符表
- 各种信号的处理方式 (SIG_IGN、SIG_DFL或者自定义的信号处理函数)
- 当前工作目录
- 用户 id 和组 id
- ….