Linux进程(一):初识
2020-08-10 21:26
295 查看
Linux进程(一):初识
前言
说到进程,我们都会说出进程时操作系统资源分配最小单位、每个进程有独立的代码和数据空间等类似的套话,所以说了那么多之后,进程在Linux系统中究竟是什么样的存在呢?提到这个问题,就不得不说PCB。
进程控制块 - PCB
进程,是操作系统的资源分配单位,我们需要弄懂进程,就需要弄懂这个进程的资源。而操作系统如何获取一个进程的相关信息呢?
在Linux系统中,进程控制块为一个结构体
task_struct所定义的数据结构。
task_struct位于
/include/linux/sched.h中,其中包括了管理进程所需的各种信息。既然进程中主要是操作系统分配的资源,那么在PCB中理所当然应该有以下这些东西:
进程pid:用于区别进程
有两个相关的参数:
pid_t pid;
:进程的唯一标识pid_t tgid;
: 线程组的领头线程的pid成员的值
注:在Linux中pid的数量时有限的。
进程内存的资源
struct mm_struct *mm:关于进程内存的描述,用来描述进程的内存资源。
文件系统资源
struct fs_struct *fs:关于进程的文件系统资源。
fs_struct中又有
root、
pwd信息,用来描述当前进程的根目录以及当前工作路径。
文件资源(打开的文件信息)
struct files_struct *files:进程在运行过程中打开的文件以及文件的
fd。
所以理所应当,
file_struct结构体中存在一个
fd_array用来描述打开的
fd的数组。
除了上述的信息,还有以下东西也是一个进程必须的:
- 进程切换时需要保存和恢复的一些CPU寄存器
- 描述虚拟地址空间的信息(虚拟地址与物理地址的对应关系)
- 描述控制终端的信息
- 当前工作目录
umask
掩码(保护文件创建和修改的权限)- 和信号相关的信息
- 用户id和组id
- 会话和进程组
- 进程可以使用的资源上限(例如使用
ulimit -a
查看) - 用来恢复的一些CPU寄存器
task_struct的管理
Linux中定义了一个链表方便对进程的遍历,但是链表只能存储每个
task_struct的数据,不能保存各个
task_struct中间的关系,由于线程与线程直接会存在父子的关系,所以Linux中使用的是树来管理所有的
task_struct结构体。树这种数据结构管理父子关系存在天然的优势。在Linux中使用
pstree可以查看所有进程的关系树:
除了记录父子进程之间的管理,Linux操作系统对于进程来说还需要一项功能:通过进程的
pid号快速查找到相应的进程(
task_struct),以便对相应的进程执行特定的操作。此处Linux操作系统通过hash表实现通过
pid号对相应
task_struct的快速查找。
Linux里用三个不同的数据结构存储进程的结构体,使得关于进程的访问在各种场景下都能达到最优。
相关文章推荐
- Linux进程初识
- linux进程初识
- 13_Linux基础知识及命令――――初识用户、权限和进程
- linux系统清理僵尸进程记录
- Linux多任务编程(一)---任务、进程、线程
- linux进程调度详解(一)
- Linux ssh exit,启动的后台进程不会停止
- 在linux进程中的信号屏蔽
- VMware对挂起linux快照文件的进程分析
- Linux内存管理 —— 进程的虚拟地址空间和VSS
- linux 进程通信之 信号
- 【Linux】【Some】Linux 进程基础
- linux 0号进程 1号进程 区别
- Linux 多进程编程
- linux系统进程的查看与控制
- linux内存管理(二)——进程的内存分布
- Linux系统学习(进程)——1.进程的创建
- qt 监听linux下进程的CPU使用率和内存使用率
- Linux下如何知道文件被那个进程写
- Linux 线程信号量,进程信号量和内核驱动程序信号量(线程同步信号量,进程同步信号量和设备驱动同步信号量)