一、进程和线程的区别
- 定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配的调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源。只拥有一点在运行中必不可少的资源(如程序计数器。一组寄存器和栈)。但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。 - 关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
相对进程而言,线程是一个更加接近于执行体的概念,他可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 - 区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于进程死掉,所以多进程的程序比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1)简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
2)线程的划分尺度小于进程,使得多线程程序的并发性高。
3)另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而及大地提高了程序的运行效率。
4)线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5)从逻辑角度来看,多线程的意义在于一个应用程序中、有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用、来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4.优缺点
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
二、TCP与UDP区别
这是两个工作在TCP/IP协议传输层的两个不同的协议,是用来传输数据的。
TCP:Transfer Control Protocol,传输控制协议。
这是一个全双工的、面向连接的、可靠的并且是精确控制的协议。
主要是用在那些实时性不强、但要求不能出错的应用。比如说,网页浏览、文件的下载(不是BT、电驴下载)、邮件的收发等场合,就需要TCP协议进行传输(因为不会出错)。
当然,它在网络方面的开销是昂贵的。
UDP:User Datagram Protocol,用户数据报协议。
这是一个不可靠的传输协议。因为它不排序所要发送的数据段,不关心这些数据段到达木地方的顺序(所以它才不可靠),所以它在网络的开销要比TCP小很多。因此UDP适合用在那些实时性强、允许出错的场合。
比如说:及时通信(MSN、QQ),视频,语音等方面
三、TCP流量控制
滑动窗口机制
比如发送端能发送5个数据,接收端也能接收到5个数据,给个确认(ack)给发送端、确认我收到5个数据。如果网络通信出现繁忙或者拥塞的时候,接收端只能收3个数据,接收端给个确认我只能收3个数据,那么发送端就自动调整发送的窗口为3,当线路又恢复通畅的时候,接收端又可以收到5个数据,那他就会发确认给发送端,告诉他我的窗口为5,那发送端就把窗口又调整为5,这样进行流量控制的
比如说发送端窗口为3,发送到接收端、接收端的接收窗口为5的话,接收数据、并且会给发送端一个ack(确认)告诉发送端我的窗口为5,发送端收到确认后会把自己的发送端窗口调整为5,这样就可以加速数据传输了。
四、数组和链表的区别
二者都属于一种数据结构
从逻辑结构来看
- 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
2.链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其他数据项、非常繁琐)链表必须根据Next指针找到下一个元素
从内存存储来看
1.(静态)数组从栈中分配空间,对于程序员方便快捷,但是自由度小
2.链表从堆中分配空间,自由度大但是申请管理比较麻烦
从上面额比较可以看出,如果需要快速访问数据、很少或不插入和删除元素,就应该用数组;
相反,如果需要经常插入和删除元素就需要用链表数据结构了。
五、UIView生命周期
- 大体流程:
(loadView/nib)文件来加载view到内存-->viewDidLoad函数进一步初始化这些view-->内存不足时,调用viewDidUnload函数释放view-->当需要使用view时又回到第一步
loadView:
永远不要主导调用这个函数。
viewController会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数,切不要在重载的时候调用[super loadView]。
viewDidLoad:
这个函数的作用主要是让你可以进一步的初始化你的views。
viewDidLoad通常负责的是view及其子view被加载进内存之后的数据初始化的工作,即视图的数据部分的初始化
viewDidUnLoad:
这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放它的view以及view相关的对象。由于controller通常保存着view以及相关的object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收,但不要释放那些难以重建的数据。
viewWillAppear:
视图即将可见时调用,默认情况下不执行任何操作。
viewDidAppear:
视图已完全过渡到屏幕上时调用
viewWillDisappear:
视图被驳回时调用,覆盖或以其他方式隐藏,默认情况下不执行任何操作
viewDidDisappear:
视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
didReceiveMemoryWarning:
当程序内存过度时,系统会调用该方法
- Controller和View的生命周期
这里指的是View是指Controller的View。它作为Controller的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。
当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view已经创建好了。
当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisappear,而之后会调用viewDidDisappear。
当view不再使用,而且是disappeared,受到内存警告是,那么viewController会将view释放并将其指向nil.
网友评论