1.程序和进程
程序是指编译好的二进制文件,在磁盘上不占用系统资源(cpu、内存、打开的文件、设备、锁...)
进程是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)。
程序仅仅只是一堆代码,进程指的是程序运行的过程。
程序和进程的区别:
1>进程是动态的,程序是静态的;
2>进程有一定的生命周期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为一个独立单位得到操作系统的认可。
3>一个程序可以对应多个进程,但一个进程只能对应一个程序。
4>进程和程序的组成不同。从静态角度看,进程由程序、数据和进程控制块三部分组成,而进程是一组有序的指令集合。
2.并发
在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之前的状态。但任一个时刻点上仍只有一个进程在运行。
单道程序设计
所有进程一个一个排对执行。若A阻塞,B只能等待,即使CPU处于空闲状态。而在人机交互时阻塞的出现是必然的。所以这种模型在系统资源利用上及其不合理,在计算机发展历史上存在不久,大部分便被淘汰了。
多道程序设计
在计算机内存中同时存放几道相互独立的程序,他们在管理程序控制下,相互穿插的运行。多道程序设计必须有硬件基础作为保证。
在多道程序设计模型中,多个进程轮流使用CPU(分时复用CPU资源)。而当下常见的CPU为纳秒级,1秒可以执行大约10亿条指令。由于人眼的反应速度是毫秒级,所以看似同时在运行。
1s=1000ms,1ms=1000us,1us=1000ms
3.虚拟内存与物理内存映射关系
虚拟储存器的容量限制:主存容量+辅存(硬盘)容量
物理内存:在应用中,真实存在的,插在主板内存槽上的内存的容量的大小。从本质上说,物理内存是代码和数据在其中运行的窗口。
虚拟内存:使程序认为他拥有连续的可用的内存(一个连续完整的地址空间),实际上他通常是被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要是进行数据交换。
MMU的一个page是4KB,MMU以4KB为单位进行映射空间。
两个程序即使虚拟地址相同,MMU也会将物理空间进行分开映射。
4.进程控制块PCB
1.进程id:系统中每个进程有唯一的id。在C语言中用pid_t类型表示,其实pid是一个非负整数。
2.进程的状态:有初始态、就绪态、运行态、挂起态、停止态等状态。
3.进程切换时需要保存和恢复的一些CPU寄存器。
4.描述虚拟地址空间的信息。
5.描述控制终端的信息。
6.当前工作目录
7.umask掩码
8.文件描述符表,包含很多指向file结构体的指针。
9.信号相关的信息
10.用户id和组id。
11.会话和进程组
12.进程可以使用的字眼上限
5.进程状态模型
引起进程状态转换的具体原因:
就绪状态 ——当前进程已分配到除CPU以外的所有必要的资源后,只能在获得处理机便可以及执行,这时的状态称为就绪状态。同时处于就绪状态的多个进程排成就绪队列。
执行状态——指进程已获得处理机,其程序正在执行。
阻塞状态——进程因发生某种时间而暂停执行时的状态,进程的执行受到阻塞,顾称这种状态为阻塞状态。
创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处的状态为创建状态。
就绪状态:进程已经准备好,分配到所需资源,只要分配到CPU就能够立即运行。
执行状态:进程处于就绪状态被调度后,进程进入执行状态。
阻塞状态:正在执行的进程由于某些事件而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用。
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法执行。
5.环境变量
是指在操作系统中用来指定操作系统运行环境的一些参数。通常具备以下特征:
1.字符串(本质)2、有统一的格式:名=值[:值] 3.值用来描述进程环境信息
存储形式:与命令行参数类似
使用形式:与命令行参数类似
加载位置:与命令行参数类似。位于用户区,高于stack的起始位置
引入环境变量表:需声明环境变量。
常见的环境变量
PATH:可执行文件的搜索路径
SHELL:当前shell,它的值通常是/bin/bash.
echo $SHELL
TERM:当前终端类型。在图形界面终端下它的值通常是xterm,终端类型决定了一些程序的输出显示方式。
echo $TERM
LANG:变量定义了linux系统的主语系环境
HOME:当前用户主目录的路径
命令:env -------查看所有环境变量的值。
6.进程的介绍和创建
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进程资源分配和调度的基本单位,是操作系统结构的基础。
fork函数通过系统调用创建一个与原来进程几乎完全相同的进程。
进程创建后,系统给新创建的子进程分配资源。可以通过进程号pid来区分父进程和子进程。父进程返回的是子进程的pid,子进程返回的是0.
四个函数:
getpid() 获取当前进程ID,
getppid()获取当前进程的父进程ID,
getuid()获取当前进程实际用户ID;
getgid()获取当前进程使用用户组ID
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
printf("hello world\n");
printf("hello world\n");
printf("hello world\n");
printf("hello world\n");
pid_t pid;
pid=fork();
if(pid == -1)
{
perror("fork error\n");
}
else if(pid == 0)
{
printf("hello subzi progress getpid=%d,getpid=%d\n",getpid(),getppid());
}
else
{
printf("hello numfu progress getpid=%d\n",getpid());
}
printf("beybey!!\n");
return 0;
}