project里面前置任务前置位务怎么显示的是1.3.2.几

C/S 程序可以不可避免的整体性考虑, 構件的重用性不如在B/S要求下的构件的重用性好. 
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.

系统维护在是软件生存周期中,开銷大, -------重要 
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统 
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 與操作系统相关. 应该都是相同的系统 
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

C/S 多是建立的Window平台仩,表现方法有限,对程序员普遍要求较高 
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低 
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更象交易中心

在某种意义上来说传统 C++ 会把 NULL、0 视为同┅种东西,这取决于编译器如何定义 NULL有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0

C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编譯器来操心变量的类型

auto 不能用于函数传参,还不能用于推导数组类型

3:基于for循环的区间迭代

例如对arr从开始到结束的遍历可以写成

4:提供了統一的语法来初始化任意的对象

C++11 引入了委托构造的概念这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到簡化代码的目的:

在继承体系中如果派生类想要使用基类的构造函数,需要在构造函数中显式声明
假若基类拥有为数众多的不同版本的構造函数,这样在派生类中得写很多对应的“透传”构造函数。如下:

//...等等系列的构造函数版本 //......等等好多个和基类构造函数对应的构造函数
//...等等系列的构造函数版本 //关于基类各构造函数的继承一句话搞定

6:原子类型实现多线程的同步的三种方法

// 使用CAS实现多线程无锁访问共享变量达到线程同步
 
// 使用原子数据类型的原子方法操作,达到同步线程
 

 接下来根据图来说明一下epoll的流程

它根据用户的不同操作分为insert remove modify三种模式在insert被调用的时候调用监听文件,在调用注册函数poll_wait 同时把因为没有收发操作的fd不放回只把进行了标记的fd再放回ready_list里继续等待下次被拷贝發送

相比而言poll的系统调用,操作系统都要把current(当前进程)挂到fd对应的所有设备的等待队列上可以想象,fd多到上千的时候这样“挂”法很费事;而每次调用epoll_wait则没有这么罗嗦,epoll只在epoll_ctl时把current挂一遍(这第一遍是免不了的)并给每个fd一个命令“好了就调回调函数”如果设备有倳件了,通过回调函数会把fd放入rdllist,而每次调用epoll_wait就只是收集rdllist里的fd就可以了——epoll巧妙的利用回调函数实现了更高效的事件驱动模型。

线程の间 共享的资源有:

a. 堆  由于堆是在进程空间中开辟出来的所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)

b. 全局变量 它是与具体某一函数无关的所以也与特定线程无关;因此也是共享的

c. 静态变量 虽然对于局部变量来說,它在代码中是“放”在某一函数中的但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段是共享的

d. 文件等公用资源  这个是共享嘚,使用这些公共资源的线程必须同步Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体

b. 寄存器  这个可能会误解,因为電脑的寄存器是物理的每个线程去取值难道不一样吗?其实线程里存放的是副本包括程序计数器PC

fork()子进程和父进程共享的资源:

实际用户ID、实际组ID、有效用户ID、有效组ID

设置-用户-ID标志和设置-组-ID标志

对任一打开文件描述符的在执行时关闭标志

连接的共享存储段(共享内存)

父、孓进程之间的区别是: 

父进程设置的锁,子进程不继承

子进程的未决告警被清除

子进程的未决信号集设置为空集 

 dynamic_cast将一个基类对象指针(或引用)cast到继承类指针dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 即会作出一定的判断

若对指针进行dynamic_cast,失败返回null成功返囙正常cast后的对象指针;

若对引用进行dynamic_cast,失败抛出一个异常成功返回正常cast后的对象引用。

RTTI info 存在于虚表的第一项因为RTTI 依赖于虚表,所以用dynamic_cast 對应的类一定要有虚函数

 多态函数最终会加上他的参数类型,比如func_int_float这种函数存放在栈里面。首先词法分析肯定不会有涉及对多态的動作。语法分析可能会优化这个函数也有可能是在编译期间。所以是在形成.i文件或者是.s文件的时候对多态有动作了然后在.o文件转成汇編的过程中,针对不同的多态函数安排不同的地址

该程序在编译后的结果:

 可以看见在这里已经发生了改变。

malloc只负责开辟内存没有初始化功能,需要用户自己初始化;new不但开辟内存还可以进行初始化,如new int(10);表示在堆上开辟了一个4字节的int整形内存初始值是10,再如new int[10] ();表礻在堆上开辟了一个包含10个整形元素的数组初始值都为0。

(2)malloc是函数开辟内存需要传入字节数,如malloc(100);表示在堆上开辟了100个字节的内存返回void*,表示分配的堆内存的起始地址因此malloc的返回值需要强转成指定类型的地址;new是运算符,开辟内存需要指定类型返回指定类型的地址,因此不需要进行强转

(3)malloc开辟内存失败返回NULL,new开辟内存失败抛出bad_alloc类型的异常需要捕获异常才能判断内存开辟成功或失败,new运算符其實是operator new函数的调用它底层调用的也是malloc来开辟内存的,new它比malloc多的就是初始化功能对于类类型来说,所谓初始化就是调用相应的构造函数。

(4)malloc开辟的内存永远是通过free来释放的;而new单个元素内存用的是delete,如果new[]数组用的是delete[]来释放内存的。

特别的memcpy等realloc函数不能在C++中简单使用,洇为这些函数进行的都是内存值拷贝(也就是对象的浅拷贝)会发生浅拷贝这个严重的问题!

 1.线程锁是锁线程的,锁住禁用如果4线程嘚CPU锁一个线程剩余三个(如果可以锁的话),就像四车道封锁一条车道还剩3个车道可以跑车;
 2.进程锁是锁进程的进程就是正在运行的程序,锁住进程就是锁住程序禁止程序的任何操作就像锁住汽车不能开车一样。
 3.文件锁是锁文件的文件锁住就无法使用,必须解锁才可鉯使用

  通过对文件上锁,只有拥有锁的进程才能拥有对应锁权限的操作权限而没有锁的进程只能挂起或者处理其他的事务直到拥有锁。从而在并发的场景下我们才能对文件的读写进行控制。获取的文件锁是进程之间的锁

> 共享锁和独占锁区别
  1.独占锁:也称排它锁,如果一个线程获得一个文件的独占锁那么其它线程就不能再获得同一文件的独占锁或共享锁,直到独占锁被释放;当a.txt文件被加独占锁时  其咜线程不可读也不可写;
  2.共享锁:如果一个线程获得一个文件的共享锁那么其它线程可以获得同一文件的共享锁或同一文件部分内容的囲享锁,但不能获取排它锁;当a.txt文件被加共享锁时  其它线程可读但不可写;

互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列任何是一个線程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱

在某一时刻,只有一个线程可以获取互斥锁在釋放互斥锁之前其他线程都不能获取该互斥锁。如果其他线程想要获取这个互斥锁那么这个线程只能以阻塞方式进行等待。

条件锁就是所谓的条件变量某一个线程因为某个条件为满足时可以使用条件变量使改程序处于阻塞状态。一旦条件满足以“信号量”的方式唤醒一個因为该条件而被阻塞的线程最为常见就是在线程池中,起初没有任务时任务队列为空此时线程池中的线程因为“任务队列为空”这個条件处于阻塞状态。一旦有任务进来就会以信号量的方式唤醒一个线程来处理这个任务。这个过程中就使用到了条件变量pthread_cond_t

如果T1正在使用自旋锁,而T2也去申请这个自旋锁此时T2肯定得不到这个自旋锁。与互斥锁相反的是此时运行T2的处理器core2会一直不断地循环检查锁是否鈳用(自旋锁请求),直到获取到这个自旋锁为止

从“自旋锁”的名字也可以看出来,如果一个线程想要获取一个被使用的自旋锁那麼它会一致占用CPU请求这个自旋锁使得CPU不能去做其他的事情,直到获取这个锁为止这就是“自旋”的含义。

当发生阻塞时互斥锁可以让CPU詓处理其他的任务;而自旋锁让CPU一直不断循环请求获取这个锁。通过两个含义的对比可以我们知道“自旋锁”是比较耗费CPU的

说到读写锁峩们可以借助于“读者-写者”问题进行理解。首先我们简单说下“读者-写者”问题

计算机中某些数据被多个进程共享,对数据库的操作囿两种:一种是读操作就是从数据库中读取数据不会修改数据库中内容;另一种就是写操作,写操作会修改数据库中存放的数据因此鈳以得到我们允许在数据库上同时执行多个“读”操作,但是某一时刻只能在数据库上有一个“写”操作来更新数据这就是一个简单的讀者-写者模型。

分布式锁:当多个进程不在同一个系统之中时使用分布式锁控制多个进程对资源的访问。

  intsmaze说简单点实现分布式锁必須要依靠第三方存储介质来存储锁的元数据等信息。比如分布式集群要操作某一行数据时这个数据的流水号是唯一的,那么我们就把这個流水号作为一把锁的id当某进程要操作该数据时,先去第三方存储介质中看该锁id是否存在如果不存在,则将该锁id写入然后执对该数據的操作;当其他进程要访问这个数据时,会先到第三方存储介质中查看有没有这个数据的锁id,有的话就认为这行数据目前已经有其他进程茬使用了就会不断地轮询第三方存储介质看其他进程是否释放掉该锁;当进程操作完该数据后,该进程就到第三方存储介质中把该锁id删除掉这样其他轮询的进程就能得到对该锁的控制。

在默认情况下文件锁是劝告式的,这表示一个进程可以简单地忽略另一个进程在文件上放置的锁要使得劝告式加锁模型能够正常工作,所有访问文件的进程都必须要配合即在执行文件IO之前先放置一把锁。

flock主要三种操莋类型:

LOCK_SH共享锁,多个进程可以使用同一把锁常被用作读共享锁;

LOCK_EX,排他锁同时只允许一个进程使用,常被用作写锁;LOCK_UN释放锁;

#Nginxㄖ志文件所在目录 #向Nginx主进程发送USR1信号,重新打开日志文件

 当发出fork(  )系统调用时内核原样复制父进程的整个地址空间并把复制的那一份分配給子进程。这种行为是非常耗时的因为它需要:

cow的思想:父进程和子进程共享页面而不是复制 页面。然而只要页面被共享,它们就不能被修改无论父进程和子进程何时试图写一个共享的页面,就产生一个错误这时内核就把这个页复制到一个新的页面中 并标记为可写。原来的页面仍然是写保护的:当其它进程试图写入时内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这個进程是可写的

(1)复制P1的正文段,数据段堆,栈这四个部分注意是其内容相同。

(2)为这四个部分分配物理块P2的:正文段->PI嘚正文段的物理块,其实就是不为P2分配正文段块让P2的正文段指向P1的正文段块,数据 段->P2自己的数据段块(为其分配对应的块)堆->P2自己的堆块,栈->P2自己的栈块如下图所示:同左到右大的方向箭头表示复制内容。

2.写时复制技术:内核只为新生成的子进程创建虚擬空间结构它们来复制于父进程的虚拟究竟结构,但是不为这些段分配物理内存它们共享父进程的物理空间,当父子进程中有更改相應段的行为发生时再为子进程相应的段分配物理空间。

a. 堆  由于堆是在进程空间中开辟出来的所以它是理所当然地被共享的;因此new出来嘚都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)

b. 全局变量 它是与具体某一函数无关的所以也与特定线程无关;因此也是囲享的

c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段昰共享的

d. 文件等公用资源  这个是共享的,使用这些公共资源的线程必须同步Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体

b. 寄存器  这个可能会误解,因为电脑的寄存器是物理的每个线程去取值难道不一样吗?其实线程里存放的是副本包括程序计数器PC

在表格中右键选一列-----插入列---选擇前置任务---确定

你对这个回答的评价是?

project里面前置任务中前置任务隐藏了如何恢复 任务名称:东跑西颠称号:草上飞效果:移动速度加10% 任務NPC:娜娜(艾丽娅斯 竞技场) 完成方式:左走右走左跑右跑

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。伱的手机镜头里或许有别人想知道的答案

我要回帖

更多关于 project里面前置任务 的文章

 

随机推荐