Unix C杂谈(笔记)

4 篇文章 0 订阅

内存中地址从小到大各存储域的划分:
代码区,只读常量区,全局区,BSS段,堆,栈。
其中,堆区和栈区没有明显的界限,可以适当调整。
使用malloc申请动态内存的注意事项
1.使用malloc申请动态内存时,可能还需要额外的12字节来存储一些用于管理 动态内存的信息,比如内存的大小等。
2.malloc函数底层采用链表形式去处理多个内存块,也就是需要保存有关下一个内存块/上一个内存块的信息。
3.使用malloc申请的动态内存,千万不要越界访问,因为极有可能破坏管理信息,从而引发段错误。
4.一般来说,使用malloc申请比较小的动态内存时,操作系统会一次性分配33个内存页(目前主流操作系统一个内存页4Kb,即4096字节),从而提高效率。而当申请的内存超过33个内存页时,系统会再次分33个内存页。
UC还有个两个内存专门的函数,sbrk(),brk()函数,根据其参数来确定是申请还是释放内存,还是获取内存当前地址。申请比较小的内存时不像malloc,是默认分配1个内存页。
使用sbrk函数申请内存比较方便,释放内存不太方便;
使用brk函数释放内存比较方便,申请内存不太方便。
free相关
使用free释放动态内存时,释放多少则在动态内存总数中减去多少,当所有内存释放完毕时,进程还保留33个内存页备用,直到进程结束,主要是为了提高效率。
进程
使用fork创建出来的子进程会复制父进程中除了代码区之外的其他内存区域,代码区和父进程共享。
使用vfork创建出来的子进程不会拷贝父进程的内存区域,而是直接占用,导致父进程进入阻塞状态,直到子进程终止,或者调用exec系列函数跳出为止。
所以fork创建的父子进程同时 进行,不一定谁先完成。而vfork创建的一般子进程先完成。
进程的终止:(正常方式)
a.main函数中执行了return 0;
b.调用exit()函数终止了进程;
c.调用_exit()(UC函数)/_Exit()(标C函数)函数;
d.最后一个线程返回;
e.最后一个线程调用了pthread_exit()函数。
非正常方式:
a.采用信号终止进程;
b.最后一个进程线程被其他线程取消。
进程间通信方式:
1.文件
2.信号(注意和信号量不一样)
3.管道:本质是以文件作为媒介来实现进程间通信,该文件叫管道文件,管道分为:
有名管道:一般采用命令创建管道文件,实现任意两个进程之间的通信;
无名管道:一般采用系统函数创建管道文件,用于父子进程之间的通信。
管道文件本身并不会存储传递的数据
4.共享内存:本质上是由内核维护的一块内存区域,共享在两个/多个进程之间,然后两个/多个进程分别对该区域进行读写操作,从而实现通信,是最快的IPC通信方式
使用共享内存通信的基本流程:
1.获取key值,使用ftok函数;
2.创建/获取共享内存,从而得到ID,使用shmget函数;
3.挂接共享内存,使用shmat函数;
4.使用共享内存,进行读写操作等;
5.脱接共享内存,使用shmdt函数;
6.如果不再使用,使用shmctl函数删除共享内存。


5.消息队列:使用不同的进程将发送的数据打包成具体格式的消息,然后将消息放入到消息队列中,使用其他进程从消息队列中取出消息,从而实现进程间通信。
使用消息队列通信的流程:
1.获取key值,使用ftok函数;
2.创建/获取消息队列,使用msgget函数;
3.发送消息/接受消息,使用msgsnd和msgrcv函数;
4.如果不再使用消息队列,使用msgctl函数删除消息队列。


6.信号量集:信号量本质就是一个计数器,用于控制同时访问共享资源的进程数/线程数,也就是说解决有限资源的分配问题 。信号量集表示信号量的集合,也就是多个计数器的集合,用于控制同时访问多种共享资源的进程数/线程数。
信号量的工作方式:
1.先把信号量初始化,初始化为最大值;
2.如果有进程申请到共享资源,那么信号量的值减一;
3.当信号量的值为0时,终止进程对共享资源的申请,让申请共享资源的进程进入阻塞状态;
4.如果有进程释放资源,那么信号量的值加一;
5.当信号量的值大于0时,阻塞的进程可以继续抢占资源,抢占不到资源的进程继续进入阻塞状态等待。
使用信号量集通信的流程:
1.获取key值,使用ftok函数;
2.创建/获取信号量集,使用semget函数;
3.初始化信号量集,使用semctl函数;
4.操作信号量集,使用semop函数;
5.如果不再使用则删除,使用semctl函数。


7.网络

线程
进程是重量级单位,每个进程都需要独立的内存空间,启动新的进程很消耗资源,而线程是轻量级单位,线程共享所在进程的内存空间,但是每个线程都有一块很小的独立栈区。
线程同步
多线程共享进程中资源,多个线程同时访问相同的共享资源时,需要相互协调,以避免出现数据的不一致和混乱问题,而线程之间的协调和通信叫做线程的同步问题。线程中提供了互斥量(互斥锁)机制来实现线程的同步。
信号量:本质就是一个计数器,主要用于控制同时访问共享资源的进程数/线程数,当信号量的值是1时,效果等同于互斥量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNIX环境高级编程笔记是关于在UNIX系统中进行高级编程的一些笔记和技巧的记录。这些笔记主要涉及文件I/O和进程管理等方面的内容。在UNIX系统中,文件I/O是通过文件描述符来进行操作的。文件描述符是一个整数,用来标识打开的文件。为了实现跨平台的兼容性,可以使用POSIX标准来进行文件操作。POSIX是一个操作系统接口的标准,它以UNIX为基础,但并不限于UNIX类系统。此外,Single UNIX Specification简称SUS,它是POSIX.1标准的一个超集,定义了UNIX系统的实现标准。在UNIX系统中,进程的初始化是由init进程来完成的。init进程会读取文件/etc/ttys,并根据其中定义的终端设备进行处理。对于每个允许登录的终端设备,init进程会调用fork函数生成一个子进程,并通过exec函数执行getty程序来处理该终端设备。通过这些技巧和方法,可以实现在UNIX环境下进行高级编程的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UNIX环境高级编程笔记](https://blog.csdn.net/qq_55537010/article/details/127837953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [《UNIX环境高级编程》学习笔记](https://blog.csdn.net/qq_42526420/article/details/123143423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值