一、学习准备:对操作系统工作模式的理解
首先我们要清楚的是,操作系统是一个进行软硬件资源管理的软件。操作系统对下要管理好底层硬件。每一个硬件的生产产商都会给他们的产品提供对应的驱动程序,驱动程序是特定于某一硬件或系统设备的软件组件,它为系统提供管理硬件的各种功能。当软件需要实现某些功能,而这些功能无法通过应用程序单独实现或难以实现时,驱动程序就能派上用场。操作系统通过驱动程序对底层的硬件进行管理。
对上要给用户提供良好的使用体验,用户所进行的任何操作都不能越过操作系统。在任何一门语言中,如果一个函数运行的结果会影响到硬件,比如说printf打印数据到显示屏上,scanf从键盘中读取数据,那这个函数底层一定会封装系统调用函数。系统调用函数即保证了操作系统中数据的安全性,又方便了用户操作。
那为什么我们好像很少见到系统调用接口呢?原因是如果我们要使用系统调用接口的话,我们本身就应该对操作系统有一定的认知和了解,所以有人就对系统调用接口进行了封装,形成了库(例如C标准库),方便使用者直接使用库函数就可以达到使用系统调用接口同样的使用效果。进一步的说,正是对系统调用函数进行了封装,才使诸如C语言,C++等各种编程语言具有了跨平台性,我上层同样都是调用printf函数,在linux操作系统下我就去调用linux下的系统调用函数(封装在C标准库),在Windows操作系统下我就去调用Windows下的系统调用函数(封装在C标准库),这样我即使不了解操作系统,只通过上层的语言也可以和操作系统进行交互,不同操作系统的差异已经在封装这一层被屏蔽掉了,这就是我们所说的语言的跨平台性。下面是计算机的层状结构图:
二、进程的理解
可执行程序被加载到内存,加载的是程序的代码和数据,可是操作系统并不认识哪些代码和数据对应哪些进程。所以,操作系统在加载可执行程序形成进程的同时,会创建一个描述该进程的结构体,称为PCB(process control block,进程控制块),linux操作系统下称之为task_struct。操作系统通过PCB中的各种属性信息(状态,优先级,内存指针字段,标识符......),就能够了解到这个进程的属性信息,进而控制进程的运行。此后,操作系统对于进程的管理,就转换成了对于PCB链表的增删查改。进一步的,我们可以了解到, 进程就等于内核数据结构加可执行程序**。未来,所有对进程的操作和控制,都只和进程的PCB有关,和进程的可执行程序没有关系。**
PCB的大致属性信息
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。 (扩展:CPU 有pc指针,pc指针存放的是当前执行指令的下一条指令的地址,pc指针指向那个进程的代码,哪个进程就被调度执行。当进程被切换出去(例如,由于时间片用完或发生中断)时,其当前的PC指针值会被保存到对应PCB的程序计数器中。当进程再次被调度执行时,操作系统会从这个程序计数器中恢复PC指针的值,从而确保进程可以从之前中断的地方继续执行。程序计数器是进程上下文切换的关键部分,它使得多个进程可以共享同一个CPU,而每个进程看起来都像是在独占CPU上执行。)
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据: 进程执行时处理器的寄存器中的数据。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息......
三、查看进程
ps axj:在Linux系统中用于查看关于进程的更多信息
其中pid就是进程对应的标识符,ppid就是进程的父进程对应的标识符
ps ajx | head -1 && ps ajx | grep 关键字:查看和包含关键字的进程的信息
ps ajx | head -1就是把ps ajx内容的第一行取出来,&&是合并的意思,ps ajx | grep 关键字查看和包含关键字的进程的信息。
以上就是包含了myprocess关键字的进程的信息,第一个就是我刚刚运行起来的myprocess可执行程序,那有人就会问了,那这里的第二个进程又是什么呢?grep本身在进行信息提取的时候,它的提取关键字是包含了myprocess的,在grep提取信息的时候它自己也要变成进程,所以grep进程本身也被显示出来了。通过这里我们也可以知道, 几乎所有的独立的指令,就是程序,运行起来也要变成进程。
while :; do ps ajx | head -1 && ps ajx | grep 关键字 | grep -v grep; sleep 1; done
这一串指令可以对含有关键字的进程进行实时的监控。 grep -v grep是把上面的grep对应的进程过滤掉的意思。