Linux中的进程,线程的实现原理与文件描述符

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]指向一个文件即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值