day12(fork、引入线程后变化(资源、调度等)、进程线程通信方式、调度算法、死锁产生条件)

  1. forward_list 单向链表,deque双端队列,
  2. fork()产生一个新的进程。线程不能跨机器迁移。 同一进程下的线程共享地址空间。
    data section存放全局变量,可以被同一进程下的线程共享。
  3. (1)调度上。传统操作系统上,拥有资源和独立调度的基本单位都是进程。
    引入线程后,线程是独立调度的基本单位,进程是拥有资源的基本单位吗。
    (2)资源上。进程都是拥有资源的基本单位,线程不拥有资源(有一点必不可少的资源),但是线程可以共享棣属于进程的系统资源。
    (3)并发性。引入进程以后,不仅进程可以并发,同一进程的线程也可以并发。
    (4)系统开销。创建和撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。所以操作系统的开销远大于创建或撤销线程的开销。
    (5)地址空间,(6)通信,进程通信需要操作系统,而线程通信可以直接读写进程数据段来进行通信。
  4. Linux 线程间的通信:互斥体(互斥量)、信号量、条件变量。
    Windows进程间通信:管道、共享内存、消息队列、信号量、socket。
    Windows线程间通信:临界区、互斥量、信号量(信号灯)、事件。
    临界区只能用来同步本进程的线程,而互斥量、信号量、事件可以跨进程使用来进行同步数据操作。
    临界区是非内核对象,互斥体是内核对象。临界区和互斥体都可在Windows平台,Linux只能用互斥体。
  5. 典型调度算法中,短作业优先算法(SJF)平均等待时间、平均周转时间最少。
  6. 产生死锁的四个必要条件,互斥条件、不剥夺条件、请求和保持条件、循环等待条件。

day13(extern、auto_ptr等智能指针、fork、静态函数、重载、strcpy、strlen、malloc、rxrc、内存对齐)

  1. extern放在变量或者函数前表示,该函数或者变量已经在其他地方定义。
  2. C++中的四个智能指针。
    智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释 放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。

auto_ptr<类型>对象(赋值)。p2=p1,p1有赋值,这时不会保存,但是再访问p1时会出错,因为存在潜在的内存崩溃问题。
unique_ptr<类型>对象(赋值),pu1=pu2,pu2已经有初值,就会报错。仅为右值赋值时会出错,只能pu1=unique_ptr<>pu2(赋值)。也可以用 pu1=move(pu2),进行赋值。
share_ptr实现共享式拥有概念,多个智能指针可以指向同一个对象。在最后一个引用被销毁时释放相关资源。use_count()返回计数的个数,就是资源所有者的个数。个数为0,释放资源。
wead_ptr是一种不控制对象生命周期的智能指针,主要用来防止share_ptr两个指针相互引用,计数就会一直不为0,出现死锁。
解决内存泄漏,引入了weak_ptr弱指针,他的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,不指向引用计数的共享内存,但可以检测到所管理的对象是否已经被释放,避免了非法访问。

智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。

  1. fork()会创建一个新的进程,几乎与调用fork()的进程一模一样,两个进程都会继续进行。
  2. 静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为使用了虚函数表机制,调用的时候会增加一些内存开销。
  3. 重载,重写:子类继承父类,父类中的函数是虚函数,子类中重新定义了这个虚函数,这种情况就是重写。
  4. strcpy是字符串拷贝函数,因为没有指定长度,可能会拷贝越界,安全版本是strncpy函数。
    strlen函数是计算字符串从开始到’\0’之间字符的个数。
  5. malloc/free是C语言的库函数,对于类类型的对象不会调用构造函数和析构函数。
  6. exec函数可以加载一个elf文件去替代父进程,从此父进程和子进程就可以运行不同的程序了。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1。
    fork从父进程返回子进程的pid,从子进程返回0。
    调用wait的父进程将会发生阻塞,直到有子进程状态发生改变,执行成功返回0,失败返回-1。
  7. 内存对齐
    在C++中规定了空结构体和空类的内存所占大小为1字节,因为规定任何不同的对象不能有相同的地址。
    C语言中空的结构体在内存中所占大小为0。

为什么要内存对齐?

  1. 平台原因(移植问题):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出异常。
  2. 性能原因:数据结构(尤其是栈)应该尽可能的在自然边界上对齐。原因在与,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次。

秋招C++开发学习之路day10相关推荐

  1. 秋招C++开发学习之路day30

    数据库的三大设计范式 第一范式1NF 数据表中的所有字段都是不可分割的原子值. 范式,设计的越详细,对于某些实际操作可能更好,但是也不一定都是好的,所以根据实际的情况来设计. 如:中国四川省成都市高新 ...

  2. android开发学习之路——连连看之游戏逻辑(五)

    GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖, ...

  3. 【求职】小米 2018 秋招测试开发工程师笔试题

    小米 2018 秋招测试开发工程师笔试题 一.单选题 1.静态变量static 在不同的实例中地址是否一样?他们储存在什么区域?( ) A. 地址一样,在堆栈区. B. 地址不一样,在堆栈区. C. ...

  4. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  5. 【求职】京东 2018 秋招测试开发工程师笔试题

    京东 2018 秋招测试开发工程师笔试题 一.单选题 1.若度为m 的哈夫曼树中,其叶结点个数为 n,则非叶结点的个数为( ) A. n-1 B. n/m-1 C. (n-1)/(m-1) D. n/ ...

  6. android开发学习之路——连连看之加载图片(三)

    正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\ dra ...

  7. 寒武纪2019秋招嵌入式软件开发笔试-牛客网刷题

    寒武纪2019秋招嵌入式软件开发岗笔试 1.单片机IO口开漏输出和推挽输出有什么区别? 我答的:单片机的IO口可以配置为开漏输出和推挽输出两种模式,它们的主要区别在于输出方式和驱动能力不同. 开漏输出 ...

  8. 如何看待2022届秋招嵌入式开发岗位薪资大涨?

    目录 最近在网上看到了关于2022届嵌入式开发岗位薪资大涨的帖子,比如说像海康.大华.汇顶.联发科等公司的招聘. 普遍年薪达到25W,甚至有40W的,直逼互联网. 虽然不知道是不是网友吹牛逼的,不过这 ...

  9. 我的数据分析秋招经历和学习心得【万字长文】

    刚刚签掉三方,秋招算是告一段落了. 很早就想写一篇文章了,给明年秋招的同学,以及准备进入数据分析领域的朋友,以期能给你们带来一些小小的帮助. 写这篇文章的主要原因一个就是想做个劝退,另一个是系统地给非 ...

最新文章

  1. 如果你是Python初学者,就从这个开始
  2. SUSE Linux ntp 升级报错(MAKE [1]:*** 【all】Error 2)
  3. jQuery的入口函数
  4. python实现简单的百度翻译
  5. php where or,php – laravel中whereOr和orWhere之间的区别
  6. php安装文档,PHP - Manual: 安装 (官方文档)
  7. ros下的python代码的编写与回调函数
  8. 【Java NIO的深入研究5】字符集Charset
  9. Oracle基础学习(四) 游标
  10. netron安装使用
  11. 浅谈数字音频处理的新技术
  12. 多年未用photoshop后,我忘记了p图(将黑底图片修改为白底)
  13. LAMP系列文章之:泛泛而谈LAMP(一)
  14. 利用棋盘格图案完成相机标定
  15. Python递归小案例,斐波那契,阶乘等小案例
  16. android手机病毒原理,安卓手机病毒的原理是什么
  17. Spring Boot 升级所遇到的坑们s 1.5.x升级到2.1.x
  18. Linux内核- KSM
  19. 微商在微信营销的时候微信封号的原因是什么?
  20. PostgreSQL权限修改 : ALTER DEFAULT PRIVILEGES

热门文章

  1. 干同一份工作,工资为什么比同事低很多?
  2. Redis伪集群搭建
  3. photoshop卸载不彻底--论如何删除ADMUI3.fon
  4. 通过仿淘宝静态网页我的总结
  5. mysql 中的neq_mysql中neq使用Python的Django框架中的压缩组件Django Compressor_MySQL
  6. 前淘宝工程师:12306几乎是一个奇迹
  7. matlab中minigrid,[转载][转载]matlab画地图的工具:worldmap和m_map
  8. 分享一款免费实用的野外调查巡检、户外旅行、外业作业地图数据采集软件
  9. VB作业之生成随机数
  10. nRF24L01的发送性能优化