作者主页:进击的1++
专栏链接:【1++的Linux】
如图所示,就是冯诺依曼体系结构,它由输入输出设备;存储器;中央处理器组成。
其中,我们常见的输入设备有:键盘,鼠标,扫描仪,网卡等。
常见的输出设备有:显示器,网卡。中央处理器(CPU):包括运算器:算数运算,逻辑运算;控制器:控制协调。
**要注意的是:**CPU读取数据都要到内存中去读,站在数据角度,CPU不和输入设备直接打交道。对于要输出数据,也是得通过内存,因此也可以认为,外设只和内存打交道。总结就是,程序要运行,必须被加载到内存中,所有设备都直接和内存打交道。
对于不同存储设备的读取速度,我们也做如下总结:
CPU&&寄存器>内存>磁盘>光盘>磁带。
什么叫进程呢?
正在执行的程序或者可以说是担当分配系统资源的实体。
在第一小节我们说过,操作系统进行管理的手段是:先描述后组织。对于进程的管理也是这样的,先对进程进行描述,然后将其信息放在一个叫做进程控制模块的数据结构中。我们称之为PCB,在Linux中,叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到内存里并且包含着进程的信息。
所有运行在系统里的进程都以task_struct链表的形式存在内核里。
task_struct中有什么?
除了操作系统创建的第一个进程外,所有进程都有其父进程。不一定有子进程。下面来讲一讲如何创建一个进程。
在创建进程前我们先来学习如何查看进程。
命令ps -选项 就能够查看进程,具体如下。
“-j” 选项表示以详细的格式显示进程信息
“-a” 选项表示显示所有用户的进程
“-x” 选项表示显示没有控制终端的进程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的进程
演示如下:
接下来我们对这段命令进行剖析:ps aux | head -1 是将其头部份显式出来;&&是与的意思,只有第一条命令执行完了,才能执行第二条命令;ps aux | grep test3是将test3中的所有进程显式出来;grep -v grep由于grep命令本身在执行时也是进程,所以这段命令是不限grep进程。
讲了如何查看进程,接下来我们学习如何创建进程。
通过系统调用函数fork()来创建进程。
和我们平常所认识到的不一样的是,fork()有两个返回值,其代码是父子共享的,但其会各自开辟空间。
先演示,用结果说话!
或许大家会有疑问,为什么会有两个返回值?
在fork()后,会产生两个执行流,并且这两个执行流的执行先后顺序是不确定的,谁先才运行队列就谁先执行。因此看似有两个返回值,其实是同一份代码,被执行了两次,并且返回值不同罢了。
这时操作系统就会讲这个新产生的task_struct链接到其链表中。因此,我们可以推出,进程的调度就成了在task_struct链表中选择一个进程。