准备
博主:大大怪先森(记得关注哦!)
编程环境:xshell(点击下载)
所示代码:码源
提示:写完文章后,目录可以自动生成
文章目录
前言
本文将讲解操作系统中进程概念的基本知识!!!
提示:以下是本篇文章正文内容
一、冯诺依曼体系
我们现在使用的笔记本,不常见的计算机,大部分的服务器都是遵循冯诺依曼体系!!
截止目前为止我们的计算机都是有硬件组成,基本都是按照冯诺依曼体系:
输入设备:包括键盘, 鼠标,扫描仪, 写板等。
输出设备:显示器,磁盘,显卡,音响等。
存储器:含有运算器和控制器等(里面含有很多的寄存器和高速缓存)。
运算器和控制器(cpu):含有运算器和控制器。
二、操作系统
1.基本概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库, shell程序等等)
2.定位
在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件
简单来说:os就是一门专门用来软硬件资源进行管理工作的软件。
对上:给用户啊提供安全,高效,稳定的运行环境。
对下:管理好各种软硬件
3.如何管理?
先描述,再管理
1.描述起来,用struct结构体
2. 组织起来,用链表或其他高效的数据结构
三.进程
3.1进程的基本概念
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体
3.2描述进程-PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct
3.2.1task_struct-PCB的一种
在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
3.2.2task_struct的内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程
- 状态: 任务状态,退出代码,退出信号等
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址.
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据.
- I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表.
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等.
- 其他信息.
3.3组织和查看进程
可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
ls /proc/ (查看进程)
3.4获取进程标识符
- 进程id(PID)
- 父进程id(PPID)
3.5fork初识
- fork有两个返回值(成功:给父进程返回子进程的pid,给子进程返回0失败:返回小于0)
- 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
3.6进程的状态
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)
R (running):运行状态 S (sleeping),D (disk sleep):挂起状态(浅度睡眠和深度睡眠) T (stopped):暂停状态 X (dead):死亡状态(回收进程资源 = 进程块 + 代码,数据) Z (zombie):僵尸状态
3.6.1僵尸进程
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
3.6.2孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程领养,当然要有init进程回收喽。
3.7进程优先级
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
3.7.1查看进程
在linux操作系统下,使用ps -al 查看进程
说明:
UID:代表执行者的身份
PID:代表这个进程的代号
PPID:代表进程由那个进程衍生出来的,即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行(默认值是80)
NI :代表这个进程的nice值(取值范围为-20~19)
计算公式:PRI(新) = PRI(旧) + NI;
更改进程的nice值:top进入top后按“r”–>输入进程PID–>输入nice值
3.8环境变量
- 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
和环境变量相关的命令:
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
3.8.1测试PATH
echo: 显示某个环境变量值
export: 设置一个新的环境变量,但是一定要注意只是修改本次环境变量退出操作系统,下次的环境变量不能被更改,如果需要永久的更改需要打开 ~/bashrc永久的更改环境变量。
3.8.2测试HOME和设置环境变量
echo $HOME:查看当前用户的指定工作路径
设计环境变量:
3.8.3获取环境变量
命令行第三个参数
1 #include<unistd.h>
2 #include<stdio.h>
4 int main(int agrc,char* argc,char* env[])
5 {
6 for(int i = 0;env[i];i++)
7 {
9 printf("%s\n",env[i]);
10 }
19 return 0;
20 }
通过第三方变量environ获取
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}
getenv函数获取
结语
希望本篇文章能给各位带来帮助,如有不足还请指正!!!
码字不易,各位大大给个收藏点赞吧!!!