Linux学习笔记2--文件描述符 进程替换

fork 复制进程

PCB: 进程控制块(进程描述符) 结构体为 struct task_struct;

当前进程执行一个fork时,会申请一个新的pid,再复制一份PCB给子进程,此时子进程的PCB大部分与父进程相同,会有一个新的pid,接着会复制进程实体(包含进程在内存中的空间)

写时拷贝: 父子进程共享页面, 在页面需要被修改前,在进行页面的复制(为了提升fork复制的效率)

僵死进程:父子进程并发运行的过程中,子进程先结束,父进程没有获取子进程的退出码,子进程就变成了 僵死进程


linux内核对文件操作的系统调用 open read write close

c操作文件的库函数: fopen fread fwrite fclose

  • man 1 命令 2 系统调用 3 库函数

在编写os时就已经实现了open read...系统调用实现在内核中,当要执行这些命令时,意味着要执行内核的代码,要从用户空间切换到内核空间(陷入内核/切换到内核态)

执行fopen(库函数)时会调用open(系统调用)

  • open

  • 存在(打开) 文件名 读写

  • 不存在(创建并打开) 文件名 读写 权限

  • write(fd,"数据",数据长度)

  • close(fd)


  • 父进程打开的文件,fork后,子进程也可以访问,并且共享文件偏移量

先打开文件 后fork 父子进程共享偏移量

先fork 后打开文件 父子进程不共享偏移量

int fd = open("a.txt",O_RDONLY); // abcd
    if(fd == -1){
        printf("open err \n");
        exit(1);
    }
    pid_t pid = fork();
    if(pid == -1){
        printf("fork err n");
        exit(1);
    }
    // int fd = open("a.txt",O_RDONLY); // abab

运行一个进程 会打开三个文件

1 标准输入 stdin FILE* (键盘)

2 标准输出 stdout FILE* (屏幕)

3 标准错误输出 stderr FILE*

PCB中有文件表(指针数组): int fd = open(a.txt) // fd = 3

0

stdin

1

stdout

2

stderr

3

a.txt

每当open(a.txt)打开一个文件,就会在内核中会创建一个数据结构体(struct file),用于表征这个文件

struct file(用来描述文件): r,w(读写权限) count=1(使用该文件人数) inode(节点号,通过节点号可以找到磁盘上存放文件的位置) pos=0(偏移量)

fork()后 子进程将PCB拷贝过来,其中也包括文件表(指针数组)相当于进行了一次浅拷贝,子进程的文件表依然指向原数据结构体,与父进程共享文件偏移量

  • 系统调用---实现在内核中---执行系统调用->陷入内核

库函数---运行在用户空间 printf

printf() -> [---缓冲区---] -> write()


进程替换 PCB(进程控制块)被保留

fork(复制)+exec(替换)

原程序在内存中占用的 全部被释放

进程

  • 128的空间没有去释放free,那么是泄露了还是被系统回收了?

  • 进程执行过程中malloc申请空间,不使用时没有free,就出现没存泄漏.(eg.链表循环malloc节点,使用完后没有free,会内存泄漏)

进程结束后,所有向os申请的内存,都会被释放.

  • 申请1G是否成功?

1 物理内存 剩余空间 大于1G,能成功

2 物理内存 剩余空间 小于1G,但虚拟内存剩余空间和物理内存剩余空间之和大于1G,能成功

[宿舍用盆洗被子,自己一个盆,问同学借几个盆(虚拟内存),洗哪个盆的就要往盆里加水加洗衣液(将运行的部分放到物理内存中)]

虚拟内存是磁盘上的一块空间

  • 32位系统 进程(虚拟)地址空间为4G(理论允许使用4G),一般情况下只占用了一点点[eg. 小A(进程)去吃自助餐被告知里面的东西(4G)全部都可以吃,小B被告知同样的话,但一般情况下只能吃一点点就饱了],上面1G是内核(内核部分进程共享),其余3G是用户可以使用的.malloc是占用堆的空间所有只能malloc<3G的内存. malloc1G时是在进程地址空间中占用1G,操作系统会为这1G空间分配物理内存.在进程地址空间允许的范围内,如果实际的物理内存可以满足,就会malloc申请成功(两个条件都要满足).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值