1.进程基础
1.1 PCB进程控制块
1.在 Linux 下,每一个进程都有一个 PCB ,其是一个描述了进程所有详细信息的结构体,比如 pid 、 栈信息 等;
1.2 程序是静态表现(占用物理磁盘空间);进程是该程序运行后的动态表现(占用物理内存空间,具有CPU使用权)。
1.3 进程的简单形态
1.从高地址到低地址分别是: PCB(4G~3G) 、 环境变量/命令行参数(从3G开始) 、 栈 、 静态库/共享库 、 堆 、 BSS 、 DATA 、 TEXT(代码段) ; 2.4G~3G 称为 Kernel 层,用户不可使用; 3G~1G 称为 User 层; 3.上述的形态是一个进程的虚拟内存空间,每一个进程都会被分配 0~4G 的虚拟内存空间,物理内存有限,根据实际硬件决定大小; 4.上述的 BBS DATA 中保存的是已初始化和未初始化的全局变量/静态变量;
1.4 虚拟内存与物理内存的关系
1.一般来说,物理内存可以映射到虚拟内存; 2.每一个进程都需要找不同的物理内存作映射;
1.5 虚拟内存是由虚拟内存映射表进行管理的
虚拟内存映射表中记录了庞大繁杂的映射关系,是由内存管理器进行管理的。
1.6 所有进程的内核空间共享同一块物理内存,用户空间独立。
1.7 虚拟内存的拟定与分配
1.内存的基本单位: 页(page), 1页=4096Bytes(4k); 2.系统中有一种方式称为内存间接寻址,一共三级间接寻址: 1024 x 1024 x 1024 ,三级间接寻址只能寻 G级 单位;
1.8 操作系统的位数
1.x86 : 32位操作系统,最大处理单位 4字节 ; 2.x64 : 64位操作系统,最大处理单位 8字节 ; 3.64位操作系统能够开启 四级间接寻址 ,最高能够寻 T级 单位;
1.9 内存的权限
1.PORT_WRITE :只写; 2.PORT_READ :只读; 3.PORT_EXEC :执行; 4.PORT_NONE :无;
1.10 判断下列哪种方式更好
现有两种申请空间的方式: 1)malloc(3192) malloc(5000);2)malloc(8192); 分析:第一种需要进行两次申请,由于申请需要与CPU进行交互,但是与CPU交互越少,则越好,因此我们认为直接申请两页的方式比分开申请两页的方式好。
1.11 进程的状态
1.就绪态:等待分配资源与调度;能够向 运行态 终止态 转换;但是不能直接转换到 挂起态; 2.运行态:使用CPU与内存资源;能够向 就绪态 挂起态 终止态; 3.挂起/睡眠态:主动挂机阻塞;能够向 就绪态 终止态 转换,但是不能直接转到 运行态; 4.终止态:任意形态都可转换到终止态,但终止态没有办法向其他状态转换;
1.12 分时复用原则
1.为了让有限的系统核心资源CPU被合理利用,使得少量的资源应用最大化,系统通过分时复用原则管理进程对CPU的使用权; 2.分时复用就是指将CPU的使用权分配切片给若干个进程,一般情况下一个时间片就能够满足当前进程的所有运行需求; 3.分时复用除了时间管理之外,还有个很重要的功能:存储与恢复,用来保存进程的运行状态; 4.一个 Inter单核CPU 具有 运算器 、 控制器 、 寄存器 、 译码器 等,当一个时间片耗尽时,需要保存处理器现场,将当前处理器状态保存到 PCB 的内核栈中,当再来一个时间片给当前进程使用时,再将处理器状态恢复;
1.13 系统调用
1.系统调用是指用户在调用了某个用户层API之后,用户层API自动调用系统层API,系统层API再调用驱动层API,进而完成用户层意图完成的功能的事情; 2.在上述过程中,系统层API及驱动层API是用户无法调用的,但用户可以通过用户层API的调用来让系统调用下层的API来实现功能; 3.系统调用的实质:用户层和内核层的相互切换;
1.14 umask掩码
这个掩码是Linux下创建一个新文件的权限的设置,默认是 0002 ,默认创建的新文件的权限是 0666 ,0666 与 0002 进行按位异或,即可得到新文件的权限。
1.15 env 查看环境变量
1.在终端中输入 env 并按下回车键,我们能够看到当前系统中的环境变量;
1.16 ulimut 命令
用来限制进程对资源的使用情况的,它支持各种类型的限制;
1.17 自己完成 env 命令
1.有个外部变量 environ ,这个变量是二级char指针类型,其中装的就是各个环境变量的字符串;
#include <stdio.h>
int main ( )
{
extern char * * environ;
for ( int i= 0 ; environ[ i] != NULL ; i++ )
printf ( "%s\n" , environ[ i] ) ;
return 0 ;
}
1.18 与环境变量相关的函数
1.getenv,用来获得某个环境变量的字符串;参数为要查找的环境变量的变量名,是一个char *类型的;
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
printf ( "PWD = %s\n" , getenv ( "PWD" ) ) ;
return 0 ;
}
2.修改环境变量函数: setenv ;第一个参数为要修改的环境变量,char *类型;第二个参数是要修改的值,char *类型;第三个参数是是否要覆盖之前变量的标记,非零则覆盖之前的变量,为0则不覆盖之前的变量(修改环境变量失败);
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
printf ( "PWD before = %s\n" , getenv ( "PWD" ) ) ;
setenv ( "PWD" , "adsfasdf" , 0 ) ;
printf ( "PWD after 0 = %s\n" , getenv ( "PWD" ) ) ;
setenv ( "PWD" , "adsfasdf" , 1 ) ;
printf ( "PWD after 1 = %s\n" , getenv ( "PWD" ) ) ;
return 0 ;
}
3.删除环境变量函数: unsetenv ;参数是要删除的环境变量的名字,char *类型;
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
printf ( "PWD before = %s\n" , unsetenv ( "PWD" ) ) ;
unsetenv ( "PWD" ) ;
printf ( "PWD after = %s\n" , unsetenv ( "PWD" ) ) ;
return 0 ;
}