操作系统与进程
- 操作系统
- 进程
操作系统
上一篇博客中介绍了操作系统到底层硬件它们之间的一个关系,那么还是这张图
操作系统到用户它们之间的关系又是如何的呢?
又回到了最根本的问题上:为什么要有操作系统呢?
1、向下管理好软硬件资源(手段)
2、向上提供一个良好的运行环境(目的)
因为用户不能直接访问操作系统,因为可能会对数据造成一些影响,所以就由操作系统来提供一层系统的调用接口,然后再把系统调用接口封装一层让用户通过库或者一些指令来 调用
,那为什么又要封装一层呢?
我们知道printf这个函数吧,它既可以直接在windows的vs中运行又可以在linux中运行,是为什么呢?答案是:这个库函数是封装了不同系统的调用接口来实现的,所以我们并不需要说明我们在windows/linux平台就可以使用,因为它本身就封装好了对应的系统调用接口,那么这些语言的跨平台性相信大家也就能理解了。
系统调用和库函数概念
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分 由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统
调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
下面我们来简单谈一谈进程:
进程
我们所了解到的进程是什么呢?很多地方定义进程:加载到内存中的程序/正在运行中的程序。
其实并不正确。
事实上:我们可以启动多个程序&&操作系统要管理多个加载到内存中的程序&&操作系统管理程序的方式
从这三个问题来谈:操作系统要管理如此之多的从硬盘加载到内存中的程序,如何实现的呢?还是:先描述再组织
那么如何来描述这些进程呢?
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。称为PCB(Process Control Block)进程控制块。在Linux中是用task_struct。
它里面包含着:
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息。
当这些程序加载到内存的时候,操作系统就会生成一个PCB对象里面包含上述对应程序的基本信息,除此之外还包含一个next指针,画一个图来看就是这样的:
每个PCB对应它的程序,并且这些PCB通过next指针链接起来,从此之后操作系统的所有决策都是对PCB的,通过PCB里面的一系列存放的内容找到对应的程序,和程序本身无关。
所以什么是进程呢?进程=内核中PCB对象+可执行程序=内核数据结构+可执行程序
事实上PCB就是一个数据结构。
OK,了解了什么是进程后我们在Linux中来查看一下进程呢,
输入ps ajx
这个指令可以看到左边的两列PPID PID分别是父进程的id和子进程的id,每一个进程都有一个id用来进行区分,每一个普通的进程一般都有父进程,这个之后再谈。
并且我们还可以通过代码看到
每一次启动这个程序,子进程id是会改变的而父进程不会改变。
——————————————————————————————————————————————————————
以上就是关于操作系统的补充以及进程的简单介绍,如有错误,欢迎指正,谢谢大家!