1.进程和线程的区别与联系是什么?
一个程序至少有一个进程,一个进程至少有一个线程:
进程:一个程序的一次运行,在执行过程中拥有独立的内存单元,而多个线程共享一块内存
线程:线程是指进程内的一个执行单元。
联系:线程是进程的基本组成单位
区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
举例说明:操作系统有多个软件在运行(QQ、office、音乐等),这些都是一个个进程,而每个进程里又有好多线程(比如QQ,你可以同时聊天,发送文件等)
2.移动端开发需遵循的原则
1>复杂的业务逻辑/需要加锁的代码,资源抢夺等业务逻辑交给服务器端处理,减小移动客户端的压力;
2>所有属性都声明为 nonatomic!尽量避免多线程抢夺同一块资源);
3>如果是面向线程对象开发,需要手动管理线程的生命周期(GCD不需要,它是面向任务);
4>所有的耗时操作(所有的网络请求必须放在子线程!/大数据的计算/复杂的计算/文件解压缩操作)必须放在子线程执行!
5>所有的UI操作(刷新数据、处理UI事件)都放在主线程(也叫UI线程,主要是优先保证用户交互);
6>不同线程间的数据交换(线程间通信)需要保证安全,保证执行顺序;
7>线程最多开启6条(3-5条);
1 3.为什么会出现数据安全问题?资源抢夺有哪些解决办法?
1)因为不同的线程同时执行任务,同时访问统一资源。如果异步操作要保证线程安全等问题, 尽量使用GCD(有些函数默认就是安全的)
2)资源抢压解决办法:
1> @synchronized(xx) {...} 互斥锁
2> NSLock 同步锁
3> dispatch_barrior_async 作用是在并行队列中,等待前面两个操作并行操作完成
4> dispatch_semaphore_wait 等待信号:等待有线程结束之后会增加一个信号才继续执行