进程—— 所有的进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
PCB(process control block),进程控制块,是一个数据结构描述,它是对系统的进程进行管理的重要依据,和进程管理相关的操作无一不用到PCB中的内容。一般情况下,PCB中包含以下内容:
(1)进程标识符(内部,外部)
(2)处理机的信息(通用寄存器,指令计数器,PSW,用户的栈指针)。
(3)进程调度信息(进程状态,进程的优先级,进程调度所需的其它信息,事件)
(4)进程控制信息(程序的数据的地址,资源清单,进程同步和通信机制,链接指针)
PCB是为了管理进程设置的一个数据结构。是系统感知进程存在的唯一标志。
通常包含如以下的信息:
(1)进程标识符(唯一)
(2)进程当前状态,通常同一状态的进程会被放到同一个队列;
(3)进程的程序和数据地址
(4)进程资源清单。列出所拥有的除CPU以外的资源记录。
(5)进程优先级。反应进程的紧迫程度
(6)CPU现场保护区。记录中断时的CPU状态
(7)进程队列的PCB的链接字。
(8)进程相关的其他信息。记账用的,如占用CPU多长时间等。
进程控制块
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的
进程控制块是task_struct结构体。现在我们全面了解⼀一下其中都有哪些信息。
在Linux中,这个结构叫做task_struct。
task_struct
task_struct是Linux内核的⼀一种数据结构,它会被装载到RAM⾥里并且包含着进程的信息。
每个进程都把它的信息放在 task_struct 这个数据结构⾥里,task_struct 包含了这些内容:
标示示符 : 描述本进程的唯⼀一标⽰示符,⽤用来区别其他进程。
状态 :任务状态,退出代码,退出信号等。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执⾏行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使⽤用的⽂文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
保存进程信息的数据结构叫做 task_struct,并且可以在 include/linux/sched.h ⾥里找到它。
所有运⾏行在系统⾥里的进程都以 task_struct 链表的形式存在内核⾥里。
进程的信息可以通过 /proc 系统⽂文件夹查看。要获取PID为400的进程信息,你需要查看 /
proc/400 这个⽂文件夹。大i多数进程信息同样可以使⽤用top和ps这些⽤用户级⼯工具来获取。
文件描述符fd(file descriptor)
内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的非负整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。