UC 5

来源:互联网 发布:多益网络是否有上市 编辑:程序博客网 时间:2024/04/27 14:11
一、进程映射(续)
代码参见memory.c
用户空间、内核空间
malloc函数分配的空间在堆里。
悬空指针
段错误产生的原因。

代码段、数据段、栈、堆

可重入函数
函数里的所有变量的空间只能分配在栈里,这样的函数就是可重入函数。

二、malloc内存分配
通过代码察看malloc内存分配的缓冲机制。
代码参见  malloc.c

08d5a000-08d7b000
内存映射的时候,单位是块,块的大小为4k。
08d5a-08d7b   21     33块
33*4=132k

内存管理的缓冲机制
malloc 函数调用了系统调用 mmap(2)或者sbrk(2)。
一次malloc最少分配33块内存空间。

补充:
pid  进程的身份证号称作pid。
怎么获取进程自己的pid?使用函数getpid(3)
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
功能:获取进程的id
参数:
void
返回值:
返回调用该函数的进程的id。

三、mmap将物理内存映射MAP_FAILED到进程的虚拟地址
mmap(2)
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot,\
    int flags,int fd, off_t offset);
功能:将文件或设备映射到内存。
参数:
addr:新映射的虚拟地址。
NULL 内核选择映射的虚拟地址

length:指定了内存映射的字节数
prot:
PROT_EXEC  Pages may be executed.
PROT_READ  Pages may be read.
PROT_WRITE Pages may be written.
PROT_NONE  Pages may not be accessed.
flags:
MAP_SHARED  其他的进程共享
MAP_PRIVATE  其他进程不能共享,不能将更新的数据同步到文件

MAP_ANONYMOUS:匿名映射,如果指定了这个参数,fd=-1.只映射物理内存,不映射文件

fd:文件的描述符
offset:文件的偏移量,从文件的什么地方开始映射。
offset必须是页的整数倍。

返回值:
MAP_FAILED   失败  errno被设置
(void *) -1)  失败
成功 返回进程的虚拟地址空间


int munmap(void *addr, size_t length);
功能:解除映射
参数:
addr:mmap(2)的返回值
length:mmap(2)的时候,指定的长度

返回值:
0 成功
-1 失败   errno被设置
举例验证
将一块物理内存映射到进程的虚拟地址空间,进程的虚拟地址有内核选择。
代码参见  mmap.c


补充:
linux操作系统下,一切皆文件
传地址的参数,函数通过这个参数将数据带回到调用函数。这样的参数,称为值_结果参数。
注意:
映射的是内存的块。
只映射了物理内存到虚拟地址空间。没有映射到文件。

四、文件管理
标c   fopen(3)、fclose(3)、fread(3)、fwrite(3)...
都属于库函数
操作文件,使用系统调用来操作文件
open(2)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags,...);

功能:打开一个文件或设备
参数:
pathname:要打开的文件的路径名字
flags:
从三个里选其一,必须的。
O_RDONLY  只读
O_WRONLY  只写
O_RDWR    读写

从以下标记里,可以选择0或多个,按位或操作
文件创建标记
O_CREAT :如果文件不存在,创建这个文件。如果指定了这个标记,mode参数指定了新文件的权限。有效的权限是mode&~umask.
 
O_EXCL:与O_CREAT一起使用的时候,如果这个文件存在,报错。

O_TRUNC:打开文件的时候,文件存在,这个文件以写的方式打开,将这个文件的内容清0.

文件状态标记
O_APPEND  打开文件的时候,将写的位置设置为文件的末尾。


...代表可变参数
返回值:
-1 失败 errno被设置
返回新的文件描述符

补充:
文件描述符?
进程的本质是什么?
进程运行的过程中需要占用资源,对资源的描述构成一个片段。这些片段的切换就构成了动态的进程。

每个进程都有自己的id,pid。
进程有自己的户口本,他的户口本称作PCB(process control block)。
在进程的户口本里记录了进程资源的占用状态。
PCB里记录了这个进程打开文件。通过文件描述符数组记录打开的文件的个数。
文件描述符就是这个数组的下标。

文件的权限?
-rw-rw-r-- 1 tarena tarena  640  1月  4 11:23 malloc.c
第一个字符是文件的类型
-  普通文件
c  字符设备文件
b  块设备文件
d  文件夹文件
s  socket文件
l  软链接文件
p  管道文件

rw-rw-r-- 是文件的权限
r  读
w  写
x  可执行
拥有这个文件的用户称为属主。u
属组  g
其他人 o
所有人 a

改变文件的权限使用chmod命令
chmod  a/u/g/o +/-  r/w/x   文件名

umask?
day05$touch hello
day05$ls -l hello
-rw-rw-r-- 1 tarena tarena 0  1月  4 17:00 hello

x全部拿走。
rw-rw-rw-
day05$umask
0002
-------w-
110110110
111111101
110110100
rw-rw-r--
rw-rw-r--

day05$umask 0033
day05$umask
0033

rw-rw-rw-
110110110

111100100
110100100
rw-r--r--
umask称为权限掩码。就是将umask中出现权限为给屏蔽掉。


小结:
一、进程映射(续)
堆的内容
堆的生命周期整个进程。
二、malloc的缓冲机制
三、使用mmap将物理内存映射到进程的虚拟地址空间里。
四、文件的基本操作
open(2)
文件描述符
文件的权限
umask


close(2)

read(2)
write(2)