Linux中的进程,线程的实现原理
参考文章:
Linux 进程、线程、文件描述符的底层原理
linux 输入、输出重定向的概念和用法详解
程序需要先被编程成可执行文件,再将可执行文件加载进内存,OS为其分配完资源,才变为真正的进程。
在Linux中,进程/线程就是一个数据结构:
struct task_struct {
// 进程状态
long state;
// 虚拟内存结构体
struct mm_struct *mm;
// 进程号
pid_t pid;
// 指向父进程的指针
struct task_struct *parent;
// 子进程列表
struct list_head children;
// 存放文件系统信息的指针
struct fs_struct *fs;
// 一个数组,包含该进程打开的文件指针
struct files_struct *files;
};
其中比较重要的有:
struct mm_struct *mm;
struct files_struct *files;
进程与线程的构造
在Linux中,进程和线程在构造上没有太大差别。
不同进程间,不会共享同一块内存。同一进程的不同线程会共享同一块内存。
线程与进程都用task_struct表示,只是共享的数据区域不同(同一线程共享同一块内存,不同进程间不共享同一内存)
在Linux系统中,将线程看做共享数据的进程。
具体图示参考:Linux 进程、线程、文件描述符的底层原理 。
文件描述符
struct files_struct *files 是一个 文件指针数组
一般,进程会从files[0]读取输入,将输出写入files[1],错误信息写入files[2]
文件描述符指得就是files[i]数组的下标
一般:
files[0]–> 标准输入流(键盘)
files[1]–> 标准输出流(显示器)
files[2]–> 标准错误流(显示器)
如果希望进程读取一个文件的内容,就通过内核把文件打开。将指向文件的指针放入files数组中。
输入重定向:不通过标准输入流设备输入,而是用指定文件做输入设备(从文件读数据做输入)
原理:程序读数据时去files[0]中读取,只需将files[0]指向一个文件,程序就会从文件中读取。
输出重定向:不输出到标准输入流设备,而是用指定文件做输出设备(将数据写入文件)
原理:程序输入时会输出到files[1]绑定的设备,只需将files[1]指向一个文件即可。