目录

 1.基础复习

 2. 头文件存放位置

 3.printf

 4.主函数的参数

 5.常识

 6. 内存

 7.程序在内存中的存储 

 8.  地址

 9. 进程空间

10.  程序的划分

11.进程

12.fork---复制进程


1.基础复习

1). Linux 目录结构

/ 根

/boot 存放系统内核及启动相关的文件,类似于windows的C盘

/bin 存放常用的命令(二进制可执行程序)

/lib 存放库文件

/etc 存放系统的配置文件

/home 家目录(所有普通用户的家目录)

/root 存放管理员的家目录

/usr 存放系统应用文档和程序   例如:QQ 微信

/dev 存放我们的设备文件

/proc 存放虚拟文件系统目录,保存进程在内存中的信息

/mnt 临时挂载点

2). 文件类型

普通文件 -

目录文件 d    ==》 windows 的文件夹

管道文件 p

链接文件 i

设备文件 c,d

套接字文件 s

windows上所有能拷贝进Linux的文件(照片,电影,pdf,exe...),都是Linux里的普通文件

 

 3). 权限  chmod

r (读)      w(写)        x(执行)

 4) 命令:

       操作文件:cp,rm,mv,more,less,head,tail,vi/vim

                         mkdir,cat,touch,cd,pwd

       进程:ps (显示运行的程序)     结束进程:kill     

                  & :后台运行进程    jobs:查看后台运行的进程  

                  top:查看系统的运行的进程,cpu利用率等等,类似于windows的任务管理器

 5)如果要直接运行 可执行程序

  则需要把可执行程序移动到 /bin 目录下,系统是从/bin这个目录下开始找二进制的可执行文件

 6) 可执行程序的标准存放路径 --- $PATH

 7)静态库和共享课

静态库:libxx.a

共享库:libxx.so

8)静态库和共享库的区别:

静态库是在编译链接生成可执行程序时,把库里的方法直接放到可执行程序里,作为可执行程序的一部分

共享库:在运行可执行程序时,动态去链接

通过静态库编写的程序,放在任意计算机都可执行

通过静态库编写的程序,只有计算机上存在这些共享库才能被执行

9)可通过命令 ldd 查看可执行程序用到了那些共享库

 

2. 头文件存放位置

3.printf

1).存在 \n时

 

 先打印 hello world 再睡眠3秒钟

2).不在存在\n时

先睡眠3秒再打印 hello world

 3)prntf为什么需要缓冲区?

在屏幕打印出数据时,是把数据交给内核,内核帮助我们去打印,如果没有缓冲区,一直频繁的切换用户态和内核态,让内核去打印,开销太大,效率太低。

4) printf缓冲区的作用

为了避免开销太大,并且提高效率,我们设置缓冲区,用来存储将将要打印的数据。

5)刷新缓冲区

a:缓冲区放满(完全缓冲)

b:缓冲区未满(行缓冲),printf里的\n会强制刷新缓冲区,将此行数据送到内核,也可通过fflush (stdout)强制刷新

c:   程序结束时 

exit      --->    1. 刷新缓冲区

                      2.调用_exit(),退出整个程序

6)缓冲区的大小

一般为0.5k或者4k

4.主函数的参数

1)获取外部信息 char* argv[ ]

 主函数的第一个参数内容是自己的名字, 所以主函数至少会有一个参数内容

 多个参数

 2) 环境变量 char* envp

 从第一个元素开始填充,最后一个元素赋值为NULL

5.常识

 1)冯诺依曼结构计算机---五大组成部分:控制器,运算器,存储器,输入输出设备

2)总线:地址总线,数据总线,控制总线

3)内存由内核(操作系统)进行管理分配

4)操作系统:管理计算机的软硬件资源,为用户提供交互的接口

6. 内存

操作系统在进行内存管理时,会将内存分为若干页进行管理,一页是4k/8k

假设内存为4G,1页为4K,那么可以划分为2^20页

物理内存4G,会被划分为2^20 物理页,把程序加载到内存时,也会把程序进行划分,4k的程序作为1页,存放在物理页中

7.程序在内存中的存储 

程序在内存中并不是连续存储的,物理页的那一页空闲就会被操作系统随机分配用来存储程序,所以为了清楚每一页程序在物理内存中的位置,通过页表来记录每一页程序的编号所对应的物理页的编号,再通过偏移量的计算,就能找到物理页上每个数据的准确位置,便于进行访问或者修改

 8.  地址

调试所用的地址为逻辑地址而不是物理地址

不采用物理地址,是因为我们不清楚那块物理地址所对应的空间是空闲的

使用逻辑地址时,我们不用考虑这些问题,操作系统会给我们分配空闲的物理空间,并且记录相应的逻辑地址和物理地址(页表),因此可以由逻辑地址推算出对应的物理地址(查页表计算偏移量

9. 进程空间

 在32位系统下,物理内存无论多少,进程地址空间都是4G

 每个进程都有自己的进程地址空间,他们的进程地址空间之间没有什么联系,互不干预

10.  程序的划分

 在页表记录时,是从代码段开始的页面开始记录的,所以一定不会从0页开始,上面只是为了方便理解,所以是从0开始的

代码段,数据段,堆,栈,内核,这五部分再进行页面划分时,是不会有任意两个出现在同一个页面的,在设计时,进行了有意的区分,一页未满,但跨入了下一个段时,则会将此页剩余部分浪费掉,在新页进行下一个段的划分

11.进程

操作系统给每个进程创建了一个进程控制块---PCB,对进程进行管理

PCB ---> struct task_struct      Linux上用一个结构体来表示PCB

pid---唯一标识进程

status---表示进程的当前状态(就绪,运行,阻塞)

 

12.fork---复制进程

pid_t fork(void)   头文件 #include <unsitd.h>

 两个进程同时进行

 

Logo

更多推荐